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

GitLab CI如何仅在向默认分支合并时检查指定文件变更

问题1:现有配置逻辑是否正确?

不正确,你对changes关键字的作用存在误解:

  • 当前配置的实际逻辑是:只有当向main分支发起的MR同时修改了这3个文件时,check_version job才会执行。如果MR完全没改这3个文件,这个job根本不会加入流水线,等于完全没做版本号校验,完全不符合你的需求。
  • changes关键字的作用是控制「job是否被加入流水线」,不是「在job里检查指定文件是否变更」。

问题2:其他分支正常运行配置、GitLab CI规则的「else」实现

GitLab CI没有原生的else关键字,但规则是从上到下顺序匹配的,匹配到第一条符合的规则就会采用对应配置,没有匹配到任何规则的job默认不会执行,也可以通过when: never实现否定逻辑。

正确配置方案

第一步:调整check_version规则

你需要的逻辑是「只要是向main发起的MR,就必须执行版本号校验」,校验逻辑写在script里:

check_version:
  stage: test
  rules:
    # 仅在向默认分支发起MR时执行这个job,其他情况不执行
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
      when: always
  script:
    # 在这里写校验逻辑,对比源分支和目标分支的三个文件版本号是否修改
    # 示例逻辑:如果三个文件的版本号和目标分支完全一致,就返回非0退出码,让job失败
    - |
      # 校验composer.json的version字段
      OLD_VER=$(git show $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:composer.json | grep -oP '"version":\s*"\K[^"]+')
      NEW_VER=$(grep -oP '"version":\s*"\K[^"]+' composer.json)
      if [ "$OLD_VER" = "$NEW_VER" ]; then
        echo "错误:composer.json版本号未更新"
        exit 1
      fi
      # 同理补充resources/index.php、Doxyfile的版本号校验逻辑

第二步:其他分支正常推送、MR的配置

如果你需要其他分支推送、向非main分支发起MR时也正常跑单元测试,给unit_test补充规则即可,示例:

unit_test:
  stage: test
  script:
    # run UT
  rules:
    # 所有推送、所有MR事件都跑单元测试
    - if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "merge_request_event"'

你现有deploy的规则已经仅在main分支推送时执行,不会影响其他分支。

内容的提问来源于stack exchange,提问作者SteeveDroz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:27:03