从云构建将 django 部署到 GAE 标准

Deploy django to GAE standard from cloud build

我 运行 按照 bash 来自本地计算机的命令将 django 项目部署到 App 引擎。

python manage.py migrate
python manage.py collectstatic --noinput
gsutil rsync -R static/ gs://xyz4/static
gcloud config set project project_name_1
gcloud app deploy --quiet

我想在云构建上进行设置。我在云构建上启用了 PUSH 触发器。在创建 cloudbuild.yaml 文件

方面需要帮助

CloudBuild 不支持 VPC,因此不能用于迁移到私有云 sql -

以下是我将代码从 Github 存储库部署到 App Engine 标准时使用的步骤。每一步都依赖于上一步运行成功。

  • 创建 python venv 并安装所有依赖项
  • 安装 gcloud 代理并使其可执行
  • 开启代理,激活venv,运行测试,如果测试通过则进行迁移,收集静态文件
  • 将静态文件上传到 public 存储桶
  • 将代码部署到 GAE 标准

cloudbuild.yaml:

  - id: setup-venv
    name: python:3.8-slim
    timeout: 100s
    entrypoint: sh
    args:
      - -c
      - '(python -m venv my_venv && . my_venv/bin/activate && pip install -r requirements.txt && ls)'
    waitFor: [ '-' ]

  - id: proxy-install
    name: 'alpine:3.10'
    entrypoint: sh
    args:
      - -c
      - 'wget -O /workspace/cloud_sql_proxy https://storage.googleapis.com/cloudsql-proxy/v1.21.0/cloud_sql_proxy.linux.amd64 &&  chmod +x /workspace/cloud_sql_proxy'
    waitFor: [ 'setup-venv' ]

  - id: run-tests-with-proxy
    name: python:3.8-slim
    entrypoint: sh
    args:
      - -c
      - '(/workspace/cloud_sql_proxy -dir=/workspace -instances="<instance_name>=tcp:3306" & sleep 2) && (. my_venv/bin/activate && python manage.py test --noinput && python manage.py migrate && python manage.py collectstatic --noinput )'
    waitFor: [ 'proxy-install' ]
    env:
      - 'CLOUD_BUILD=1'
      - 'PYTHONPATH=/workspace'

  # if tests fail, these sections wont execute coz they waitFor tests section
  - id: upload-static-to-bucket
    name: 'gcr.io/cloud-builders/gsutil'
    entrypoint: 'bash'
    args: [ '-c', 'gsutil rsync -R ./static/ gs://<bucket_name>/static' ]
    waitFor: [ 'run-tests-with-proxy' ]

  - id: deploy
    name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'bash'
    args: [ '-c', 'gcloud app deploy --quiet' ]
    waitFor: [ 'upload-static-to-bucket' ]

改进空间:

  • 如何将 args 分成多行而不是所有内容都在一行中
  • 如果在 cloudbuild 上的本地 postgres 实例而不是生产云 sql 实例上测试 运行,那就太好了。我能够创建一个 postgres 实例,但它没有在后台 运行,因此当 运行ning 测试时我的代码无法连接到这个本地实例

postgres 在 cloudbuild.yaml:

- id: setup-postgres
  name: postgres
  timeout: 500s
  waitFor: [ '-' ]
  env:
    - 'POSTGRES_PASSWORD=password123'
    - 'POSTGRES_DB=aseem'
    - 'POSTGRES_USER=aseem'
    - 'PGPORT=5432'
    - 'PGHOST=127:0:0:1'
    

使用 worker pools 在自定义 VPC 上对 运行 的 Cloud Build 支持。

您可以创建工作池来访问 VPC 中的资源。如果您将在构建时访问,您必须在您的工作池设置中单击“分配外部 IP”,并且您必须在您的 cloudbuild yaml 中使用以下代码:

options: 
  pool:
    name: "projects/${PROJECT_ID}/locations/${_REGION}/workerPools/${_WORKER_POOL}"

substitutions:
  _REGION: 'your_region'
  _WORKER_POOL: 'your_pool_name'

如果您需要知道您的出站 IP,您可以从 Cloud Nat 访问它,如果您有出站防火墙规则,您必须分配一个专用 IP。