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

9il*_*0lo 5 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
Run Code Online (Sandbox Code Playgroud)

但是,当我输出 CONTAINER_PUSH_NAME 时,我得到:

myrepo:5000/myimage:$CI_COMMIT_REF_NAME

这意味着,我自己的变量被扩展,但预定义的变量没有扩展,尽管它们在脚本执行时可用,因为当我 时echo $CI_COMMIT_REF_NAME,我会按预期获得分支名称。

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

eli*_*ojo 3

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

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

考虑以下:

.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
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

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
Run Code Online (Sandbox Code Playgroud)

有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
Run Code Online (Sandbox Code Playgroud)

输出:

$ echo $CONTAINER_NAME
myimage:master
$ echo $CONTAINER_PUSH_NAME
myrepo:5000/myimage:master
Run Code Online (Sandbox Code Playgroud)

选项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
Run Code Online (Sandbox Code Playgroud)

输出:

$ echo "myrepo:5000/$CONTAINER_NAME"
myrepo:5000/myimage:master
$ echo $CONTAINER_PUSH_PREFIX/$CONTAINER_NAME
myrepo:5000/myimage:master
Run Code Online (Sandbox Code Playgroud)