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

如何通过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属性就是视图中显示的真实BuildNumber
  • job.fullName:使用Job的完整名称(包含文件夹路径),可以避免同名Job的冲突问题
  • 两种方法都能直接拿到可用于终止构建的有效参数,无需再解析对象哈希值

内容的提问来源于stack exchange,提问作者IFThenElse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:25:15