在 GCP 云构建上构建 Django 项目

Building Django-Projects on GCPs Cloud-Build

最近,我们开始着手将已建立的 Django 项目从 docker 堆栈转换为 Google App Engine。途中,Google Cloud Build 竟然派上了用场。 Cloudbuild 负责一些准备推出的项目,特别是应用程序的前端部分。

现在谈到 python 和 Django 特定任务时,显而易见的选择也是求助于 cloudbuild。因此,我们尝试遵循 Google 用他们的官方 NPM 云构建器 (here)

解释的模式

我们面临的问题如下。使用官方 python 镜像构建时,构建步骤设置如下:

steps:
[...]
   8 - name: 'python:3.7'                                                                                                                               
   9   entrypoint: python3                                                           
  10   args: ['-m', 'pip', 'install', '-r', 'requirements.txt']                      
  11 - name: 'python:3.7'                                                            
  12   entrypoint: python3                                                           
  13   args: ['./manage.py', 'collectstatic', '--noinput']

这对于安装所有要求的第一步来说效果很好。 GAE 在部署应用程序时也会这样做,但这里有必要从存储库中 collectstatic 并安装 django 应用程序,然后再上传它们。

虽然第一步通过上述操作成功,但第二步失败并出现以下错误:

File "./manage.py", line 14, in <module>
) from exc
ImportError: Couldn't import Django. Are you sure it's installed and 
available on your PYTHONPATH environment variable? Did you forget to 
activate a virtual environment?

有没有更好的方法来处理这种情况?

/workspace 目录之外的任何内容都不会在构建之间保留,因此您正在安装的要求不会进入第二步。来自 "Creating Custom Build Steps":

A custom build step runs with the source mounted under /workspace, and is run with a working directory somewhere in /workspace. Any files left in /workspace by a given build step are available to other build steps, whether those steps are run concurrently or subsequently.

解决此问题的一种方法是将它们安装到当前目录中:

- name: 'python:3.7'                                                                                                                               
  entrypoint: python3                                                               
  args: ['-m', 'pip', 'install', '-t', '.', '-r', 'requirements.txt']                      
- name: 'python:3.7'                                                            
  entrypoint: python3                                                           
  args: ['./manage.py', 'collectstatic', '--noinput']

同样,也可以创建一个虚拟环境,并为每个需要安装依赖项的步骤激活它。

不需要直接在工作区文件夹中安装需求包。 您可以在安装要求时使用 --user 标志。 使用 --user 时,它将在构建步骤之间保留包。

当您直接在文件夹中安装包时,您将使用应用程序部署上传它们,使您的上传比需要的更大。

你可以使用类似这样的东西。

- name: 'python:3.7'
  entrypoint: python3
  args: ['-m', 'pip', 'install','-r','requirements.txt', '--user']
  id: pip_install
- name: 'python:3.7'                                                            
  entrypoint: python3                                                           
  args: ['./manage.py', 'collectstatic', '--noinput']
  waitFor:
      - pip_install