GCP cloudbuild.yaml:kmsKeyName 需要硬编码值。我们如何适应不同的环境?
GCP cloudbuild.yaml: kmsKeyName requires hardcoded value. How can we adapt for separate environments?
我们有两个独立的 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'
这不适合像我们正在使用的那样的持续部署过程,因为我们希望 kmsKeyName 字符串根据我们的开发或生产环境动态设置为相关的项目 ID 值正在部署到。
有没有办法让我们动态指定 kmsKeyName?
更新:
我们找到了一个 quick/dirty 解决方案,它是创建单独的 cloudbuild.yaml 文件:一个用于开发 (cloudbuild-dev.yaml) 和一个用于生产 (cloudbuild-prod.yaml)。除了我们指定硬编码 "secrets" 信息的最后一部分外,每个 cloudbuild 文件都是相同的。
说明:GCP Cloud Build 依赖于每个环境构建的单独触发器,每个触发器都可以配置为指向特定的 cloudbuild yaml 文件,这就是我们所做的。开发构建触发点在 cloudbuild-dev.yaml,生产触发点在 cloudbuild-prod.yaml.
确实,我尝试了不同的配置,包括简单引号、双引号、不带替换变量、...
无聊的解决方案是使用here所述的手动解码。但是你可以根据需要使用变量和替换变量
无聊的部分是你必须在每个需要它的步骤中注入秘密,就像那样(例如作为环境变量):
- name: "gcr.io/$PROJECT_ID/firebase"
entrypoint: "bach"
args:
- "-c"
- "export FIREBASE_TOKEN=$(cat secrets.json) && firebase deploy --only firestore:rules"
我不知道其他解决方法
我们有两个独立的 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'
这不适合像我们正在使用的那样的持续部署过程,因为我们希望 kmsKeyName 字符串根据我们的开发或生产环境动态设置为相关的项目 ID 值正在部署到。
有没有办法让我们动态指定 kmsKeyName?
更新: 我们找到了一个 quick/dirty 解决方案,它是创建单独的 cloudbuild.yaml 文件:一个用于开发 (cloudbuild-dev.yaml) 和一个用于生产 (cloudbuild-prod.yaml)。除了我们指定硬编码 "secrets" 信息的最后一部分外,每个 cloudbuild 文件都是相同的。 说明:GCP Cloud Build 依赖于每个环境构建的单独触发器,每个触发器都可以配置为指向特定的 cloudbuild yaml 文件,这就是我们所做的。开发构建触发点在 cloudbuild-dev.yaml,生产触发点在 cloudbuild-prod.yaml.
确实,我尝试了不同的配置,包括简单引号、双引号、不带替换变量、...
无聊的解决方案是使用here所述的手动解码。但是你可以根据需要使用变量和替换变量
无聊的部分是你必须在每个需要它的步骤中注入秘密,就像那样(例如作为环境变量):
- name: "gcr.io/$PROJECT_ID/firebase"
entrypoint: "bach"
args:
- "-c"
- "export FIREBASE_TOKEN=$(cat secrets.json) && firebase deploy --only firestore:rules"
我不知道其他解决方法