复用类配置:
锚点 Anchors
YAML 有一项名为“锚点”的功能,您可以使用它在整个文档中复制内容。
1 | cache: # 定义一个全局缓存的锚点:global_cache |
&
设置锚点的名称 (global_cache),<<
意思是“将给定的哈希对象合并到当前哈希对象中”,*
包含命名锚点(如:global_cache
)。
这个例子的结果是:
1 | cache: # 定义一个全局缓存的锚点:global_cache |
你还可以使用锚点来定义两个服务集合。例如以下示例(test:postgres
和test:mysql
共享了.job_template
的script
,但是却有这不同的services
,分别定义在了.postgres_services
和.mysql_services
中):。
1 | .job_template: |
得到的结果将是这样的:
1 | .job_template: |
我们可以看到隐藏的作业被方便地用作模板,并且tags: [postgres]
覆盖了tags: [dev]
。
更多锚点的使用示例:
- YAML 锚点用于脚本(script)中:
您可以将 YAML 锚点与 script
、before_script
和 after_script
结合使用,以便在多个作业中使用预定义的命令:
1 | .some-script-before: &some-script-before |
- YAML 锚点用于用于变量(variables)中:
使用带有变量的 YAML 锚点在多个作业中重复分配变量。当作业需要特定的变量块时,您还可以使用 YAML 锚点,否则会覆盖全局变量。以下示例显示如何覆盖 GIT_STRATEGY
变量而不影响 SAMPLE_VARIABLE
变量的使用:
1 | # global variables |
引用 !reference
使用 !reference
自定义 YAML 标签从其他作业部分选择关键字配置,并在当前部分中复用它。与锚点不同,您可以使用 !reference
标签来复用通过include
引用的配置文件中的配置。
在以下示例中,test
作业中重复使用了来自两个不同位置的script
和after_script
:
setup.yml
:
1 | .setup: |
.gitlab-ci.yml
:
1 | include: |
在以下示例中,test-vars-1
复用 .vars
中的所有变量,而 test-vars-2
选择特定变量并将其复用为新的 MY_VAR
变量。
1 | .vars: |
您不能重复使用已经包含 !reference
标签的部分。仅支持一层嵌套。
继承 extend
使用extends
来复用配置块。它是锚点(Anchor)的替代品,并且更加灵活和可读。您可以使用extends
来复用通过include
引用的配置文件中的配置。
在以下示例中,rspec
作业使用 .tests
模板作业中的配置。GitLab:
- 根据键执行反向深度合并。
- 将
.tests
内容与rspec
作业合并。 - 不合并键的值。
1 | .tests: |
rspec
作业的结果是:
1 | rspec: |
本例中的 .tests
是一个隐藏作业,但也可以从常规作业中extends
配置。
extends
支持多级继承。 虽然您可以使用多达 11 个级别,但是您应该避免使用 3 个以上的级别。以下示例具有两个继承级别:
1 | .tests: |
在 GitLab 12.0 及更高版本中,也可以使用多个父项进行扩展(extends)。
您可以用extends
来合并哈希对象但是不能用来合并数组。用于合并的算法是“就近优先原则(closest scope wins)”,因此来自最后一个成员的键总是覆盖其他级别上定义的任何内容。例如:
1 | .only-important: |
结果是:
1 | rspec: |
在上面示例中:
variables
合并,但URL:"http://docker-url.internal"
覆盖URL:"http://my-url.internal"
。tags:['docker']
覆盖tags:['production']
。script
不会合并,但script: ['rake rspec']
会覆盖script: ['echo "Hello world!"']
。 您可以使用锚点来合并数组。
extends
和 include
一起使用:要复用来自不同配置文件的配置,请结合extends
和 include
。
在下面的示例中,在 included.yml
文件中定义了一个脚本script
。然后,在 .gitlab-ci.yml
文件中,使用extends
继承了那部分脚本内容:
included.yml
:
1 | .template: |
.gitlab-ci.yml
:
1 | include: included.yml |
包含 include
TODO…
总结&注意
使用include
关键字时,您不能跨多个文件使用 YAML 锚点。锚点只在定义它们的文件中有效。要复用来自不同 YAML 文件的配置,请使用引用(!reference)
或继承(extends)
。
英文原文:
锚点 Anchors:https://docs.gitlab.com/ee/ci/yaml/#anchors
引用 !reference:https://docs.gitlab.com/ee/ci/yaml/#reference-tags
继承 extend:https://docs.gitlab.com/ee/ci/yaml/#extends
包含 include:https://docs.gitlab.com/ee/ci/yaml/#include