将小 bash 脚本添加到 cloudbuild.yaml
Posted
技术标签:
【中文标题】将小 bash 脚本添加到 cloudbuild.yaml【英文标题】:add small bash script to cloudbuild.yaml 【发布时间】:2021-08-05 00:10:38 【问题描述】:我有一个用于谷歌云 (GCP) 的 cloudbuild.yaml
文件。我想使用简单的 bash 脚本$(node -p -e "require('./package.json').version")
(或任何其他方式)从package.json
中获取version
。如何将此添加到我的 cloudbuild.yaml
文件中?
我尝试将脚本放入substitution
,但没有成功。
# gcloud submit --substitutions=_VERSION="1.1.0"
steps:
# build the container image
- name: "gcr.io/cloud-builders/docker"
args: ["build", "-t", "gcr.io/$_PROJECT_ID/$_IMAGE:$_VERSION", "."]
# push the container image to Container Registry
- name: "gcr.io/cloud-builders/docker"
args: ["push", "gcr.io/$_PROJECT_ID/$_IMAGE:$_VERSION"]
# build the container image
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
[
"run",
"deploy",
"$_SERVICE_NAME",
"--project",
"$_PROJECT_ID",
"--image",
"gcr.io/$_PROJECT_ID/$_IMAGE:$_VERSION",
"--platform",
"managed",
"--allow-unauthenticated",
"--region",
"$_REGION",
"--set-env-vars",
"$_ENV_VARS",
"--ingress",
"internal-and-cloud-load-balancing",
"--quiet",
]
images:
- gcr.io/$_PROJECT_ID/$_IMAGE
substitutions:
_REGION: us-east1
_PROJECT_ID: my-dev
_SERVICE_NAME: my-client
_IMAGE: my-client
_VERSION: $(node -p -e "require('./package.json').version")
_ENV_VARS: "APP_ENV=dev"
【问题讨论】:
【参考方案1】:这是 Cloud Build 的缺点之一。您不能将变量从一个步骤传递到另一个步骤。步骤之间仅保留/workspace
。并且替换变量只是静态的(在管道运行时预定义或设置)。
这里的解决方案并不那么容易。
您需要添加一个步骤来获取版本并将其写入文件中- name: 'node'
entrypoint: bash
args:
- -c
- node -p -e "require('./package.json').version" > /workspace/node_version
然后在你的步骤中使用它,就像这样
- name: "gcr.io/cloud-builders/docker"
entrypoint: bash
args:
- -c
- |
VERSION=$$cat /workspace/node_version
docker build -t gcr.io/$_PROJECT_ID/$_IMAGE:$$VERSION .
双美元 $$ 表示这是一个 linux 命令而不是 Cloud Build 变量
【讨论】:
很遗憾VERSION
空了。我觉得您的回答是正确的,但 VERSION
值不起作用
即使我手动将文件制作为cat
,这种在本地机器上获取版本的方法也不起作用:bash: $cat ./package_version: bad substitution invalid argument "gcr.io/my-project/my-client:" for "-t, --tag" flag: invalid reference format
我无法让变量设置起作用,所以我改用了$$(cat ./package_version)
我不是节点专家,我的命令是根据您的要求。但是,如果您通过我的投入找到了正确的解决方案,那就太好了!!!
是的,感谢您的意见 :) 但是,这不是特定于节点的问题,我无法使 VERSION
定义起作用(第二步不涉及节点)
【参考方案2】:
根据 Guillaume 的回答,您可以使用带有两个 $$
而不是 1 个 $
的 bash 脚本,例如 $$(node -p -e "require('./package.json').version")
。 但是,如果您尝试使用的命令不可用(node
将不可用),最好从您可以在上述步骤中创建的文件中提取它,例如纪尧姆的回答:
- name: "gcr.io/cloud-builders/docker"
entrypoint: bash
args:
- -c
- docker build -t gcr.io/$_PROJECT_ID/$_IMAGE:$$(cat ./package_version) .
【讨论】:
以上是关于将小 bash 脚本添加到 cloudbuild.yaml的主要内容,如果未能解决你的问题,请参考以下文章