Jenkins作业卡在队列中,worker节点离线时如何让其自动失败
可行方案整理
方案1:使用专用插件(最简方案)
直接安装Queue Wait Timeout Jenkins插件即可,该插件的超时计时从作业进入调度队列时就开始,完全适配你的需求:
- 插件安装完成后进入目标作业配置页,找到「队列等待超时」配置模块
- 设置超时阈值为你需要的时长(比如5分钟)
- 超时动作选择「中止排队、标记构建为失败」,再搭配你常用的通知规则(邮件、企业微信/钉钉插件等)即可实现超时自动告警
方案2:无插件Groovy脚本实现
如果你不想额外安装插件,可以配置定时执行的系统Groovy脚本来实现监控逻辑,示例脚本如下:
import jenkins.model.Jenkins import hudson.model.Node import hudson.model.Queue def targetNodeName = "slave02" def maxWaitTime = 5 * 60 * 1000 // 5分钟,单位毫秒 // 检查目标节点状态 Node targetNode = Jenkins.instance.getNode(targetNodeName) boolean nodeOffline = targetNode == null || targetNode.toComputer().isOffline() if (nodeOffline) { // 遍历队列中所有绑定到目标节点的作业 Queue.Item[] items = Jenkins.instance.queue.getItems() items.each { item -> if (item.assignedLabel?.name == targetNodeName) { long waitTime = System.currentTimeMillis() - item.getInQueueSince() if (waitTime > maxWaitTime) { // 取消排队,标记失败并触发通知 Jenkins.instance.queue.cancel(item.task) item.task.getBuilds().forEach { build -> if (build.isBuilding()) { build.setResult(hudson.model.Result.FAILURE) build.doStop() } } // 这里可以补充你的通知逻辑,比如调用邮件/消息接口 } } } }
你可以将该脚本配置为定时执行的系统任务(比如每1分钟执行一次),即可自动处理排队超时的作业。
方案3:Pipeline作业前置校验
如果你用的是Pipeline类型的作业,可以调整结构先做节点状态校验,再执行实际任务:
pipeline { agent any // 先在任意可用节点执行校验 stages { stage('节点状态校验') { steps { script { def targetNode = Jenkins.instance.getNode('slave02') if (targetNode == null || targetNode.toComputer().isOffline()) { error("目标节点slave02已离线,构建终止") } } } } stage('实际构建任务') { agent { label 'slave02' // 校验通过后才分配到目标节点执行 } steps { // 你的原有构建逻辑 } } } post { failure { // 你的通知逻辑 } } }
该方案无需额外配置,作业触发后会立刻校验节点状态,离线直接终止并发送通知,不会卡在队列中。
内容的提问来源于stack exchange,提问作者s74n
相关产品推荐
相关产品推荐

