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
我理解这个问题,但是有没有正确的方法来应用这个?
从 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]