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

如何仅限制Jenkins特定分支的并发构建?

解决Jenkins多分支流水线的分支级并发控制问题

嘿,这个需求我太熟悉了!之前帮团队调整多分支流水线时也遇到过一模一样的困扰——既要让PR分支随便跑不阻塞,又得把staging测试的并发牢牢管住。下面给你两个实用的方案,亲测有效:

方案1:针对Staging阶段加全局锁(推荐)

这个方法最精准,只限制Staging Test阶段的并发,完全不影响PR分支的构建速度。核心是用Jenkins的lock步骤,给staging阶段加一个全局唯一的锁,确保同一时间只有一个staging任务能执行。

注意事项

首先得确保你的Jenkins安装了Lockable Resources插件(没装的话去插件市场搜一下安装就行)。

代码示例

pipeline {
    agent any
    stages {
        stage('PR Build') {
            when {
                changeRequest() // 匹配所有PR分支
            }
            steps {
                echo "开始PR构建:${env.CHANGE_BRANCH}"
                // 你的PR构建逻辑:编译、单元测试等
            }
        }

        stage('Staging Test') {
            when {
                branch 'staging' // 匹配你的staging分支,也可以用正则比如~/(staging|pre-prod)/
            }
            steps {
                // 加全局锁,所有staging任务都会抢这个锁
                lock(resource: 'staging-test-exclusive-lock', inversePrecedence: true) {
                    echo "启动Staging测试,当前唯一运行的任务"
                    // 你的staging测试逻辑:部署、集成测试、冒烟测试等
                    sleep 120 // 模拟测试耗时
                }
            }
        }

        stage('Production Release') {
            when {
                branch 'main'
            }
            steps {
                echo "开始生产发布"
                // 你的生产发布逻辑
            }
        }
    }
}

这个方案的好处是:PR分支的构建完全不受影响,哪怕有10个PR同时跑都没问题;而所有staging分支的测试阶段会自动串行,绝对不会出现同时运行的情况。

方案2:分支级别的全局并发控制

如果你的需求是整个staging分支的流水线都不能并发(比如staging的部署+测试全流程都要串行),可以通过分支判断来动态启用disableConcurrentBuilds()。

代码示例

pipeline {
    agent any
    options {
        // 根据分支动态设置并发控制
        script {
            def isStagingBranch = env.BRANCH_NAME == 'staging' || env.BRANCH_NAME =~ /release\/.*/
            if (isStagingBranch) {
                disableConcurrentBuilds(abortPrevious: true) // 可选:如果有新的staging任务启动,终止旧的
            }
        }
    }
    stages {
        // 你的各个阶段逻辑和之前一样
        stage('PR Build') {
            when { changeRequest() }
            steps { /* ... */ }
        }
        stage('Staging Test') {
            when { branch 'staging' }
            steps { /* ... */ }
        }
        // ...
    }
}

这个方案会让整个staging分支的流水线不能并发,但PR分支依然可以正常并行构建。不过要注意:如果staging流水线的某个阶段耗时很长,后续的staging任务会排队,但PR任务不受影响。

总结

  • 优先选方案1,因为它更精准,只管控需要限制的阶段,对PR构建的影响为0;
  • 方案2适合staging全流程都需要串行的场景,配置更简单。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:37:58