如何配置Jenkins:限制同Pipeline队列构建数与避免重复构建模块
需求1:限制同一Pipeline队列中最多1个构建任务
不用依赖节点级节流,直接通过Throttle Concurrent Builds插件的Job级配置即可实现:
- 打开目标Pipeline的配置页面,找到
Throttle Concurrent Builds选项(未显示需先安装插件) - 勾选
Throttle concurrent builds,选择This project作为节流范围 - 设置
Maximum concurrent builds为1(确保同一时间仅1个构建运行) - 找到
Queue throttling区域,设置Maximum number of builds in queue为1 - 保存配置后,新的构建请求会被拦截,仅当队列无任务时才会进入队列
若不想用插件,也可通过Lockable Resources Plugin配合Pipeline脚本实现:
pipeline { agent any options { disableConcurrentBuilds() } stages { stage('Acquire Queue Lock') { steps { lock(resource: "${JOB_NAME}-queue-lock", inversePrecedence: true) { // 后续构建步骤 } } } } }
该逻辑会确保同一时间仅一个构建能获取锁,新请求会阻塞在队列中,间接实现队列最多1个任务的效果。
需求2:跳过Pipeline中已完成构建的模块
核心思路是通过阶段级条件判断,跳过之前构建中已成功完成的模块,以下是两种可行方案:
方案1:基于历史构建的阶段状态判断
在每个模块构建阶段添加when条件,检查该阶段在上一次成功构建中是否已完成:
pipeline { agent any stages { stage('Build Module A') { when { expression { // 判断上一次构建存在、成功,且当前阶段在上次构建中也成功 !(currentBuild.previousBuild?.result == 'SUCCESS' && currentBuild.previousBuild?.stageResults['Build Module A']?.status == 'SUCCESS') } } steps { sh './build-module-a.sh' } } stage('Build Module B') { when { expression { !(currentBuild.previousBuild?.result == 'SUCCESS' && currentBuild.previousBuild?.stageResults['Build Module B']?.status == 'SUCCESS') } } steps { sh './build-module-b.sh' } } } }
若上一次构建中该模块已成功完成,当前运行会直接跳过此阶段。
方案2:基于代码变更的增量构建
通过git diff判断模块对应代码是否有变更,仅在代码变动时才构建:
pipeline { agent any stages { stage('Check Module A Changes') { steps { script { // 检查Module A目录下的文件是否有变更 moduleAChanged = sh( script: 'git diff --name-only ${currentBuild.previousBuild?.changeSets*.id.join(" ")} -- module-a/', returnStatus: true ) != 0 } } } stage('Build Module A') { when { expression { moduleAChanged } } steps { sh './build-module-a.sh' } } } }
该方案更精准,仅在模块代码有变动时触发构建,避免无意义的重复操作。
内容的提问来源于stack exchange,提问作者Akshat Jain
相关产品推荐
相关产品推荐

