google-cloud-platform - 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。
解决方案
事实上,我尝试了不同的配置,包括简单引号、双引号、不带替换变量、......
无聊的解决方案是使用此处描述的手动解码。但是您可以根据需要使用变量和替换变量
无聊的部分是你必须在每个需要它的步骤中注入秘密,就像那样(例如作为环境变量):
- name: "gcr.io/$PROJECT_ID/firebase"
entrypoint: "bach"
args:
- "-c"
- "export FIREBASE_TOKEN=$(cat secrets.json) && firebase deploy --only firestore:rules"
我不知道其他解决方法
推荐阅读
- pytest - 将参数传递给 pytest 夹具以进行拆卸
- php - laravel 不会覆盖 publich 命令上的文件
- css - 在 VS 代码中更改颜色 CSS/SASS?
- reactjs - 使用 useReducer 时出现意外的渲染循环(并且没有 useEffect)
- angular - SPA 页面的安全性如何?
- sql - 根据另一列的最大值从表中选择列
- google-chrome - 如何将网络面板和来源面板并排放置在一起?
- excel - 通过在工作表 vba_excel 中搜索添加和删除组合框中的项目(建议)
- c# - 图像为 base64 的 RazorPage 不渲染图像
- python - else 在 for 循环之外,如果是,为什么 else 没有执行?