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

GitLab Pipeline无限循环问题求助:合并后终止流水线触发

GitLab Pipeline 无限循环问题解决方案

核心修改点

针对master分支合并后流水线无限循环的问题,本质是bump_version生成的版本提交和标签会重新触发流水线,以下是针对性的规则调整:

  1. 限制bump_version仅在非版本提交、非标签的master推送事件中运行
    给bump_version添加标签排除条件,并明确仅响应master分支的push事件,避免标签或版本提交触发该任务:

    bump_version:
      stage: bump_version
      image: bump2version
      script:
        - git remote set-url ...
        - bump2version $VERSION_PART --current-version $(grep -oP '__VERSION__ = "\K[0-9.]+(?=")' app/meta.py) app/meta.py
        - git push origin HEAD:master --tags
      artifacts:
        paths:
          - app/meta.py
      rules:
        - if: $CI_COMMIT_MESSAGE =~ /^Bump\ version:/
          when: never
        - if: $CI_COMMIT_TAG
          when: never
        - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
    
  2. 调整build-prod的触发规则,避免循环
    移除标签触发条件,同时排除版本提交触发,确保仅在初始的master合并推送时运行:

    build-prod:
      stage: build
      image:
        name: gcr.io/kaniko-project/executor:v1.14.0-debug
        entrypoint: [""]
      before_script:
        - ....
      script:
        - |
          new_version=$(grep -o '__VERSION__ = "[0-9.]\+"' app/meta.py | sed 's/__VERSION__ = "//;s/"//')
          /kaniko/executor ...."
      dependencies:
        - bump_version
      artifacts:
        paths:
          - app/meta.py
      rules:
        - if: $CI_COMMIT_MESSAGE =~ /^Bump\ version:/
          when: never
        - if: $CI_COMMIT_TAG
          when: never
        - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
    
  3. 确保MR提交时仅运行测试相关任务
    修改.python_job的规则,仅保留MR事件触发,让lint和test只在MR提交时运行:

    .python_job:
      image: ....
      interruptible: true
      rules:
        - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    
    test:
      stage: test
      script:
        - make coverage
      rules:
        - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    

修改后完整配置

stages:
  - build-ci-image
  - lint
  - test
  - bump_version
  - build
  - deploy

variables:

build_ci_image:
  stage: build-ci-image
  image:
    name: gcr.io/kaniko-project/executor:v1.14.0-debug
    entrypoint: [""]
  script:
    - /kaniko/executor ...."
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - docker/Dockerfile
        - requirements.dev.txt
        - requirements.txt

.python_job:
  image: ....
  interruptible: true
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

lint:
  stage: lint
  extends: .python_job
  script:
    - make lint

test:
  stage: test
  script:
    - make coverage
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

bump_version:
  stage: bump_version
  image: bump2version
  script:
    - git remote set-url ...
    - bump2version $VERSION_PART --current-version $(grep -oP '__VERSION__ = "\K[0-9.]+(?=")' app/meta.py) app/meta.py
    - git push origin HEAD:master --tags
  artifacts:
    paths:
      - app/meta.py
  rules:
    - if: $CI_COMMIT_MESSAGE =~ /^Bump\ version:/
      when: never
    - if: $CI_COMMIT_TAG
      when: never
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'

build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:v1.14.0-debug
    entrypoint: [""]
  before_script:
    - ....
  script:
    - /kaniko/executor ..."
  rules:
    - if: '$CI_COMMIT_BRANCH == "dev"'
    - if: '$CI_COMMIT_TAG'

build-prod:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:v1.14.0-debug
    entrypoint: [""]
  before_script:
    - ....
  script:
    - |
      new_version=$(grep -o '__VERSION__ = "[0-9.]\+"' app/meta.py | sed 's/__VERSION__ = "//;s/"//')
      /kaniko/executor ...."
  dependencies:
    - bump_version
  artifacts:
    paths:
      - app/meta.py
  rules:
    - if: $CI_COMMIT_MESSAGE =~ /^Bump\ version:/
      when: never
    - if: $CI_COMMIT_TAG
      when: never
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'

deploy-staging:
  stage: deploy
  environment:
    name: staging
    url: 
  image:
    name: bitnami/kubectl:latest
    entrypoint: ['']
  script:
    - kubectl ....
  rules:
    - if: $CI_COMMIT_BRANCH == "dev"
    - if: '$CI_COMMIT_TAG'

原理说明

  • 排除CI_COMMIT_TAG:bump_version生成的版本标签会触发新流水线,通过when: never跳过相关任务
  • 排除版本提交消息:bump2version生成的提交消息以Bump version:开头,这类提交触发的流水线会跳过bump_version和build-prod,避免循环
  • 严格限制MR任务:仅在merge_request_event时运行lint和test,符合MR提交时仅验证变更的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:45:01