Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 是否可以在用户定义变量中使用预定义变量:_Variables_Gitlab_Gitlab Ci - Fatal编程技术网

Variables 是否可以在用户定义变量中使用预定义变量:

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时,我得到了预期的分支名称 是否可以使用预定义变量作为我定义的变量的一部分,或者文档有误导性?

我想使用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
时,我得到了预期的分支名称


是否可以使用预定义变量作为我定义的变量的一部分,或者文档有误导性?

回答您的问题:否,您将一个替换“级联”(嵌套)到另一个替换的方式

…但有干净的解决办法(我应该说是解决方案)

考虑以下几点:

.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