GitLab Pipeline无限循环问题求助:合并后终止流水线触发
GitLab Pipeline 无限循环问题解决方案
核心修改点
针对master分支合并后流水线无限循环的问题,本质是bump_version生成的版本提交和标签会重新触发流水线,以下是针对性的规则调整:
限制
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"'调整
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"'确保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
相关产品推荐
相关产品推荐

