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

GitLab 13:如何仅在Merge Request运行Stage并避免合并后重复执行

GitLab 13解决MR合并后触发流水线的问题

你遇到的问题是GitLab默认会在MR合并到目标分支后触发该分支的流水线,而你希望只有MR创建/更新时才执行指定Stage。针对GitLab 13版本,以下是几种简便解决方案:

方案1:用rules精确限定仅MR事件触发(推荐)

GitLab 13开始支持rules语法,比only/except更灵活。通过判断CI_PIPELINE_SOURCE变量,仅在MR创建或更新事件中运行该job,合并后的推送流水线(source为push)会被排除:

lint-backend:
  image: maven:3.8.1-openjdk-17-slim
  stage: lint-backend
  allow_failure: false
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - "backend/**/*"
      when: always
    - when: never
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
    GIT_DEPTH: "0"
  script:
    - echo "test"

方案2:强化only规则,添加MR专属变量限定

在原有only配置中加入CI_MERGE_REQUEST_ID变量判断,只有MR流水线会携带这个变量,进一步避免误触发:

lint-backend:
  image: maven:3.8.1-openjdk-17-slim
  stage: lint-backend
  allow_failure: false
  only:
    refs:
      - merge_requests
    variables:
      - $CI_MERGE_REQUEST_ID
    changes:
      - "backend/**/*"    
  except:
    - develop
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
    GIT_DEPTH: "0"
  script:
    - echo "test"

方案3:项目级设置禁止合并后触发流水线

如果希望合并到目标分支后完全不触发流水线,可进入项目设置 > CI/CD > 流水线,找到「流水线触发规则」,添加规则:当分支为目标分支(如develop)且推送来自MR合并时,禁止触发流水线。此方法为全局设置,会影响所有job。

说明

当前你的only: merge_requests配置已经能保证该job仅在MR流水线中运行,合并后的分支流水线不会执行这个job。你看到的新流水线是目标分支的推送流水线,若只是不想让该job在其中运行,方案1或2即可解决;若想完全阻止合并后的流水线触发,用方案3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:20:30