GitLab CI如何仅在向默认分支合并时检查指定文件变更
问题1:现有配置逻辑是否正确?
不正确,你对changes关键字的作用存在误解:
- 当前配置的实际逻辑是:只有当向main分支发起的MR同时修改了这3个文件时,
check_versionjob才会执行。如果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
相关产品推荐
相关产品推荐

