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

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来批量生成配置,避免手动替换字符串:

  1. 先准备基础的Kustomize配置:
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:01:35