GitLab CI/CD规则配置问题:MR中排除指定文件变更时任务异常
问题
需要实现linting_js作业仅在合并请求(MR)中、且未修改my-folder下文件及.gitlab-ci.yml时运行,初始配置如下:
模板作业.test:
.test: stage: test image: $DOCKER_IMAGE rules: - if: '$CI_MERGE_REQUEST_APPROVED == "true"' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - changes: - "my-folder/**/*" - ".gitlab-ci.yml" when: never allow_failure: false
继承模板的linting_js作业:
linting_js: extends: - .test script: - yarn install - yarn run lint
但实际运行不符合预期:修改my-folder下文件时,作业仍会执行。
调整规则配置后:
.test: stage: test image: $DOCKER_IMAGE rules: - if: '$CI_MERGE_REQUEST_APPROVED == "true"' when: never - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: - ':!.gitlab-ci.yml' - ':!my-folder/**/*' when: always allow_failure: false
新问题出现:修改指定文件时作业不再运行,但修改其他文件或无变更时,流水线卡在“检查流水线”状态无法启动。
解决方案
正确的规则配置
调整.test模板的rules,按优先级顺序匹配条件,确保逻辑符合需求:
.test: stage: test image: $DOCKER_IMAGE rules: # MR已批准时,直接跳过作业 - if: '$CI_MERGE_REQUEST_APPROVED == "true"' when: never # MR中修改了指定文件时,跳过作业 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: - "my-folder/**/*" - ".gitlab-ci.yml" when: never # 其余MR场景(未修改指定文件、无文件变更),运行作业 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: always # 非MR场景,直接跳过作业 - when: never
配置说明
初始配置问题:
原配置中,changes规则未与CI_PIPELINE_SOURCE == "merge_request_event"绑定,导致规则匹配顺序错乱——只要是MR事件,第二条规则就会先匹配成功,直接运行作业,后续的changes规则不会生效。调整后配置问题:
GitLab CI的changes不支持直接用:!否定模式来表达“未修改指定文件”,尤其是当MR无文件变更时,这种写法会让GitLab无法判断条件是否满足,进而导致流水线卡住。正确逻辑的核心:
按优先级从上到下匹配:先排除已批准的MR,再排除修改了指定文件的MR,最后匹配所有其余MR场景运行作业,非MR场景直接跳过。
内容的提问来源于stack exchange,提问作者french_dev
相关产品推荐
相关产品推荐

