如何配置CI/CD:仅触发最新提交流水线或取消旧流水线避免冲突
解决短时间多提交触发重复CI/CD流水线的问题
针对你提出的需求——要么设置提交缓冲只触发最新提交的流水线,要么启动新流水线时自动取消未完成的旧流水线,下面按主流CI/CD工具给出具体实现方案:
一、GitLab CI
1. 设置1分钟缓冲,仅触发最新提交的流水线
在.gitlab-ci.yml里通过workflow规则配置延迟触发,同时覆盖之前的延迟任务:
workflow: rules: - if: '$CI_COMMIT_BRANCH' when: delayed start_in: 1 minute allow_failure: false # 自动覆盖同分支之前的延迟任务 - when: never # 你的流水线任务示例 build: script: - echo "执行构建任务..."
配置后,1分钟内的所有提交只会触发最后一次的流水线,之前的延迟任务会被自动替换。
2. 启动新流水线时取消旧流水线
在流水线最开始加一个前置任务,用GitLab API取消当前分支所有未完成的旧流水线:
cancel_old_pipelines: stage: .pre script: - | curl --request POST --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines?status=running&status=pending&ref=$CI_COMMIT_BRANCH" \ | jq -r '.[] | .id' | xargs -I {} curl --request POST --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/{}/cancel" image: curlimages/curl:latest before_script: - apk add --no-cache jq only: - branches build: stage: build script: - echo "执行构建任务..."
二、GitHub Actions
GitHub Actions直接用concurrency配置就能实现“新流水线启动即取消旧流水线”的效果,简单直接:
name: CI on: [push] concurrency: group: ${{ github.ref }} # 按分支分组 cancel-in-progress: true # 启动新流水线时自动取消同分支正在运行的旧流水线 jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build run: echo "执行构建任务..."
三、Jenkins
1. 设置1分钟缓冲,仅触发最新提交的流水线
在Jenkinsfile里配置静默期+禁用并行构建,静默期内的新提交会替换旧的构建请求:
pipeline { agent any options { quietPeriod 60 // 1分钟静默期 disableConcurrentBuilds() // 禁止同分支并行构建 } stages { stage('Build') { steps { echo '执行构建任务...' } } } }
2. 启动新流水线时取消旧流水线
在流水线开头加脚本,停止当前任务下所有正在运行的旧构建:
pipeline { agent any stages { stage('取消旧构建') { steps { script { def job = Jenkins.instance.getItemByFullName(env.JOB_NAME) job.builds.each { build -> if (build.isBuilding() && build.number != currentBuild.number) { build.stop() echo "已取消旧构建 #${build.number}" } } } } } stage('Build') { steps { echo '执行构建任务...' } } } }
内容的提问来源于stack exchange,提问作者amd
相关产品推荐
相关产品推荐

