GitLab CI配置中rules的If/Changes条件未按预期生效问题
问题根因
- 你配置的
.ci_rules共包含3条匹配规则,GitLab CI会按从上到下的顺序依次匹配,只要命中任意一条就会触发作业 - 最后2条匹配
develop、main分支的规则没有添加changes限制,只要是推送到这两个分支的提交,无论修改什么文件都会命中规则,导致lint作业被触发 - 你的需求是仅合并请求流水线且有py文件变更时才运行作业,这两条分支匹配规则本身就不符合需求,属于多余配置
解决方案
方案1:调整通用规则(如果其他作业也不需要在main/develop分支推送时触发)
直接删除.ci_rules中多余的2条分支匹配规则即可,修正后的配置如下:
image: python:3.7 stages: - pre-build - test .ci_rules: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_IID' changes: - tests/*.py - tests/*/*.py - src/*.py - src/*/*.py lint: stage: pre-build script: - pip install flake8 - flake8 rules: - !reference [ .ci_rules, rules ] # [... other jobs not relevant for the issue]
方案2:单独为lint作业配置规则(如果其他作业仍需要用到main/develop分支的匹配规则)
不要给lint作业引用通用的.ci_rules,单独写符合需求的规则即可:
lint: stage: pre-build script: - pip install flake8 - flake8 rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_IID' changes: - tests/*.py - tests/*/*.py - src/*.py - src/*/*.py
补充优化提示:如果需要匹配任意层级的.py文件,可以用**/*.py代替多层的*.py、*/*.py写法,更简洁也不会遗漏深层目录的文件变更
内容的提问来源于stack exchange,提问作者Simon Provost
相关产品推荐
相关产品推荐

