Cloud Build循环部署异常:仅创建一个Deployment,如何实现多部署?
问题:使用Cloud Build + Cloud Deploy创建多Deployment失败,仅生成第一个
我尝试通过Cloud Build和Cloud Deploy在GKE集群中创建多个Deployment,相关配置如下:
配置文件内容
cloudbuild.yaml
steps: - name: "gcr.io/cloud-builders/gcloud" entrypoint: 'bash' args: - '-c' - | while IFS= read -r deplname; do sed -i "s/service/$$deplname/g" ./test/deployment.yaml release_name=$$(echo "build-$$RANDOM") gcloud deploy releases create $$release_name --project=PROJECT_ID --region=us-central1 --delivery-pipeline=test-cloud-deploy --source=. --images=test-cloud-deploy=us-central1-docker.pkg.dev/PROJECT_ID/cicd-test/test-image:v1 done < ./consumer_names.txt options: logging: CLOUD_LOGGING_ONLY
consumer_names.txt
deployment-name1 deployment-name2
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: service spec: selector: matchLabels: app: service template: metadata: labels: app: service spec: containers: - name: service image: nginx ports: - containerPort: 80
当前仅成功创建了deployment-name1,第二个Deployment未生成,请问如何实现多部署?
问题原因
核心问题在于循环中直接修改了原始的deployment.yaml文件:
第一次循环时,sed -i把文件里所有的service替换成了deployment-name1;第二次循环执行时,文件里已经没有service这个字符串可以替换,导致第二次发布使用的还是已经修改过的Deployment模板,自然不会生成新的deployment-name2资源。
解决方案
方案1:使用临时文件避免修改原模板
每次循环先复制原始模板到临时文件,再修改临时文件,确保每次发布都基于干净的模板:
修改后的cloudbuild.yaml:
steps: - name: "gcr.io/cloud-builders/gcloud" entrypoint: 'bash' args: - '-c' - | # 先复制原始模板到临时目录保存 mkdir -p ./temp cp ./test/deployment.yaml ./temp/base-deployment.yaml while IFS= read -r deplname; do # 每次循环复制干净的模板到工作文件 cp ./temp/base-deployment.yaml ./test/deployment-temp.yaml # 修改临时工作文件 sed -i "s/service/$$deplname/g" ./test/deployment-temp.yaml # 替换为Cloud Deploy需要的文件名 mv ./test/deployment-temp.yaml ./test/deployment.yaml release_name=$$(echo "build-$$RANDOM") gcloud deploy releases create $$release_name --project=PROJECT_ID --region=us-central1 --delivery-pipeline=test-cloud-deploy --source=. --images=test-cloud-deploy=us-central1-docker.pkg.dev/PROJECT_ID/cicd-test/test-image:v1 done < ./consumer_names.txt # 清理临时文件 rm -rf ./temp options: logging: CLOUD_LOGGING_ONLY
方案2:使用Kustomize管理多Deployment(更规范)
如果需要创建大量类似的Deployment,推荐用Kustomize来批量生成配置,避免手动替换字符串:
- 先准备基础的Kustomize配置:
# kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - deployment.yaml
- 修改Cloud Build步骤,通过Kustomize生成不同的Deployment:
steps: - name: "gcr.io/cloud-builders/gcloud" entrypoint: 'bash' args: - '-c' - | while IFS= read -r deplname; do # 生成临时kustomize配置,指定Deployment名称前缀 cat > ./kustomization-temp.yaml <<EOF apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ./test/deployment.yaml namePrefix: $$deplname- EOF # 构建配置到目标文件 kustomize build -o ./test/deployment.yaml release_name=$$(echo "build-$$RANDOM") gcloud deploy releases create $$release_name --project=PROJECT_ID --region=us-central1 --delivery-pipeline=test-cloud-deploy --source=. --images=test-cloud-deploy=us-central1-docker.pkg.dev/PROJECT_ID/cicd-test/test-image:v1 rm ./kustomization-temp.yaml done < ./consumer_names.txt options: logging: CLOUD_LOGGING_ONLY
(注:需确保Cloud Build环境安装了kustomize,或使用包含kustomize的镜像)
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

