如何获取Jenkins定期构建的触发时间(含等待执行器阶段)?
解决Jenkins等待队列中任务的触发时间/等待时长问题
我之前也碰到过类似的场景,确实Build Timestamp Plugin没法满足需求——它只能捕获构建实际启动执行的时间,而任务卡在"Waiting for the next available Executor"的阶段属于Jenkins的队列(Queue)环节,这个阶段的时间数据得从队列层面去挖。下面给你几个实用的方案:
方案1:通过Jenkins REST API直接获取队列数据
Jenkins的队列里每个等待任务都记录了进入队列的时间(也就是你的构建触发时间,因为Build Periodically触发后任务会直接进入队列),可以通过API拿到这个关键数据:
- 先获取所有等待任务的队列列表:访问你的Jenkins实例的
/queue/api/json接口,返回的items数组里包含所有等待任务,每个item的id是队列项ID(queueId),task.name对应任务名称。 - 针对特定任务,访问
/queue/item/{queueId}/api/json,其中的inQueueSince字段是毫秒级时间戳,这就是任务进入队列的时间(即构建触发时间)。 - 要计算等待时长的话,用当前时间戳减去
inQueueSince,再转换成时分秒格式即可。
方案2:在Pipeline中获取队列触发时间(适用于Pipeline任务)
如果你的任务是Pipeline类型,且拥有Jenkins脚本执行权限,可以在Pipeline的最开头加入一段脚本,直接获取任务在队列中的进入时间:
pipeline { agent any stages { stage('初始化:获取等待数据') { steps { script { def queueItem = currentBuild.getRawBuild().getQueueItem() if (queueItem != null) { def triggerTime = new Date(queueItem.getInQueueSince()) def waitDuration = System.currentTimeMillis() - queueItem.getInQueueSince() println "构建触发时间:${triggerTime}" println "已等待时长:${waitDuration / 1000} 秒" } } } } // 后续构建步骤... } }
注意:这个脚本需要Jenkins允许使用getRawBuild()这类底层方法,可能需要调整全局安全脚本的权限设置。
方案3:用Groovy脚本控制台批量查询队列任务
如果你需要一次性查看所有等待任务的触发时间和等待时长,可以通过Jenkins的脚本控制台(Manage Jenkins -> Script Console)执行以下脚本:
import jenkins.model.Jenkins def queue = Jenkins.instance.queue queue.items.each { item -> def triggerTime = new Date(item.inQueueSince) def waitSec = (System.currentTimeMillis() - item.inQueueSince) / 1000 println "任务名称:${item.task.name} | 触发时间:${triggerTime} | 已等待:${waitSec} 秒" }
执行后就能直接看到所有等待任务的相关时间数据了。
补充:为什么Build Timestamp Plugin不行?
这个插件的逻辑是在构建步骤开始执行后才生成时间戳,而任务处于等待执行器的状态时,构建还没真正启动,所以插件无法捕获这个阶段的时间数据,必须从Jenkins的队列系统中获取对应信息。
内容的提问来源于stack exchange,提问作者SV Madhava Reddy




