我想使用分支名称作为标记来定义 docker 镜像名称的变量,如文档 https://docs.gitlab.com/ce/ci/docker/using_docker_build.html 中定义的那样:
variables:
CONTAINER_NAME: myimage:$CI_COMMIT_REF_NAME
CONTAINER_PUSH_NAME: myrepo:5000/$CONTAINER_NAME
但是,当我输出 CONTAINER_PUSH_NAME 时,我得到:
myrepo:5000/myimage:$CI_COMMIT_REF_NAME
这意味着,我自己的变量已扩展,但预定义的变量未扩展,尽管它们在脚本执行时可用,因为当我 echo $CI_COMMIT_REF_NAME
时,我会按预期获得分支名称。
是否可以使用预定义变量作为我定义的变量的一部分,或者文档具有误导性?
最佳答案
回答你的问题:不,你将一个替换“级联”(嵌套)到另一个替换中的方式......
...但是有干净的解决方法(我应该说解决方案)
考虑以下因素:
.gitlab-ci.yml
image: ubuntu
variables:
# Original
CONTAINER_NAME: myimage:$CI_COMMIT_REF_NAME
CONTAINER_PUSH_NAME: myrepo:5000/$CONTAINER_NAME
#
# Added to look for a workaround
CONTAINER_NAME_PREFIX: 'myimage:'
CONTAINER_PUSH_PREFIX: myrepo:5000/
CONTAINER_PUSH_NAME_V2: $CONTAINER_PUSH_PREFIX$CONTAINER_NAME_PREFIX$CI_COMMIT_REF_NAME
#
# Suggested workaround
MY_IMAGE: myimage
MY_REPO: myrepo:5000
SUGGESTED_CONTAINER_NAME: $MY_IMAGE:$CI_COMMIT_REF_NAME
SUGGESTED_CONTAINER_PUSH_NAME: $MY_REPO/$MY_IMAGE:$CI_COMMIT_REF_NAME
test:
script:
# Just the relevant variables:
- echo '*** Just the variables:'
- echo $CI_COMMIT_REF_NAME
- echo $CONTAINER_NAME
- echo $CONTAINER_PUSH_NAME
- echo $CONTAINER_PUSH_NAME_V2
# Combinations of text and variables
- echo '*** Combinations of text and variables:'
- echo myrepo:5000/$CONTAINER_NAME
- echo 'myrepo:5000/$CONTAINER_NAME'
- echo "myrepo:5000/$CONTAINER_NAME"
- echo $CONTAINER_PUSH_PREFIX$CONTAINER_NAME_PREFIX$CI_COMMIT_REF_NAME
# Suggested workarounds:
- echo '*** Suggested workarounds:'
- echo $SUGGESTED_CONTAINER_NAME
- echo $SUGGESTED_CONTAINER_PUSH_NAME
产生此输出:
Running with gitlab-ci-multi-runner 9.1.0 (0118d89)
on docker-auto-scale (e11ae361)
Using Docker executor with image ubuntu ...
Using docker image sha256:a9db1f09b71a10fe42d8ac456c24d961dccd06968e72d2f476df20a12cb41f3d for predefined container...
Pulling docker image ubuntu ...
Using docker image ubuntu ID=sha256:ebcd9d4fca80e9e8afc525d8a38e7c56825dfb4a220ed77156f9fb13b14d4ab7 for build container...
Running on runner-e11ae361-project-3324498-concurrent-0 via runner-e11ae361-machine-1495045360-f78e2b0f-digital-ocean-2gb...
Cloning repository...
Cloning into '/builds/elingerojo/CI-sandbox'...
Checking out 09b782b9 as master...
Skipping Git submodules setup
$ echo '*** Just the variables:'
*** Just the variables:
$ echo $CI_COMMIT_REF_NAME
master
$ echo $CONTAINER_NAME
myimage:master
$ echo $CONTAINER_PUSH_NAME
myrepo:5000/myimage:$CI_COMMIT_REF_NAME
$ echo $CONTAINER_PUSH_NAME_V2
myrepo:5000/myimage:master
$ echo '*** Combinations of text and variables:'
*** Combinations of text and variables:
$ echo myrepo:5000/$CONTAINER_NAME
myrepo:5000/myimage:master
$ echo 'myrepo:5000/$CONTAINER_NAME'
myrepo:5000/$CONTAINER_NAME
$ echo "myrepo:5000/$CONTAINER_NAME"
myrepo:5000/myimage:master
$ echo $CONTAINER_PUSH_PREFIX$CONTAINER_NAME_PREFIX$CI_COMMIT_REF_NAME
myrepo:5000/myimage:master
$ echo '*** Suggested workarounds:'
*** Suggested workarounds:
$ echo $SUGGESTED_CONTAINER_NAME
myimage:master
$ echo $SUGGESTED_CONTAINER_PUSH_NAME
myrepo:5000/myimage:master
Job succeeded
有 5 个正确的输出。选择一款适合您风格的:)
<小时/>旁注:
“原始”问题在于为每个符号分配多个替换文本级别(符号是分配的左侧,例如 CONTAINER_NAME
)。意味着,您不能像 CONTAINER_PUSH_NAME
那样进行“嵌套”替换,它“依赖于”通过符号 $CI_COMMIT_REF_NAME
进行更深层次(嵌套)的 CONTAINER_NAME
替换。
可以同时使用多个替换,只要它们不嵌套即可
<小时/>选项 1
image: ubuntu
variables:
# Just two lines, all info at top of the script
CONTAINER_NAME_PREFIX: myimage
CONTAINER_PUSH_PREFIX: myrepo:5000
# Two auxiliary vars
CONTAINER_NAME: $CONTAINER_NAME_PREFIX:$CI_COMMIT_REF_NAME
CONTAINER_PUSH_NAME: $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME_PREFIX:$CI_COMMIT_REF_NAME
test:
script:
- echo $CONTAINER_NAME
- echo $CONTAINER_PUSH_NAME
输出:
$ echo $CONTAINER_NAME
myimage:master
$ echo $CONTAINER_PUSH_NAME
myrepo:5000/myimage:master
选项 2
image: ubuntu
variables:
CONTAINER_NAME: myimage:$CI_COMMIT_REF_NAME
CONTAINER_PUSH_PREFIX: myrepo:5000
test:
script:
# As bash value with double quotes
# (could be assigned to an environment variable)
- echo "myrepo:5000/$CONTAINER_NAME"
# Or used directly in any command without quotes
- echo $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME
输出:
$ echo "myrepo:5000/$CONTAINER_NAME"
myrepo:5000/myimage:master
$ echo $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME
myrepo:5000/myimage:master
关于variables - 是否可以在用户定义变量中使用预定义变量:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44022046/