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
相关产品推荐
相关产品推荐

