如何在Jenkins不同代理节点上统一代码检出并支持清理构建?
解决Jenkins多节点一致检出+清理构建的方案
你当前的问题是手动触发checkout scm可能导致不同节点因执行时间差拉取到不同版本,同时需要保留通过CLEAN参数控制的工作区清理功能。解决方案是先在第一个节点捕获流水线对应的固定代码版本,后续所有节点都基于该版本检出,具体实现如下:
pipeline { options { skipDefaultCheckout(true) } agent { label "agent1" } parameters { booleanParam defaultValue: false, description: '执行清理构建', name: 'CLEAN' } def scmCommitId // 存储统一的代码版本标识 stages { stage("Checkout") { steps { script{ if (params.CLEAN){ cleanWs() } // 检出代码并捕获版本信息 def checkoutResult = checkout scm // Git场景下提取commit ID,其他SCM需替换对应字段(如SVN的SVN_REVISION) scmCommitId = checkoutResult.GIT_COMMIT } } } stage("Debian build") { agent { label "debian" } steps { script { if (params.CLEAN){ cleanWs() } // 使用统一的commit ID检出代码 checkout( changelog: false, scm: [ $class: 'GitSCM', userRemoteConfigs: scm.userRemoteConfigs, branches: [[name: scmCommitId]] // 固定检出指定版本 ] ) } } } } }
关键改动说明
- 全局变量
scmCommitId:用于存储流水线启动时对应的代码版本标识,确保所有节点共用同一版本。 - 首个阶段捕获版本:
checkout scm的返回结果包含SCM元数据,Git环境下GIT_COMMIT对应流水线触发时的commit ID(和Jenkins默认自动检出的版本完全一致)。 - 后续节点固定版本检出:不再直接使用
scm参数,而是基于原仓库配置,指定固定的branches为scmCommitId,彻底避免版本不一致问题。 - 保留清理逻辑:
params.CLEAN控制cleanWs()的逻辑完全保留,不影响清理构建功能。
内容的提问来源于stack exchange,提问作者norekhov
相关产品推荐
相关产品推荐

