我有两个 gitlab 配置文件,X 和 Y。X 包含所有作业定义和阶段数组。我想从 Y 中包含 X 并删除其中一个阶段,但我收到了有关作业抱怨其阶段不可用的错误。
这是配置文件,
模板X
stages:
- stage_a
- stage_b
job_a:
stage: stage_a
job_b:
stage: stage_b
模板Y
include:
project: ...
file: X...
stages:
- stage_a
我希望只运行 job_a 但出现以下错误 job_b:选择的阶段不存在;可用阶段有 .pre、stage_a、.post
如何从包含的模板中删除舞台?
一种解决方案是使用规则。这可能对您有帮助:https://docs.gitlab.com/ee/ci/jobs/job_control.html
另一个解决方案是重组。我的建议是:
模板X
stages:
- stage_a
- stage_b
job_a_template:
script: ...
job_b_template:
script: ...
模板Y
include:
project: ...
file: X...
job_a:
extends:
- "job_a_template"
stage: stage_a
您无法“删除”阶段,但可以覆盖它们。规则是“最接近的范围获胜”。在您的情况下,模板 Y 会覆盖从模板 X 导入的 stages:
关键字。这是有问题的,因为 job_b
需要
stage_b
存在,因为它定义了 stage: stage_b
。作业中定义的所有阶段都必须存在于 stages:
中。为了避免此问题,您可以确保 stage_b
包含在 stages:
中,或者将
stage:
的 job_b
更改为您在 stages:
中定义的阶段之一。如果您不想运行作业,那么简单地不定义阶段是行不通的。您必须使用 rules:
或 only:
/
except:
来阻止作业运行。您还可以通过不在作业模板中定义stages:
(根据最佳实践)并
使用输入在模板中定义作业阶段来避免此问题,以便模板用户可以定义阶段。
# template X
spec:
inputs:
stage_name_a:
default: "stage_a"
stage_name_b:
default: "stage_b"
----
job_a:
stage: $[[ inputs.stage_name_a ]]
# ...
job_b:
stage: $[[ inputs.stage_name_b ]]
# ...
然后像这样使用它:
stages:
- build
- deploy
include:
- project: ...
file: X...
inputs:
stage_a_name: build
stage_b_name: deploy