Gitlab-CI如何继承环境变量?

Gitlab 中的变量可以在几个地方设置:

  1. 在群组设置中
  2. 在项目设置中
  3. 里面.gitlab-ci.yml

在这种情况下,组和项目设置中的变量可以设置为“文件”或“常规变量”,并选中“受保护”和“屏蔽”复选框。

Gitlab-CI如何继承环境变量?

我们先从简单的继承开始,逐渐变得更加复杂。

最终的优先级列表可以在文档末尾找到。

组继承 [来源]

来自组的变量是继承的,规则是距离项目越近的组,其值越重要。

具有变量的组

Gitlab-CI如何继承环境变量?

.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如何继承环境变量?

.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如何继承环境变量?

.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如何继承环境变量?

.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如何继承环境变量?

.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如何继承环境变量?

.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如何继承环境变量?

.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

结果如下 优先:

  1. 项目设置中的变量
  2. 组中的变量
  3. 作业内严格指定的变量(包括包含的文件)
  4. .gitlab-ci.yml 内的全局变量
  5. 包含文件内的全局变量

结论

最不明显的一点是,“变量离代码越近,它就越重要”这一规则首先适用于组,然后同样的规则适用于 .gitlab-ci.yml 中的变量,但仅在以下条件下有效组中的变量未指定。
接下来,重要的一点是要了解主 .gitlab-ci.yml 和包含的 .gitlab-ci.yml 的全局空间是通用的。 并且发生包含的文件具有优先权。

来源: habr.com

添加评论