根据 GCP CloudBuild 文档,可以在管道替换中使用 shell 参数扩展。
我想根据 git 分支的名称为 docker 镜像定义一个标签名称。这些名称只能包含小写字符且不能包含斜杠。所以我想为此使用参数扩展:
substitutions:
_BRANCH_NAME_LOWERCASED: ${BRANCH_NAME,,} # to lowercase
_BRANCH_NAME_FLATTENED: ${_BRANCH_NAME_LOWERCASED////-} # replace "/" with "-"
_DOCKER_IMAGE_TAG: ${SHORT_SHA:-$_BRANCH_NAME_FLATTENED}
但是第二步失败了:
[_BRANCH_NAME_FLATTENED -> ${_BRANCH_NAME_LOWERCASED////-}]:错误替换
所以显然第一个扩展有效,第二个扩展失败了。这表明扩展似乎仅部分可用。
这令人惊讶,因为这可以在 CLI 上运行:
$ SHORT_SHA=
$ BRANCH_NAME=BRANCH-80/some-fancy-feature
$
$ _BRANCH_NAME_LOWERCASED=${BRANCH_NAME,,}
$ _BRANCH_NAME_FLATTENED=${_BRANCH_NAME_LOWERCASED////-}
$ _DOCKER_IMAGE_TAG=${SHORT_SHA:-$_BRANCH_NAME_FLATTENED}
$
$ echo $_DOCKER_IMAGE_TAG
branch-80-some-fancy-feature
两个问题:
更新:
一位同事建议“转义”第二个扩展规则中的斜杠,实际上应该替换的斜杠。我既没有看到这样做的原因,也没有在任何文档中看到任何对此的暗示,对该方向的测试也没有成功。
然而事实证明,这种模式不会抛出上述错误,因此扩展规则似乎得到了应用:
_BRANCH_NAME_FLATTENED: ${_BRANCH_NAME_LOWERCASED//\\//-}
再一次:这不起作用!但有趣的是,该命令没有引发任何错误。它根本没有任何效果,这是有道理的,因为我假设它试图替换主题中出现的文字“/”,而它根本不存在。
\/
,因为替换使用
/
作为分隔符。示例:
cloudbuild.yaml
:
steps:
- name: bash
args:
- -c
- |
echo ${BRANCH_NAME}
echo ${_BRANCH_NAME_LOWERCASED}
echo ${_BRANCH_NAME_FLATTENED}
echo ${_DOCKER_IMAGE_TAG}
substitutions:
_BRANCH_NAME_LOWERCASED: ${BRANCH_NAME,,}
_BRANCH_NAME_FLATTENED: ${_BRANCH_NAME_LOWERCASED//\//-}
_DOCKER_IMAGE_TAG: ${SHORT_SHA:-$_BRANCH_NAME_FLATTENED}
options:
dynamicSubstitutions: true
并且:
gcloud builds submit \
--config=cloudbuild.yaml \
--project=${PROJECT} \
--substitutions=BRANCH_NAME="FOO/BAR"
FOO/BAR
foo/bar
foo-bar