如何配置Gitlab CI规则实现MR与源分支流水线二选一且展示Sonar结果
核心问题原因
- GitLab CI 中
rules与only/except不支持混用,rules优先级更高,你之前写的except配置完全不生效,必须全部整合到rules逻辑中。 - 当你给已关联开放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
相关产品推荐
相关产品推荐

