使用GitLab CI的extends时,rules是合并还是覆盖?
GitLab CI extends 中 rules 的行为:覆盖而非合并
首先明确结论:GitLab CI 里,当子 job 通过 extends 继承父 job,且两者都定义了 rules 时,子 job 的 rules 会完全覆盖父 job 的 rules,父 job 的规则不会被保留。你遇到的「规则[1][2]仍生效」的情况,大概率是其他因素导致的误解,而非规则被合并。
可能的原因及排查方向
- 流水线配置未更新:旧的配置可能被缓存,导致新的
rules未生效。尝试手动重新触发流水线,确保使用的是最新的.gitlab-ci.yml配置。 - 条件变量重叠满足:比如
$OTHER_CONDITION和父规则的$CI_COMMIT_TAG/提交消息规则同时成立,让你误以为父规则在生效。可以查看流水线日志中该 job 的「触发原因」,确认实际触发的是哪条规则。 - 配置缩进错误:检查
testjob 的rules缩进是否正确。如果缩进层级不对,可能导致rules未被识别为子 job 的配置,反而意外继承了父 job 的规则。
验证方法
修改 test job 的 rules 为一个绝对不会满足的条件,比如:
test: extends: - .base rules: - if: $CI_COMMIT_BRANCH == 'this-branch-does-not-exist'
如果此时 job 仍被触发,说明配置存在书写错误;如果 job 不再触发,说明之前的问题是因为多个规则条件同时满足导致的误解。
内容的提问来源于stack exchange,提问作者wendy wang
相关产品推荐
相关产品推荐

