基于Cloud Build-Cloud Deploy-Cloud Run的主分支发布流水线配置问题
解决方案:基于Google无服务器服务的完整发布流水线配置
你的整体架构思路完全正确:通过GitHub主分支触发Cloud Build完成构建、测试、镜像推送,再通过Cloud Deploy分阶段部署到Cloud Run的测试、预发布、生产环境,这套流程完全适配Google无服务器生态。问题出在错误使用了Rollout资源——它是Cloud Deploy自动生成的内部资源,无需手动创建,正确的方式是通过创建Release触发部署流水线。
一、提前配置Cloud Deploy基础资源
首先需要一次性创建Cloud Deploy的核心配置(Delivery Pipeline和各环境Target),这些资源不需要每次构建都重复创建。
1. 定义Delivery Pipeline(delivery-pipeline.yaml)
这个文件描述发布流水线的阶段划分(测试→预发布→生产),以及各阶段的审批规则:
apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-delivery-pipeline namespace: default spec: stages: - name: deploy-to-test targetId: test-target - name: deploy-to-staging targetId: staging-target requiresApproval: true # 预发布环境需手动审批 - name: deploy-to-prod targetId: prod-target requiresApproval: true # 生产环境需手动审批
2. 定义测试环境Target(target-test.yaml)
每个Target对应一个Cloud Run部署环境,这里以测试环境为例:
apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: test-target namespace: default spec: run: location: europe-west3 service: my-server # 你的Cloud Run服务名称
预发布、生产环境的Target配置可复制上述文件,修改name、location和service字段即可。
3. 初始化Cloud Deploy资源
在本地或Cloud Shell执行以下命令创建上述资源:
gcloud deploy apply --file=delivery-pipeline.yaml --region=europe-west3 gcloud deploy apply --file=target-test.yaml --region=europe-west3 # 重复执行创建预发布、生产环境的Target
二、修改Cloud Build配置(cloudbuild.yaml)
替换原有的Rollout部署步骤,改为创建Cloud Deploy Release,同时补充单元测试步骤、使用提交哈希作为镜像标签(避免latest标签覆盖问题):
steps: # 执行单元测试(根据你的技术栈调整镜像和命令) - name: 'node:18' args: ['npm', 'test'] id: 'run-unit-tests' # 构建Docker镜像 - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/my-project/my-server:$COMMIT_SHA', '.'] id: 'build-image' waitFor: ['run-unit-tests'] # 推送镜像到容器 registry - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/my-project/my-server:$COMMIT_SHA'] id: 'push-image' waitFor: ['build-image'] # 创建Cloud Deploy Release,触发测试环境部署 - name: 'gcr.io/cloud-builders/gcloud' args: [ 'deploy', 'releases', 'create', 'release-$COMMIT_SHA', '--delivery-pipeline=my-delivery-pipeline', '--region=europe-west3', '--images=my-server=gcr.io/my-project/my-server:$COMMIT_SHA' ] id: 'create-cloud-deploy-release' waitFor: ['push-image']
三、流水线运行流程说明
代码合并到GitHub main分支后,自动触发Cloud Build执行上述步骤:
- 先跑单元测试,失败则终止流水线
- 构建并推送带唯一提交哈希的镜像
- 创建Cloud Deploy Release,自动触发测试环境的Cloud Run部署
测试环境验证通过后,可通过以下方式推广到后续环境:
- 在Cloud Console的Cloud Deploy界面手动审批并推广
- 使用命令行:
gcloud deploy releases promote release-$COMMIT_SHA --delivery-pipeline=my-delivery-pipeline --region=europe-west3 --to-stage=deploy-to-staging
四、权限说明
确保Cloud Build服务账号拥有以下关键角色:
roles/clouddeploy.releaser:创建和管理Cloud Deploy Releaseroles/run.developer:部署Cloud Run服务roles/storage.admin:推送镜像到容器Registry
内容的提问来源于stack exchange,提问作者samkass
相关产品推荐
相关产品推荐

