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

如何配置Gitlab CI规则实现MR与源分支流水线二选一且展示Sonar结果

核心问题原因

  1. GitLab CI 中 rules 与 only/except 不支持混用,rules 优先级更高,你之前写的 except 配置完全不生效,必须全部整合到 rules 逻辑中。
  2. 当你给已关联开放MR的分支推送代码时,GitLab会同时生成两类事件:push 事件(对应分支代码提交)、merge_request_event 事件(对应MR内容更新),你原来的规则会同时命中两个if条件,所以会触发两条流水线。

解决方案

你可以用GitLab内置变量CI_OPEN_MERGE_REQUESTS判断当前分支是否存在已开放的MR,只要该变量不为空,就说明当前分支已经关联了MR,此时不需要触发push对应的特性分支流水线,同时把原来的except逻辑全部整合到rules判断中。

调整后的配置示例

deploy:
  stage: deployment
  when: manual
  rules:
    # 匹配MR场景:触发分离式流水线,同时排除main分支、tag提交
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CUSTOM_VARIABLE == "true" && $CI_TARGET_BRANCH_NAME != "main" && $CI_COMMIT_TAG == null'
      when: on_success
    # 匹配无MR的分支推送场景:仅当前分支无开放MR、不是main分支、不是tag提交时触发
    - if: '$CI_PIPELINE_SOURCE == "push" && $CUSTOM_VARIABLE == "true" && $CI_OPEN_MERGE_REQUESTS == null && $CI_COMMIT_BRANCH != "main" && $CI_COMMIT_TAG == null'
      when: on_success
    # 兜底:其他所有场景都不执行该job
    - when: never
  script:
    - ....
    - ....

规则逻辑说明

  • 规则按从上到下的顺序匹配,命中第一个规则后就不会继续判断后续规则
  • MR场景的规则优先匹配,只要是MR事件就走第一条逻辑,不会走到push的规则
  • push场景的规则增加了$CI_OPEN_MERGE_REQUESTS == null的判断,只要分支已经关联了开放MR,就不会触发push对应的流水线
  • 原except: [tags, main]的逻辑通过$CI_COMMIT_TAG == null、$CI_COMMIT_BRANCH != "main"/$CI_TARGET_BRANCH_NAME != "main"实现,完全覆盖原有except的效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:54:06