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

GitLab CI问题:dev合并到release分支无法触发流水线作业

问题分析与解决方案

问题根源

你的build-composer作业在dev合并到release/*分支时未触发,核心原因有两个:

  1. 合并dev到release/*后,触发的是目标分支(release/*)的push类型流水线,但你第二条规则限定了$CI_PIPELINE_SOURCE == "merge_request_event"(仅针对MR期间的流水线),同时$CI_MERGE_REQUEST_STATE == "merged"的条件在合并后的push流水线中不生效——此时流水线源已变为push,不再属于MR事件。
  2. 你尝试的== "release/**"写法无效,GitLab CI的==不支持**通配符,分支匹配必须用正则表达式配合=~。

修正后的配置

根据你的需求,分两种场景提供配置:

场景1:合并到release分支后触发作业

如果希望在dev合并到release/*分支完成后,触发release/*分支流水线中的build-composer作业,使用以下配置:

build-composer:
  stage: build-app
  image:
    name: $PHP_IMAGE
    entrypoint: [""]
  script:
    - composer install
  artifacts:
    paths:
      - vendor/
    expire_in: 1h
  rules:
    # dev分支的push流水线触发作业
    - if: '$CI_COMMIT_BRANCH == "dev" && $CI_COMMIT_TAG == null'
      when: always
    # release/*分支的push流水线触发作业(覆盖dev合并到release后的场景)
    - if: '$CI_COMMIT_BRANCH =~ /^release\/.*$/ && $CI_COMMIT_TAG == null'
      when: always
    # feature合并到dev的MR完成后触发(可保留,也可删除——第一条规则已覆盖dev分支的push场景)
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature\/.*$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" && $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_STATE == "merged"'
      when: always

场景2:MR打开期间就触发作业

如果希望在dev合并到release/*的MR**未合并时(比如MR验证阶段)**就触发作业,使用以下配置:

build-composer:
  stage: build-app
  image:
    name: $PHP_IMAGE
    entrypoint: [""]
  script:
    - composer install
  artifacts:
    paths:
      - vendor/
    expire_in: 1h
  rules:
    - if: '$CI_COMMIT_BRANCH == "dev" && $CI_COMMIT_TAG == null'
      when: always
    # MR打开时,dev合并到release分支触发作业
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "dev" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release\/.*$/ && $CI_PIPELINE_SOURCE == "merge_request_event"'
      when: always
    # MR打开时,feature合并到dev分支触发作业
    - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature\/.*$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev" && $CI_PIPELINE_SOURCE == "merge_request_event"'
      when: always

关键说明

  • 正则表达式/^release\/.*$/是匹配所有release/开头分支的正确写法,不要用== "release/**"这种无效写法。
  • $CI_MERGE_REQUEST_STATE == "merged"仅在MR刚完成合并的瞬间生效,后续目标分支的流水线都是push类型,该条件不再适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:18:18