Jenkins声明式流水线:如何拉取GitHub最新提交且避免重复调度?
Jenkins声明式流水线解决重复构建与拉取最新代码问题
需求1:队列中有等待任务时不再调度新构建
要解决pollSCM重复触发构建导致队列积压的问题,可通过两个核心配置实现:
disableConcurrentBuilds():禁止同一任务同时运行多个实例,确保只有一个构建在执行,后续请求会进入队列mergeQueuedBuilds():合并队列中重复的构建请求,避免同一任务在队列中存在多个等待实例
将这两个配置添加到流水线的options块中即可:
pipeline { agent { label 'BuildWin6' } options { disableConcurrentBuilds() mergeQueuedBuilds() } triggers { pollSCM '*/10 * * * *' } // ... 后续阶段 }
配置后,当队列中已有该任务的等待实例时,新的pollSCM触发请求会被合并,不会新增队列任务;同时同一时间只会有一个构建在运行,避免资源浪费。
需求2:任务运行时始终拉取所有仓库的最新提交
你尝试的LocalBranch: '**'可让本地分支与远程分支保持同名跟踪,但要确保每次拉取绝对最新的代码,还需添加CleanCheckout扩展,强制清空本地工作区后重新拉取远程最新提交,避免本地缓存的旧代码影响构建。
修改后的Checkout阶段示例如下:
stage('Checkout') { steps { dir('production') { checkout([ $class: 'GitSCM', branches: [[name: '*/main']], extensions: [ [$class: 'LocalBranch', localBranch: '**'], [$class: 'CleanCheckout'] // 强制清空后拉取最新代码 ], userRemoteConfigs: [[credentialsId: 'b342365f-2641-4fe7-a77d-e4378431434f', url: 'git@github.com:Company/Project']] ]) } dir('test-core') { checkout([ $class: 'GitSCM', branches: [[name: '*/main']], extensions: [ [$class: 'LocalBranch', localBranch: '**'], [$class: 'CleanCheckout'] ], userRemoteConfigs: [[credentialsId: 'b342365f-2641-4fe7-a77d-e4378431434f', url: 'git@github.com:Company/Project-test-core.git']] ]) } } }
补充说明
CleanCheckout会删除本地工作区的所有文件后重新拉取,确保完全同步远程最新状态,适合构建耗时较长、对代码一致性要求高的场景- 如果担心
CleanCheckout带来的拉取时间成本,可替换为[$class: 'PruneStaleBranch']和[$class: 'FetchChangeLog', depth: 0]组合,前者清理本地过时分支,后者拉取完整的提交历史,也能保证获取最新代码但避免完全清空工作区
内容的提问来源于stack exchange,提问作者Paavo
相关产品推荐
相关产品推荐

