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

DaS*_*rer 12 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

job2:
  <<: *update
  before_script:
    - apt-get install bar
Run Code Online (Sandbox Code Playgroud)

但是,似乎这些before_script节没有与之合并*update.相反,我发现后者被覆盖了.这与GitLab CI文档以及维基百科上的示例形成鲜明对比.

通过一些实验,我设法得到以下运行:

.update: &update apt-get update

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

job2:
  before_script: 
    - *update
    - apt-get install bar
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*hon 7

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

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

  • 换句话说:我可以合并哈希而不是列表?那是最不幸的. (3认同)
  • 我曾经不喜欢这个限制,但我发现在实践中,几乎总是有一种干净的方法来重构before_script,脚本,并将一些脚本移动到帮助.sh文件.请注意,当您执行.sh文件部分时,您将需要为相似的"严格模式"执行`set -euo pipefail`,这些模式会在出现错误时立即退出. (2认同)
  • 在GitLab问题跟踪器上有一个未解决的问题:[gitlab-ci.yaml锚在脚本或after_script中的串联](https://gitlab.com/gitlab-org/gitlab-ce/issues/24235)。如果GitLab自动展平.gitlab-ci.yml`配置文件中的嵌套列表,它将起作用。 (2认同)

Abr*_*dez 5

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

联盟referenceextend好才是真的好,并会帮助你战斗冗余。