如何合并.gitlab-ci.yml中的序列?

时间:2017-07-10 11:58:45

标签: yaml gitlab-ci

我正在尝试删除在GitLab CI中设置多个任务的一些冗余。作为(极大地)简化的示例,我有两个涉及调用apt-get update的作业:

job1:
  before_script:
    - apt-get update
    - apt-get install foo

job2:
  before_script:
    - apt-get update
    - apt-get install bar

不是重复的忠实粉丝,我希望我能够通过anchors的帮助“清理”yaml,如下所示:

.update: &update
  before_script:
    - apt-get update

job1:
  <<: *update
  before_script:
    - apt-get install foo

job2:
  <<: *update
  before_script:
    - apt-get install bar

但是,似乎before_script节未与*update合并。相反,我发现后一个被覆盖。这与GitLab CI文档以及Wikipedia上的示例形成对比。

通过一些实验,我设法让以下内容运行:

.update: &update apt-get update

job1:
  before_script: 
    - *update
    - apt-get install foo

job2:
  before_script: 
    - *update
    - apt-get install bar

显然向前迈进了一步。但鉴于我打算进行更复杂的替换,这很难令人满意。供参考:这是在GitLab v 8.12上。

2 个答案:

答案 0 :(得分:6)

我认为你误解了<<:合并的作用。它使用锚定映射中的键值对预先填充它所属的映射。并且合并后的任何键都会添加到该映射中,其中一个合并映射中已存在的键的值将被该值覆盖。 Here是文档。

在YAML中没有附加序列的内容,例如您在期望中描述的内容。合并是在键的级别,而不是递归(不是映射,也不是序列)

答案 1 :(得分:4)

Gitlab 13.9 添加了 !reference 关键字:

.setup:
  before_script: apt-get update

job1:
  before_script: 
    - !reference [.setup, before_script]
    - apt-get install foo

job2:
  before_script: 
    - !reference [.setup, before_script]
    - apt-get install bar

referenceextend 的结合非常好,可以帮助您解决冗余问题。