基于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
相关产品推荐
相关产品推荐

