如何强制清空Jenkins构建队列?队列存储位置排查指南
Jenkins队列存储位置与故障清理方案
队列的磁盘存储规则
Jenkins构建队列默认持久化存储在$JENKINS_HOME/queue.xml文件中,Jenkins会在正常关停、定时状态快照时将内存中的队列信息写入该文件,用于服务重启后恢复待执行的排队任务。
Jenkins 2.300及之后的新版本,除了根目录下的queue.xml,还会在$JENKINS_HOME/queue/目录下生成队列分片持久化文件。
队列卡死超时的修复方案
方案1:脚本控制台带超时保护的清理脚本
直接执行Jenkins.instance.queue.clear()或者单任务cancel超时,一般是队列内存在关联失效任务、离线节点的损坏条目,操作时触发锁阻塞导致的,可以用带超时控制的脚本避免控制台卡死:
import hudson.model.* import java.util.concurrent.* def queue = Jenkins.instance.queue println "清理前队列总条目数: ${queue.items.length}" def executor = Executors.newSingleThreadExecutor() def cleanTask = executor.submit { try { // 先清理关联失效任务、离线节点的损坏队列项 queue.items.findAll { it.task == null || (it.assignedLabel != null && it.assignedLabel.nodes.every { node -> node.toComputer()?.isOnline() != true }) }.each { queue.cancel(it.task) } // 清空剩余所有队列项 queue.clear() // 强制触发队列维护,刷新前端展示状态 queue.maintain() println "清理完成,当前队列条目数: ${queue.items.length}" } catch (Exception e) { println "清理过程抛出异常: ${e.message}" e.printStackTrace() } } // 设置10秒超时阈值,超时直接中断操作 try { cleanTask.get(10, TimeUnit.SECONDS) } catch (TimeoutException e) { cleanTask.cancel(true) println "在线清理超时,请使用停机清理方案" } executor.shutdownNow()
方案2:停机修改文件强制清空
如果在线脚本始终执行超时,可以直接操作磁盘文件清空队列,步骤如下:
- 完全停止Jenkins服务,确认无残留Java进程运行
- 找到Jenkins主目录(可在「系统管理-系统配置」页面查看
JENKINS_HOME的实际路径,常见默认路径为/var/lib/jenkins) - 将主目录下的
queue.xml重命名为queue.xml.bak做备份,不要直接删除避免需要回滚 - 若存在
$JENKINS_HOME/queue/目录,将目录内所有文件一并备份后清空 - 重启Jenkins服务,服务启动后不会加载历史队列数据,队列会恢复为空状态
单条队列项取消也出现超时的问题,和队列条目数量没有直接关系,通常是队列操作的全局锁被卡死的构建线程、失效的节点连接占用导致,频繁出现该问题时可以在线程快照页面检查是否存在队列相关的死锁或阻塞记录,定位根因。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

