YAML合并级别

时间:2017-11-07 22:51:32

标签: yaml

我们有一个带有重复部分的gitlab-ci yaml文件。

test:client:
  before_script:
    - node -v
    - yarn install
  cache:
    untracked: true
    key: client
    paths:
      - node_modules/
  script:
    - npm test

build:client:
  before_script:
    - node -v
    - yarn install
  cache:
    untracked: true
    key: client
    paths:
      - node_modules/
    policy: pull
  script:
    - npm build

我想知道,使用合并语法,如果我可以提取公共部分,以便在这两部分的上下文中有效地重用它。

.node_install_common: &node_install_common
  before_script:
    - node -v
    - yarn install
  cache:
    untracked: true
    key: client
    paths:
      - node_modules/

但真正的问题是:在哪个缩进级别我必须合并块以确保策略:pull应用于缓存部分。我试着这样说:

test:client:
  <<: *node_install_common
  script:
    - npm test

test:build:
  <<: *node_install_common
    policy: pull
  script:
    - npm build

但是我收到了无效的yaml错误。如何缩进以获得正确的合并行为?

1 个答案:

答案 0 :(得分:3)

请注意,合并键不是YAML规范的一部分,因此无法保证其正常工作。它们也是针对过时的YAML 1.1版本指定的,并且尚未针对当前的YAML 1.2版本进行更新。我们打算在即将推出的YAML 1.3中明确删除合并密钥(并可能提供更好的替代方案)。

话虽如此:没有合并语法。合并键<<必须像映射中的普通键一样放置。这意味着密钥必须与其他密钥具有相同的缩进。所以这是有效的:

test:client:
  <<: *node_install_common
  script:
    - npm test

虽然不是这样:

test:build:
  <<: *node_install_common
    policy: pull
  script:
    - npm build

请注意,与您的代码相比,我将:添加到test:clienttest:build行。

现在指定 merge 将所引用映射的所有键值对放入当前映射(如果它们尚不存在)。这意味着您不能根据需要替换子树中更深层的值 - 合并不支持部分替换子树。但是,您可以多次使用合并:

.node_install_common: &node_install_common
  before_script:
    - node -v
    - yarn install
  cache: &cache_common
    untracked: true
    key: client
    paths:
      - node_modules/

test:client:
  <<: *node_install_common
  script:
    - npm test

test:build:
  <<: *node_install_common
  cache: # define an own cache mapping instead of letting merge place
         # its version here (which could not be modified)
    <<: *cache_common  # load the common cache content
    policy: pull       # ... and place your additional key-value pair
  script:
    - npm build