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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:15:44