是否可以在gitlab-ci.yml中嵌套使用!reference?

问题描述 投票:0回答:2

rules.yml

.rules:
  default:
    - .gitlab-ci.yml
    - Makefile
    - VERSION

  a_pybuild_deps:
    - !reference [.rules, default]
    - foo/a/**

  b_pybuild_deps:
    - !reference [.rules, default]
    - foo/b/**

如果我只是指

default
,它就有效:

gitlab-ci.yml

include:
  - local: "./rules.yml"
   
a_pybuild:
  ...
  stage: py_build
  script:
    ...
  only:
    changes: !reference [.rules, default]

但我想做以下事情:

gitlab-ci.yml

include:
  - local: "./rules.yml"
   
a_pybuild:
  ...
  stage: py_build
  script:
    ...
  only:
    changes: !reference [.rules, a_pybuild_deps]

b_pybuild:
  ...
  stage: py_build
  script:
    ...
  only:
    changes: !reference [.rules, b_pybuild_deps]

像这样我会得到一个 lint 错误:

jobs:a_pybuild:only changes should be an array of string
我理解这个问题,但是有没有正确的方法来应用这个?

reference gitlab yaml continuous-integration gitlab-ci
2个回答
2
投票

从 GitLab 14.8 开始,您可以使用最多 10 层深度的嵌套

!reference
s,但仅限于
script:
before_script:
after_script:

其他键中不允许嵌套

!reference
,例如
only:
,这就是您收到此错误的原因。

在 14.8 之前的 GitLab 版本中,完全禁止嵌套

!reference

在您的情况下,您只需手动将默认规则复制到

a_pybuild_deps
b_pybuild_deps
中,或者完全忽略这些键中的默认规则以及
!reference
作业中的默认键和相应的 pybuild 键。

这可能是最灵活和最干燥的方法,就是使用

rules:
而不是
only:
并像这样安排你的规则:

# rules.yml
.rules:
  default:
    changes:
      - .gitlab-ci.yml
      - Makefile
      - VERSION

  a_pybuild_deps:
    changes:
      - foo/a/**

  b_pybuild_deps:
    changes:
      - foo/b/**
#.gitlab-ci.yml
include:
  - local: "./rules.yml"


a_pybuild:
  script: '...'
  rules:
    - !reference [.rules, default]
    - !reference [.rules, a_pybuild_deps]

b_pybuild:
  script: '...'
  rules:
     - !reference [.rules, default]
     - !reference [.rules, b_pybuild_deps]

0
投票

我现在也遇到同样的问题了
正如sytech提到的,根据GitLab文档,嵌套引用不能在

changes
中使用。

我的解决方案是使用 YAML 锚点 而不是内部引用。它有效。
请注意,与引用不同,锚点必须在使用的同一文件中定义。

© www.soinside.com 2019 - 2024. All rights reserved.