Jenkins でビルドの最終更新時刻を確認する

import java.time.ZoneOffset
import java.time.Instant
import java.time.temporal.ChronoUnit
def builds = Jenkins.get().getAllItems(Job.class).collectMany { job ->
        job.builds
    }.findAll { build ->
        build.building
    }	
 
println builds.size()
builds.each {
  println "${it.url} hasntStartedYet: ${it.hasntStartedYet()} , isInProgress: ${it.isInProgress()} , isLogUpdated: ${it.isLogUpdated()} , getTime: ${it.time} , getStartTimeInMillis: ${java.time.Instant.ofEpochMilli(it.getStartTimeInMillis()).atOffset(ZoneOffset.ofHours(9)).toString()} , logfile: ${java.time.Instant.ofEpochMilli(it.logFile.lastModified()).atOffset(ZoneOffset.ofHours(9)).toString()}"
  it.doStop()
}
 
println ""
import java.time.ZoneOffset
import java.time.Instant
import java.time.temporal.ChronoUnit
 
pipeline {
    agent none
    stages {
        stage('find') {
            steps {
                script {
                    def builds = findNotStoppedJobs()
                    if (builds.size() == 0) {
                        println '実行中のジョブなし'
                        return
                    }
 
                    // Nodeの情報をログに残す
                    println "---- print all Node ----"
                    Jenkins.get().nodes.each { node ->
                        println "---- Node ${node.getSelfLabel()} ----"
                        printNodeInfo(node)
                        println ""
                    }
 
                    def now = Instant.now()
                    def stoppedBuilds = []
                    builds.each { build ->
                        def lastModified = Instant.ofEpochMilli(build.logFile.lastModified())
 
                        def matcher = build.log =~ /Cannot contact ([^:]*).*/
                        if (lastModified.plus(5, ChronoUnit.MINUTES).isBefore(now) && matcher.size() > 0 && matcher[0].size() > 1) {
                            // slaveとの通信ができなくなって一定時間経過している場合
 
                            println "---- ${build.url} ----"
 
                            def nodeLabel = matcher[0][1]
                            def node = Jenkins.get().getNode(nodeLabel)
                            if (node == null) {
                                println "Node ${nodeLabel} の情報が取得できませんでした。podが停止した可能性があるためビルドを停止します"
                                stopBuild(build)
                                stoppedBuilds.add(build)
                            } else {
                                printNodeInfo(node)
                                if (node.channel == null) {
                                    println "Node ${nodeLabel} のchannelが取得できませんでした。podが停止した可能性があるためビルドを停止します"
                                    stopBuild(build)
                                    stoppedBuilds.add(build)
                                }
                            }
                            return
                        }
 
                    }
 
                    if (stoppedBuilds.size() == 0) {
                        println '停止したジョブはありません'
                        return
                    }
 
                }
            }
        }
    }
}
 
def findNotStoppedJobs() {
    return Jenkins.get().getAllItems(Job.class).collectMany { job ->
        job.builds
    }.findAll { build ->
        build.building
    }
}
 
def printNodeInfo(def node) {
    println "getAssignedLabels()          : ${node.getAssignedLabels()              }"
    println "getChannel()                 : ${node.getChannel()                     }"
    println "getDisplayName()             : ${node.getDisplayName()                 }"
    println "getLabelString()             : ${node.getLabelString()                 }"
    println "getMode()                    : ${node.getMode()                        }"
    println "getNodeDescription()         : ${node.getNodeDescription()             }"
    println "getNodeName()                : ${node.getNodeName()                    }"
    println "getRootPath()                : ${node.getRootPath()                    }"
    println "getSearchUrl()               : ${node.getSearchUrl()                   }"
    println "getSelfLabel()               : ${node.getSelfLabel()                   }"
    println "isAcceptingTasks()           : ${node.isAcceptingTasks()               }"
    println "isHoldOffLaunchUntilSave()   : ${node.isHoldOffLaunchUntilSave()       }"
}
 
def stopBuild(def build) {
    build.doStop()
}