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

标签 variables gitlab gitlab-ci

我想使用分支名称作为标记来定义 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/

相关文章:

c++ - 使用数字标识符注册类类型

mysql - 使用 mySQL 变量

ruby-on-rails - Bitnami GitLab 5.2.0 : gitlab_sidekiq not running and could not be started

variables - 我们如何在 gitlab-ci.yml 中使用 'variables' 关键字?

gitlab - 任何人都可以发布具有外部子模块的 GitLab CI 的工作示例吗?

docker - gitlab ci 无法构建 windows 容器

javascript - 在 foreach 循环中将 PHP 值 (ACF) 添加到 Javascript 数组

asp.net - 来自 ASP.NET MVC 模型数据的 Javascript int 变量?

gitlab - .gitlab-ci.yml : How to specify "only/except" rules with a regex AND repo-specific qualifier?

git - 无法推送到 self 管理的 GitLab 服务器上的存储库