首页 > 解决方案 > GCP cloudbuild.yaml:kmsKeyName 需要硬编码值。我们如何适应不同的环境?

问题描述

我们有两个独立的 GCP 项目(一个用于开发,一个用于生产)。我们正在使用 CloudBuild 来部署我们的项目,方法是利用 repo-mirroring 和 CloudBuild 触发器,该触发器在 dev 或 prod 分支更新时触发。cloudbuild.yaml 文件如下所示:

# Firestore security rules deploy
- name: "gcr.io/$PROJECT_ID/firebase"
  args: ["deploy", "--only", "firestore:rules"]
  secretEnv: ['FIREBASE_TOKEN']

# Firestore indexes deploy
- name: "gcr.io/$PROJECT_ID/firebase"
  args: ["deploy", "--only", "firestore:indexes"]
  secretEnv: ['FIREBASE_TOKEN']

secrets:
- kmsKeyName: 'projects/my-dev-project/locations/global/keyRings/ci-ring/cryptoKeys/deployment'
  secretEnv:
    FIREBASE_TOKEN: 'myreallylongtokenstring'

timeout: "1600s"

我们遇到的问题是 kmsKeyName 显然需要硬编码才能让 GCP 读取它,这意味着我们不能这样做:

secrets:
- kmsKeyName: 'projects/$PROJECT_ID/locations/global/keyRings/ci-ring/cryptoKeys/deployment'
  secretEnv:
    FIREBASE_TOKEN: 'myreallylongtokenstring'

这不适合像我们正在使用的持续部署过程,因为我们希望根据我们部署到的开发或生产环境,使用相关的项目 ID 值动态设置 kmsKeyName 字符串。

有没有办法让我们动态指定kmsKeyName?

更新: 我们找到了一个快速/肮脏的解决方案,即创建单独的 cloudbuild.yaml 文件:一个用于开发(cloudbuild-dev.yaml),一个用于生产(cloudbuild-prod.yaml)。除了我们指定硬编码的“秘密”信息的最后一部分之外,每个 cloudbuild 文件都是相同的。说明:GCP Cloud Build 依赖于每个环境构建的单独触发器,并且每个触发器都可以配置为指向特定的 cloudbuild yaml 文件,这就是我们所做的。开发构建触发点位于 cloudbuild-dev.yaml,生产触发点位于 cloudbuild-prod.yaml。

标签: google-cloud-platformyamlgoogle-cloud-build

解决方案


事实上,我尝试了不同的配置,包括简单引号、双引号、不带替换变量、......

无聊的解决方案是使用此处描述的手动解码。但是您可以根据需要使用变量和替换变量

无聊的部分是你必须在每个需要它的步骤中注入秘密,就像那样(例如作为环境变量):

- name: "gcr.io/$PROJECT_ID/firebase"
  entrypoint: "bach"
  args: 
    - "-c"
    - "export FIREBASE_TOKEN=$(cat secrets.json) && firebase deploy --only firestore:rules"

我不知道其他解决方法


推荐阅读