Variables 是否可以在用户定义变量中使用预定义变量:
我想使用branch name作为标记为docker image name定义变量,如文档中所定义: 但是,当我输出CONTAINER_PUSH_NAME时,我得到: myrepo:5000/myimage:$CI\u COMMIT\u REF\u NAME 这意味着,扩展了我自己的变量,但预定义的变量没有扩展,尽管它们在脚本执行时可用,因为当我Variables 是否可以在用户定义变量中使用预定义变量:,variables,gitlab,gitlab-ci,Variables,Gitlab,Gitlab Ci,我想使用branch name作为标记为docker image name定义变量,如文档中所定义: 但是,当我输出CONTAINER_PUSH_NAME时,我得到: myrepo:5000/myimage:$CI\u COMMIT\u REF\u NAME 这意味着,扩展了我自己的变量,但预定义的变量没有扩展,尽管它们在脚本执行时可用,因为当我echo$CI\u COMMIT\u REF\u NAME时,我得到了预期的分支名称 是否可以使用预定义变量作为我定义的变量的一部分,或者文档有误导性?
echo$CI\u COMMIT\u REF\u 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\u PUSH\u NAME
中进行“嵌套”替换,这种替换“取决于”通过符号CONTAINER\u NAME
对$CI\u COMMIT\u REF\u NAME
进行的更深层次(嵌套)替换
可以同时使用多个替换,只要它们不是嵌套的
选择1 输出:
$ echo $CONTAINER_NAME
myimage:master
$ echo $CONTAINER_PUSH_NAME
myrepo:5000/myimage:master
$ echo "myrepo:5000/$CONTAINER_NAME"
myrepo:5000/myimage:master
$ echo $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME
myrepo:5000/myimage:master
选择2
输出:
$ echo $CONTAINER_NAME
myimage:master
$ echo $CONTAINER_PUSH_NAME
myrepo:5000/myimage:master
$ echo "myrepo:5000/$CONTAINER_NAME"
myrepo:5000/myimage:master
$ echo $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME
myrepo:5000/myimage:master
检查(2021年3月,4年后)是否对您的情况有帮助:
嵌套变量展开
有时,您需要在.gitlab ci.yml
文件中定义一个变量,并在另一个变量定义中使用它
我们正在引入新的嵌套变量扩展功能。
启用后,GitLab会在将最终输出发送到运行程序以执行作业之前,对作业变量进行递归排序和展开。这种特定的排序允许变量以正确解析的顺序从GitLab CI/CD发送到运行程序 现在,您可以轻松地在
.gitlab ci.yml
文件中的其他变量中使用变量
见和
但是,最初的“级联”到底有什么错呢?“变量”替换不像普通的变量值赋值那样工作。替换发生在运行代码之前。这就像是一种准备。“解析器/编译器/解释器”在不更新查找值的情况下查找替换“变量”的位置。例如,
$CONTAINER\u NAME
在所有替换结束之前不会更新。因此,在替换阶段,它将具有文本值myimage:$CI\u COMMIT\u REF\u NAME
。稍后,在“运行时”,值赋值使容器\u推送\u名称
获取myrepo:5000/myimage:$CI\u提交\u引用\u名称
文本值您是否查看了双引号中的大小写?这是非常有趣的,因为这是一个特殊的情况,替代发生“两次”,看起来很像你试图做的。我的意思是,代码中说$echo“myrepo:5000/$CONTAINER_NAME”
并输出myrepo:5000/myimage:master
我不是OP,是的,我确实了解双引号在bash变量中的工作原理,它们在运行时进行计算,因此您甚至可以将命令分配给它们,而不是命令结果。但我只是不太明白最初的问题,我以后可能会尝试。对不起,我没有看你的用户名,还以为你是OP,我的错。添加了关于“原始”问题的旁注。
$ echo "myrepo:5000/$CONTAINER_NAME"
myrepo:5000/myimage:master
$ echo $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME
myrepo:5000/myimage:master