You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:18:03