如何通过Jenkins API获取运行中流水线的真实BuildNumber?
Jenkins脚本获取运行中流水线的BuildNumber问题
问题描述
我需要筛选所有当前运行的进程,获取运行中流水线的BuildNumber和JobName来终止这些流水线,但使用Jenkins API收集信息时,返回结果如下:
[(master)]: [org.jenkinsci.plugins.workflow.job.WorkflowJob@6b41187c[myPipeline], org.jenkinsci.plugins.workflow.job.WorkflowJob@6296243a[myDeploy]]
原本以为@6296243a[myDeploy]包含所需信息,但6296243a并非有效BuildNumber(实际是对象哈希码),只有myDeploy是正确的JobName。
当前使用的代码无法获取有效BuildNumber:
import jenkins.model.* import hudson.model.* def result = [] def buildingJobs = Jenkins.instance.getAllItems(Job.class).findAll { it.isBuilding() } println buildingJobs
最终要将信息用于终止构建的代码如下,但使用错误的BuildNumber(如6296243a)无法生效,只有用视图中的真实BuildNumber(如2357)才能正常运行:
Jenkins.instance .getItemByFullName(<JobName>) .getBuildByNumber(<BuildNumber>) .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
请问如何获取真实的BuildNumber?
原因分析
你当前的代码获取的是Job对象,而非正在运行的Build实例:
Jenkins.instance.getAllItems(Job.class)返回的是Jenkins中所有Job的对象实例it.isBuilding()判断的是该Job是否有正在运行的构建,但返回的还是Job对象本身- 输出中的
@6b41187c是Job对象的哈希值,和BuildNumber完全无关
解决方法
需要遍历每个Job的正在运行的Build实例,从Build对象中直接提取number(即真实BuildNumber)和所属Job的名称。
方法一:遍历Job收集运行中Build
import jenkins.model.* import hudson.model.* def runningBuilds = [] // 遍历所有Job,收集每个Job中正在运行的Build Jenkins.instance.getAllItems(Job.class).each { job -> job.getBuilds().each { build -> if (build.isBuilding()) { runningBuilds.add([ jobName: job.fullName, buildNumber: build.number ]) } } } // 打印获取到的信息 runningBuilds.each { entry -> println "JobName: ${entry.jobName}, BuildNumber: ${entry.buildNumber}" } // 批量终止运行中的构建 runningBuilds.each { entry -> Jenkins.instance .getItemByFullName(entry.jobName) .getBuildByNumber(entry.buildNumber) .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")) }
方法二:直接从执行器获取运行中Build(更高效)
如果Jenkins实例中Job数量较多,直接从执行器获取正在运行的任务会更高效:
import jenkins.model.* import hudson.model.* // 获取所有执行器中正在运行的Build def runningBuilds = Jenkins.instance.getComputer().collectMany { computer -> computer.executors.findAll { it.isBusy() }.collect { it.currentExecutable } } + Jenkins.instance.getComputer().collectMany { computer -> computer.oneOffExecutors.findAll { it.isBusy() }.collect { it.currentExecutable } } // 处理每个运行中的Build runningBuilds.each { build -> println "JobName: ${build.parent.fullName}, BuildNumber: ${build.number}" // 终止构建 build.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")) }
关键说明
build.number:Build对象的number属性就是视图中显示的真实BuildNumberjob.fullName:使用Job的完整名称(包含文件夹路径),可以避免同名Job的冲突问题- 两种方法都能直接拿到可用于终止构建的有效参数,无需再解析对象哈希值
内容的提问来源于stack exchange,提问作者IFThenElse
相关产品推荐
相关产品推荐

