Jenkins Pipeline设置wait为false时build任务返回null对象问题
Jenkins流水线build函数wait:false时获取RunWrapper对象的解决方案
当你在Jenkins流水线中使用build步骤触发任务时,wait: true会返回有效的RunWrapper对象,但wait: false返回null是Jenkins的预期行为——因为异步触发时,流水线不会等待目标任务完成初始化,此时Jenkins还未生成对应的构建实例,自然无法返回有效对象。不过可以通过以下方法获取异步触发后的RunWrapper:
原因说明
wait: true:流水线会阻塞至目标任务启动并进入可追踪状态,此时Jenkins已生成完整的RunWrapper实例,因此能正常返回。wait: false:流水线触发任务后立即继续执行,此时目标任务可能还在启动流程中,没有生成可被获取的构建实例,所以build步骤返回null。
解决方案
方法1:触发后获取最新构建(适合无并发构建场景)
通过Jenkins实例获取目标任务对象,再获取其最新构建。注意添加短暂等待,避免因异步延迟拿到旧构建:
stage('Trigger Another Job Without Wait') { steps { script { // 异步触发任务 build(job: 'Triggered_Job', wait: false) // 获取目标任务对象 def targetJob = Jenkins.instance.getItemByFullName('Triggered_Job') // 短暂等待构建实例生成(时间可根据实际调整) sleep(2) def triggeredRun = targetJob.getLastBuild() echo "触发的构建号:${triggeredRun.number}" echo "对象类型:${triggeredRun.getClass()}" } } }
方法2:循环等待新构建生成(更可靠)
记录触发前的最后构建号,循环等待新构建出现,避免固定sleep的不确定性,同时添加超时防止无限等待:
stage('Trigger Another Job Without Wait') { steps { script { def jobName = 'Triggered_Job' def targetJob = Jenkins.instance.getItemByFullName(jobName) // 记录触发前的最新构建号(无构建时设为0) def lastBuildNumBefore = targetJob.getLastBuild()?.number ?: 0 // 异步触发任务 build(job: jobName, wait: false) // 循环等待新构建生成,超时10秒 def triggeredRun = null timeout(time: 10, unit: 'SECONDS') { while (true) { triggeredRun = targetJob.getLastBuild() if (triggeredRun?.number > lastBuildNumBefore) { break } sleep(1) } } echo "触发的构建号:${triggeredRun.number}" echo "对象类型:${triggeredRun.getClass()}" } } }
注意事项
- 确保流水线执行用户拥有
Overall/Read和目标任务的Job/Read权限,否则无法通过Jenkins.instance获取任务对象。 - 如果目标任务存在并发构建,
getLastBuild()可能获取到其他触发的构建,这种场景可以通过给目标任务传递唯一标识参数,再遍历构建列表匹配该参数来定位目标构建。
内容的提问来源于stack exchange,提问作者Karim Lechguy
相关产品推荐
相关产品推荐

