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

Yaml 如何在.gitlab-ci.yml中合并序列?,yaml,gitlab-ci,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 由于不太喜欢重复,我希望我能通过以下方式“清理”yaml: .update: &

我试图在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
由于不太喜欢重复,我希望我能通过以下方式“清理”yaml:

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

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

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

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

我认为您误解了GitLab 13.9添加的关键字:

。设置:
before_脚本:apt获取更新
工作1:
在脚本之前:
- !参考[.设置,在脚本之前]
-apt-get-install-foo
工作2:
在脚本之前:
- !参考[.设置,在脚本之前]
-安装杆

reference
和的联合非常好,可以帮助您消除冗余。

换句话说:我可以合并哈希,但不能合并列表?这是非常不幸的。您可以合并映射,这就是您所做的。您似乎假设这是某种递归操作,但事实并非如此。除此之外,我不知道如何将动词merge应用于两个序列(因为它们是有序的),如果你的意思是append,那么no,那么就没有这样的功能,递归或非递归。由于序列中没有键,因此需要难看的语法来区分正常的别名元素和具有特殊解释的元素(也就是说,通过重载
可以做什么?当然,完全可以使用标记实现您想要的,但这需要在读取YAML的代码级别上解决。我过去不喜欢这种限制,但我发现在实践中,几乎总是有一种干净的方法来重构之前的脚本、脚本和移动脚本为helper.sh文件编写一些脚本。请注意,当您执行.sh文件部分时,您将需要对类似的“严格模式”执行
set-euo pipefail
这会在出现错误时立即出现。GitLab问题跟踪器上存在一个尚未解决的问题:。如果GitLab自动展平
.GitLab ci.yml
配置文件中的嵌套列表,这将起作用。YAML的适当术语是标量(字符串、int、浮点、日期、布尔)、映射(dict、hash)和序列(列表、数组?)。wikipedia示例有一个明确的注释“仅重新定义此键,引用&id001中的rest”,因此与您看到的行为没有任何对比。您是否有指向解释合并的Gitlab文档的链接?指向Gitlab文档的链接是一个问题。对于术语上的混淆,我感到抱歉:看起来我实际上是在寻找合并序列。抱歉,我在帖子中没有看那么远。Gitlab文档和wikipedia p都没有age提到使用
…合并多个别名,这并不是我真正想要的。但我非常感谢您继续努力提供解决方案。
.update: &update apt-get update

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

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