合并YAML密钥

时间:2018-07-27 17:31:43

标签: yaml gitlab-ci

我正在尝试创建一个非常抽象的.yaml-配置,该配置可以在不同的地方重复使用。

现在看起来像这样:

.release: &release
  stage: release
  script:
    - docker tag $IMAGE_TESTING $IMAGE_RELEASE
    - docker push $IMAGE_RELEASE
  only: 
    - master
  when: manual

.amd64: &amd64
    BASE_ARCH: 'amd64'

.debalike: &debalike
    FLAVOUR: 'debalike'

release_debalike_amd64:
  <<: *release
  variables:
    << : [*amd64, *debalike]

正确解析为...的

.release:
    stage: release
    script:
        - 'docker tag $IMAGE_TESTING $IMAGE_RELEASE'
        - 'docker push $IMAGE_RELEASE'
    only:
        - master
    when: manual
.amd64:
    BASE_ARCH: amd64
.debalike:
    FLAVOUR: debalike
release_debalike_amd64:
    stage: release
    script:
        - 'docker tag $IMAGE_TESTING $IMAGE_RELEASE'
        - 'docker push $IMAGE_RELEASE'
    only:
        - master
    when: manual
    variables:
        BASE_ARCH: amd64
        FLAVOUR: debalike

这是理想的行为。

但是有可能避免使用release_debalike_amd64中的变量标签,而直接使用锚点吗?

与此类似的东西(不起作用):

.release: &release
  stage: release
  script:
    - docker tag $IMAGE_TESTING $IMAGE_RELEASE
    - docker push $IMAGE_RELEASE
  only: 
    - master
  when: manual

.amd64: &amd64
    variables:
        BASE_ARCH: 'amd64'

.debalike: &debalike
    variables:
        FLAVOUR: 'debalike'

release_debalike_amd64:
  <<: *release
  <<: [*amd64, *debalike]

现在,yaml解析器将忽略*debalike,而仅包含*amd64中的值。

有什么方法可以做到这一点? 如果需要的话,这是.gitlab-ci.yml。

1 个答案:

答案 0 :(得分:1)

不幸的是没有。只能使用YAML锚点和别名来进行深度合并。

GitLab EE在10.5中引入了CI包含,在10.8中对其进行了增强,以进行CI作业的深度合并。在这种特殊情况下,我认为这不会帮助您,但是您可以根据组织CI文件的方式以其他方式利用它。

有关包含参数的更多信息,请参见include