You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Cloud Run的Django应用PR自动部署预览及临时PostgreSQL需求

实现Cloud Run上Django应用的PR预览+临时数据库方案

针对你的场景,要实现PR触发的独立预览环境(含专属临时数据库),可以按以下步骤落地:

一、选配合适的临时数据库

优先选择与生产环境一致的关系型数据库,避免环境差异:

  • Cloud SQL 按需临时实例:为每个PR创建独立的PostgreSQL/MySQL实例,命名规则包含PR编号(如pr-123-db),配置为按需计费模式,闲置时自动停止以控制成本。创建时可从Stage数据库快照克隆基础数据,保证预览环境数据贴近真实场景。
  • Serverless Cloud SQL:利用Serverless模式的自动扩缩容、闲置暂停特性,无需手动管理实例状态,更适合临时预览场景。

二、用GitHub Actions实现自动化流程

以GitHub Actions为例,绑定PR事件完成全流程自动化:

1. 工作流触发条件

name: PR Preview Deployment
on:
  pull_request:
    types: [opened, synchronize, closed]

2. 核心执行步骤

(1)构建并推送带PR标签的镜像

- name: Build & Push Image
  if: github.event.action != 'closed'
  run: |
    gcloud auth configure-docker
    docker build -t gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-app:pr-${{ github.event.number }} .
    docker push gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-app:pr-${{ github.event.number }}

(2)创建临时Cloud SQL实例

- name: Create Temporary Cloud SQL Instance
  if: github.event.action != 'closed'
  run: |
    gcloud sql instances create pr-${{ github.event.number }}-db \
      --region us-central1 \
      --database-version POSTGRES_15 \
      --cpu 1 \
      --memory 3840MiB \
      --root-password ${{ secrets.DB_TEMP_PASSWORD }} \
      --database-name myapp_db \
      --user myapp_user --password ${{ secrets.DB_TEMP_PASSWORD }} \
      --enable-auto-backup false \
      --delete-protection false

(3)执行Django数据库迁移

- name: Run Django Migrations
  if: github.event.action != 'closed'
  run: |
    docker run --rm \
      -e DATABASE_URL="postgres://myapp_user:${{ secrets.DB_TEMP_PASSWORD }}@//cloudsql/${{ secrets.GCP_PROJECT_ID }}:us-central1:pr-${{ github.event.number }}-db/myapp_db" \
      gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-app:pr-${{ github.event.number }} \
      python manage.py migrate

(4)部署Cloud Run预览服务

- name: Deploy to Cloud Run
  if: github.event.action != 'closed'
  run: |
    gcloud run deploy pr-${{ github.event.number }}-app \
      --image gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-app:pr-${{ github.event.number }} \
      --region us-central1 \
      --add-cloudsql-instances ${{ secrets.GCP_PROJECT_ID }}:us-central1:pr-${{ github.event.number }}-db \
      --set-env-vars DATABASE_URL="postgres://myapp_user:${{ secrets.DB_TEMP_PASSWORD }}@//cloudsql/${{ secrets.GCP_PROJECT_ID }}:us-central1:pr-${{ github.event.number }}-db/myapp_db" \
      --allow-unauthenticated

(5)在PR中添加预览链接

- name: Add Preview Link to PR
  if: github.event.action != 'closed'
  uses: actions/github-script@v6
  with:
    script: |
      const url = `https://pr-${{ github.event.number }}-app-${{ secrets.GCP_PROJECT_ID }}.a.run.app`;
      github.rest.issues.createComment({
        issue_number: context.issue.number,
        owner: context.repo.owner,
        repo: context.repo.repo,
        body: `✅ Preview environment ready: [${url}](${url})`
      });

3. 自动清理临时资源

当PR关闭/合并时,自动删除对应的Cloud Run服务和Cloud SQL实例:

- name: Cleanup Preview Resources
  if: github.event.action == 'closed'
  run: |
    gcloud run services delete pr-${{ github.event.number }}-app --region us-central1 --quiet
    gcloud sql instances delete pr-${{ github.event.number }}-db --region us-central1 --quiet

三、关键注意事项

  • 权限配置:确保GitHub Actions使用的GCP服务账号拥有Cloud Run Admin、Cloud SQL Admin、Storage Admin权限。
  • 成本控制:给Cloud SQL实例设置闲置超时(Serverless模式默认支持),避免不必要的计费;同时开启删除保护禁用,确保清理流程能正常执行。
  • 数据初始化:如果需要填充测试数据,可在迁移后执行python manage.py loaddata命令,从JSON/CSV文件导入测试数据集。

内容的提问来源于stack exchange,提问作者Edgar Derby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:30:47