Gitlab 中的变量可以在几个地方设置:
- 在群组设置中
- 在项目设置中
- 里面.gitlab-ci.yml
在这种情况下,组和项目设置中的变量可以设置为“文件”或“常规变量”,并选中“受保护”和“屏蔽”复选框。
我们先从简单的继承开始,逐渐变得更加复杂。
最终的优先级列表可以在文档末尾找到。
组继承 [来源]
来自组的变量是继承的,规则是距离项目越近的组,其值越重要。
具有变量的组
.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
echo:
stage: test
script:
- echo $MSG
管道结果
$ echo $MSG
B
如果变量没有在 B 组中指定,那么我们会看到值 A。
继承 .gitlab-ci.yml 中的变量 [来源]
这里的一切都非常简单:您可以全局设置一个变量,也可以在作业中覆盖它。
具有变量的组
.gitlab-ci.yml
现在让我们创建 2 个作业,在其中一个作业中我们将明确指定 $MSG。
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Custom in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo with var:
stage: test
variables:
MSG: "Custom in job .gitlab-ci.yml"
script:
- echo $MSG
管道结果
- 回声:
$ echo $MSG Custom in global .gitlab-ci.yml Job succeeded
- 与变量回显:
$ echo $MSG Custom in job .gitlab-ci.yml Job succeeded
与组和 .gitlab-ci.yml 内部的继承 [来源]
让我们尝试结合前面的两个例子。 组变量优先于 .gitlab-ci.yml 内的变量。
具有变量的组
.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Custom in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo with var:
stage: test
variables:
MSG: "Custom in job .gitlab-ci.yml"
script:
- echo $MSG
管道结果
- 回声:
$ echo $MSG Y Job succeeded
- 与变量回显:
$ echo $MSG Y Job succeeded
通过在项目设置中指定变量进行继承 [来源]
项目设置中的变量始终具有最高优先级! 并且 .gitlab-ci.yml 中指定的变量不起任何作用。
具有变量的组
组变量的优先级较低。
.gitlab-ci.yml
让我们使用前面示例中的文件。 这里再次在 .gitlab-ci.yml 中指定了变量,但组内的变量仍然优先于它们。
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Custom in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo with var:
stage: test
variables:
MSG: "Custom in job .gitlab-ci.yml"
script:
- echo $MSG
管道结果
- 回声:
$ echo $MSG project-3 Job succeeded
- 与变量回显:
$ echo $MSG project-3 Job succeeded
空值继承 [来源]
空值也是一个值
空值不等于 Null
具有变量的组
.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Custom in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo with var:
stage: test
variables:
MSG: "Custom in job .gitlab-ci.yml"
script:
- echo $MSG
管道结果
- 回声:
$ echo $MSG Job succeeded
- 与变量回显:
$ echo $MSG Job succeeded
使用 include 和 groups 进行继承 [来源]
这里我们将尝试将project-2包含在project-3中
在这种情况下,团体具有优先权。
具有变量的组
.gitlab-ci.yml
并在 .gitlab-ci.yml 中全局设置变量
variables:
MSG: "With include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'
管道结果
- 回声:
$ echo $MSG B Job succeeded
- 与变量回显:
$ echo $MSG B Job succeeded
继承包含 [来源]
这里我们将尝试将project-2包含在project-3中。
条件是:团体和项目本身都没有任何变量。
具有变量的组
.gitlab-ci.yml
与前面的示例相同
variables:
MSG: "With include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'
管道结果
- 回声:
$ echo $MSG With include .gitlab-ci.yml Job succeeded
- 与变量回显:
$ echo $MSG Custom in job .gitlab-ci.yml Job succeeded
结果如下 优先:
- 项目设置中的变量
- 组中的变量
- 作业内严格指定的变量(包括包含的文件)
- .gitlab-ci.yml 内的全局变量
- 包含文件内的全局变量
结论
最不明显的一点是,“变量离代码越近,它就越重要”这一规则首先适用于组,然后同样的规则适用于 .gitlab-ci.yml 中的变量,但仅在以下条件下有效组中的变量未指定。
接下来,重要的一点是要了解主 .gitlab-ci.yml 和包含的 .gitlab-ci.yml 的全局空间是通用的。 并且发生包含的文件具有优先权。
来源: habr.com