我一直试图在Groovy scriptler脚本中找到一个轻量级的方法来列出所有当前正在运行的任何类型的作业。我发现唯一可靠的方法是:
start = System.currentTimeMillis()
def jobsFound = []
def buildingJobs = Jenkins.instance.getAllItems(Job.class).findAll {
it.isBuilding()
}
buildingJobs.each { job->
allRuns = job._getRuns()
allRuns.each { item->
if (!item.isBuilding()) { return } // This job is not building
jobsFound.push(item.getUrl())
}
}
timespent = (System.currentTimeMillis() - start ) / 1000
println "Time: ${timespent} seconds"
println "{jobsFound.size} jobs"
// RESULTS:
// Time: 2.015 seconds. 15 jobs
问题是上面列举了所有当前正在运行的作业--我们有数千个!--然后列举了每个正在运行的作业的所有构建版本(一些作业有多达300个构建版本)。上面可能需要长达5分钟才能完成,这取决于当前正在构建的作业数量。
更有效的方法是枚举活动执行器,但此方法会遗漏在主服务器上运行的管道(也称为工作流)作业:
start = System.currentTimeMillis()
def busyExecutors = Jenkins.instance.computers.collect {
c -> c.executors.findAll { it.isBusy() }
}.flatten()
def jobsFound = []
busyExecutors.each { e ->
job = e.getCurrentExecutable()
jobsFound.push(job.getUrl())
}
timespent = (System.currentTimeMillis() - start ) / 1000
println "Time: ${timespent} seconds. ${jobsFound.size} jobs"
// RESULTS:
// Time: 0.005 seconds. 12 jobs
果然,两个计数之间的差异是在主服务器上运行的管道作业。
我想我的问题可以归结为:
是否有一种方法可以有效地枚举master上运行的所有作业?
很明显,Jenkins没有在computers
中包含master,尽管有一个MasterComputer
类,但不清楚如何获得它或运行flyweight(管道)作业的OffByOneExecutors
。
1条答案
按热度按时间ejk8hzay1#
不直接使用Jenkins类型/对象,而是通过从From Jenkins, how do I get a list of the currently running jobs in JSON?派生的Jenkins的Remote access API:
结果:
不幸的是,我猜应该是指节点的
<builtOn/>
,在我的Jenkins v2.60.1中没有提供(还没有?)。具有:
您将获得:
您可以使用以下命令进行筛选: