如何使用Groovy高效地列出 ** 所有 ** 当前正在Jenkins上运行的作业

hrirmatl  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(182)

我一直试图在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

ejk8hzay

ejk8hzay1#

不直接使用Jenkins类型/对象,而是通过从From Jenkins, how do I get a list of the currently running jobs in JSON?派生的Jenkins的Remote access API

http://localhost:8080/api/xml?&tree=jobs[builds[*]]&xpath=/hudson/job/build[building="true"]&wrapper=builds

结果:

<builds>
    <build _class="hudson.model.FreeStyleBuild">
        <action _class="hudson.model.CauseAction"/>
        <action/>
        <action/>
        <building>true</building>
        <displayName>#10</displayName>
        <duration>0</duration>
        <estimatedDuration>3617</estimatedDuration>
        <executor/>
        <fullDisplayName>Freestyle-Project #10</fullDisplayName>
        <id>10</id>
        <keepLog>false</keepLog>
        <number>10</number>
        <queueId>2</queueId>
        <timestamp>1499611190781</timestamp>
        <url>http://localhost:8080/job/Freestyle-Project/10/</url>
        <builtOn/>
        <changeSet _class="hudson.scm.EmptyChangeLogSet"/>
    </build>
</builds>

不幸的是,我猜应该是指节点的<builtOn/>,在我的Jenkins v2.60.1中没有提供(还没有?)。
具有:

http://localhost:8080/api/json?pretty=true

您将获得:

...
"nodeDescription" : "the master Jenkins node",
...
"jobs" : [
  {
    "_class" : "hudson.model.FreeStyleProject",
    "name" : "Freestyle-Project",
    "url" : "http://xmg:8080/job/Freestyle-Project/",
    "color" : "aborted_anime"
  }
]
...

您可以使用以下命令进行筛选:

nodeDescription.equals('the master Jenkins node') && color.endsWith('_anime').

相关问题