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

GitLab CI合并MR后无法识别hotfix源分支 流水线规则匹配失效

问题根因

CI_MERGE_REQUEST_SOURCE_BRANCH_NAME 变量仅在类型为merge_request_event的流水线中存在,MR合并完成后触发的是master分支的push事件流水线,不会携带任何MR关联的源分支变量,所以原有规则后半段无法生效。另外你原有规则里还存在拼写错误,把master误写为mater,就算变量存在也会导致后半段判断失效,注意修正。

可行解决方案

下面提供两种落地成本最低的实现方案:

方案1:使用MR合并后流水线(推荐)

不用依赖master的push事件流水线,直接在MR的合并请求流水线中新增合并后执行的阶段,依赖GitLab原生配置即可实现:

  1. 在项目设置的「合并请求」板块,勾选「流水线必须成功才能合并」,同时开启「合并后执行流水线」
  2. 修改rules规则如下,覆盖MR全生命周期的hotfix分支判断逻辑:
rules:
  # MR创建、更新时触发的hotfix校验流水线
  - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^hotfix\/.*$/'
    when: always
    variables:
      PIPELINE_TYPE: hotfix-mr-validate
  # MR合并通过后自动触发的hotfix部署流水线
  - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^hotfix\/.*$/ && $CI_MERGE_REQUEST_APPROVED == "true"'
    when: always
    variables:
      PIPELINE_TYPE: hotfix-mr-merged

这种方案不需要修改提交规则,完全依赖GitLab原生变量就能实现,而且hotfix的独立流水线可以和普通master分支的push流水线做完全隔离。

方案2:通过合并提交信息判断源分支

如果一定要在master的push流水线中判断提交是否来自hotfix分支,可以修改MR合并提交的模板,默认带上源分支名:

  1. 在项目设置的「合并请求」-「默认合并提交模板」中新增源分支变量,模板修改为:
    Merge branch '%{source_branch}' into '%{target_branch}'
    
    %{title}
    
    %{issues}
    
    See merge request %{reference}
    Source branch: %{source_branch}
    
  2. 新增master分支push事件的判断规则,匹配提交信息里的Source branch字段:
rules:
  # 原有MR阶段的规则保留
  - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^hotfix\/.*$/'
  # 新增master push事件的判断规则
  - if: '$CI_COMMIT_REF_NAME == "master" && $CI_COMMIT_MESSAGE =~ /Source branch: hotfix\/.*/'

这种方案适合需要在master push流水线中嵌入hotfix特殊逻辑的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:57:01