GitLab CI规则异常:未修改源码却触发任务,求排查原因
GitLab CI规则问题分析与修复
问题根源
你遇到的触发异常和规则顺序直接相关,GitLab CI的规则是从上到下依次匹配,一旦匹配到符合条件的规则就停止后续检查。你的第三条when: never规则放在最后,导致分支有打开的MR时,分支流水线会先匹配前两条规则,跳过了阻止逻辑。
为什么非src目录提交会触发任务?
当分支存在打开的MR时,你提交代码会同时触发MR流水线和分支流水线:
- MR流水线会匹配第一条规则,但你这次没改src,所以不会触发任务;
- 分支流水线会先匹配第二条规则(
CI_COMMIT_BRANCH存在),如果此时changes检查出现误判(比如分支是首次提交,GitLab会将当前提交与默认分支对比,若默认分支有src目录,会被误判为src有变更;或者流水线缓存的对比记录异常),就会触发任务,而第三条阻止规则根本没机会被执行。
规则调整方案
必须将第三条规则移到最前面,优先阻止有MR的分支流水线运行任务。调整后的规则如下:
rules: - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS when: never - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - src/**/* - if: $CI_COMMIT_BRANCH changes: - src/**/*
调整后的逻辑
- 优先阻止重复流水线:如果是分支流水线且有打开的MR,直接跳过任务,避免分支和MR流水线重复运行;
- MR流水线触发条件:仅当MR事件且src目录有变更时,运行任务;
- 无MR分支的触发条件:仅当分支无打开的MR且src目录有变更时,运行任务。
额外优化建议
如果仍出现changes误判,可明确指定对比当前提交的上一次提交,避免与默认分支对比:
changes: - src/**/* compare_to: $CI_COMMIT_BEFORE_SHA
内容的提问来源于stack exchange,提问作者Edward Petersen
相关产品推荐
相关产品推荐

