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原生配置即可实现:
- 在项目设置的「合并请求」板块,勾选「流水线必须成功才能合并」,同时开启「合并后执行流水线」
- 修改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合并提交的模板,默认带上源分支名:
- 在项目设置的「合并请求」-「默认合并提交模板」中新增源分支变量,模板修改为:
Merge branch '%{source_branch}' into '%{target_branch}' %{title} %{issues} See merge request %{reference} Source branch: %{source_branch} - 新增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
相关产品推荐
相关产品推荐

