如何通过Google Cloud Build中的步骤设置环境或替换变量?

JJC*_*JJC 10 docker google-cloud-platform kubernetes google-cloud-build

基本上,在使用Google Cloud Build时,如何读取在后续步骤中先前构建步骤中写入的值?

具体来说,我想制作一个基于时间戳和$ SHORT_SHA组合的自定义图像标签。如下所示。但是,它不起作用,因为docker抱怨“导出”,即使起作用,它也可能是另一个env:

  # Setting tag in a variable:
  - name: 'ubuntu'
    args: ['export', '_BUILD_TAG=`date', '-u', '+%Y%m%dT%H%M%S_$SHORT_SHA`']
Run Code Online (Sandbox Code Playgroud)

然后,在后续步骤中:

  # Using tag from the variable:
  - name: gcr.io/cloud-builders/docker
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/$_BUILD_TAG', '.']
Run Code Online (Sandbox Code Playgroud)

那么,如何使用一步的输出呢?我可以将的内容写到date文件中,然后读取它,但是我回到不知道如何从读取的文件中设置变量(或者以其他方式插值其结果以构成docker build的参数)。

JJC*_*JJC 8

我从未找到一种在一个构建步骤中设置环境变量的方法,该方法可以在其他步骤中读取,但是我最终通过以以下方式建立康斯坦丁的答案来达到相同的效果:

在早期的步骤中,我生成基于​​日期的标记并将其写入文件。文件系统(/ workspace)在步骤之间保留,并用作环境变量的存储。然后,在需要引用该值的每个步骤中,我都会将该文件放在适当的位置。诀窍是使用sh或bash作为每个容器中的入口点,以便可以执行从文件读取的子shell。

这是一个例子:

## Set build tag and write to file _TAG
- name: 'ubuntu'
  args: ['bash', '-c', 'date -u +%Y%m%dT%H%M_$SHORT_SHA > _TAG']

...

# Using the _TAG during Docker build:
- name: gcr.io/cloud-builders/docker
entrypoint: sh
args: ['-c', 'docker build -t gcr.io/$PROJECT_ID/image_name:$(cat _TAG) .']
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,如果您是在JSON对象或需要双引号的内容中以这种方式进行bash插值,则需要subshel​​l调用在容器中执行时永远不被单引号引起来, ,这可能需要转义内部双引号来构建JSON对象。这是一个示例,其中我使用_TAG文件值修补kubernetes配置,以部署新构建的映像:

- name: gcr.io/cloud-builders/kubectl
entrypoint: bash
args: ['-c', 'gcloud container clusters get-credentials --zone $$CLOUDSDK_COMPUTE_ZONE $$CLOUDSDK_CONTAINER_CLUSTER ; kubectl patch deployment deployment_name -n mynamespace -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"image_name\",\"image\":\"gcr.io/$PROJECT_ID/image_name:$(cat _TAG)\"}]}}}}}"']
env:
- 'CLOUDSDK_COMPUTE_ZONE=us-central1-b'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-google-proj-cluster-name'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@JJC。如果添加“/”(根目录),它可以在所有目录中使用。示例: `echo "staging" > /_ENV && cd some_dir && echo "\"_ENV\" 的值为 $(cat /_ENV)."`。只需记住始终用引号将 `"$(cat /_ENV)"` 括起来(例如 `mv /workspace/vars.auto.tfvars "environment/env/$(cat /_ENV)/vars.auto.tfvars"`) (2认同)