在Jenkins/Groovy中,如何获取异步触发构建的Build ID?
Jenkins异步触发构建并获取Build ID的方法
在Jenkins流水线中,build(job: 'path/to/job')是阻塞式触发逻辑,会等待构建完成后返回RunWrapper对象;若设置wait: false实现异步触发,却无法获取被触发构建的引用及Build ID。以下是两种可行的解决方法:
方法1:通过Jenkins REST API触发并提取Build ID
借助Jenkins的REST API触发构建,从响应头中直接提取新构建的ID,示例代码如下:
def targetJob = 'path/to/job' // 替换Job路径格式以适配API规则 def apiJobPath = targetJob.replace('/', '/job/') def triggerResult = httpRequest( url: "${env.JENKINS_URL}/job/${apiJobPath}/build", httpMode: 'POST', authentication: 'jenkins-api-credential', // 提前配置好的API凭证ID validResponseCodes: '201' ) // 从响应头的Location字段解析Build ID def buildLocation = triggerResult.headers.find { it.name == 'Location' }.value def buildId = buildLocation.split('/')[-1] echo "已异步触发构建,Build ID:${buildId}"
注意:需要提前安装HTTP Request插件,且流水线运行账号需拥有调用Jenkins API的权限,凭证建议使用「用户名+API Token」组合。
方法2:调用Jenkins内部Java API直接获取Build ID
直接操作Jenkins的Job对象,调度构建后立即获取Build ID,无需等待构建执行完成,示例代码:
def targetJob = Jenkins.instance.getItemByFullName('path/to/job') // 调度构建,0表示无延迟 def futureBuild = targetJob.scheduleBuild2(0, new Cause.UserIdCause()) // 仅等待构建进入队列并分配ID,不会等待构建执行完成 def startedBuild = futureBuild.waitForStart() def buildId = startedBuild.id.toString() echo "已异步触发构建,Build ID:${buildId}"
注意:这种方法需要流水线运行账号拥有Jenkins.Read和Job.Build权限,无需额外安装插件,执行效率更高。
额外提醒
- 两种方法都需做好异常处理,比如捕获Job不存在、权限不足等情况,避免流水线中断。
- 多节点Jenkins环境下,需确保
Jenkins.instance指向正确的主节点。
内容的提问来源于stack exchange,提问作者frans
相关产品推荐
相关产品推荐

