GitLab CI引用模板时如何限制仅使用指定stages阶段
问题原因
直接重写stages配置仅会覆盖全局阶段列表,不会自动清除模板中绑定到c阶段的作业。GitLab CI只要检测到流水线配置里存在作业归属未定义的阶段,就会抛出c job: chosen stage does not exist报错,和你要不要运行该阶段的作业没有关系。
可行配置方案
方案1:显式移除/屏蔽c阶段所有作业(最稳定)
在覆盖stages仅保留a、b阶段的同时,把模板中所有归属于c阶段的作业从配置中移除或者标记为不创建:
- 如果你的GitLab版本为15.11及以上,直接用
!remove标记删除c阶段作业,配置最干净:
include: - project: 'project' ref: project file: 'ci_templates/.template.yml' stages: - a - b # 按模板中c阶段的实际作业名替换下方作业项,所有c阶段作业都要配置 <模板中c阶段的作业名1>: !remove <模板中c阶段的作业名2>: !remove
- 如果GitLab版本低于15.11,给对应作业配置
when: never即可,效果是作业保留在配置中但不会被加入流水线:
<模板中c阶段的作业名1>: when: never
如果模板里的c阶段作业全部继承自同一个隐藏父作业,你只需要在父作业上配置移除/禁用规则,所有继承它的子作业会自动生效,不用逐一列举。
方案2:保留c阶段定义+全局拦截c阶段作业(无需枚举作业名)
如果你不清楚c阶段下具体有多少作业,不想逐一配置,可以先把c阶段保留在stages列表里,再通过全局规则拦截所有c阶段的作业,让它们不会出现在最终运行的流水线里:
include: - project: 'project' ref: project file: 'ci_templates/.template.yml' stages: - a - b - c # 给所有作业追加规则,c阶段作业直接不执行 default: rules: - if: $CI_JOB_STAGE == "c" when: never - when: on_success
注意:该方案的前提是模板里的作业没有单独定义
rules覆盖全局default配置,如果模板内作业自定义了rules,需要单独给这些作业补充拦截规则。
内容的提问来源于stack exchange,提问作者techkuz
相关产品推荐
相关产品推荐

