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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:20:28