Jenkins Pipeline定期清理构建队列脚本流水线运行失败问题咨询
Jenkins流水线定期清理构建队列解决方案
失效核心原因
你现有脚本无法在流水线运行主要有3个问题:
- 声明式流水线默认要求执行自定义Groovy逻辑必须包裹在
script块内,直接写步骤会触发语法报错 - Jenkins流水线默认开启脚本安全沙箱,直接调用Jenkins核心API会被权限拦截
- 原单行脚本缺少语句分隔符,在流水线Groovy解析器中会出现语法识别错误
前置配置要求
- 首先进入Jenkins管理后台→「进程内脚本批准」页面,将被拦截的
jenkins.model.Jenkins.get、hudson.model.Queue.cancel相关方法加入批准列表 - 流水线运行账号需持有队列管理、Jenkins实例读取的对应权限
- 如果是内网安全环境,也可以将该流水线加入受信任流水线列表,跳过沙箱校验
可直接运行的流水线脚本
以下为带定时触发配置的完整声明式流水线示例:
pipeline { agent any triggers { // 自定义cron表达式配置执行周期,示例为每小时执行一次 cron('0 * * * *') } stages { stage('清理构建队列') { steps { script { def jenkinsInstance = jenkins.model.Jenkins.get() def buildQueue = jenkinsInstance.queue // 遍历取消所有排队任务 for (def queuedItem in buildQueue.items) { buildQueue.cancel(queuedItem.task) println "已取消排队任务:${queuedItem.task.fullDisplayName}" } println "队列清理完成,当前剩余排队任务数:${buildQueue.items.size()}" } } } } }
可选优化配置
如果不需要清理全部排队任务,可在循环内添加过滤规则,示例如下:
for (def queuedItem in buildQueue.items) { // 仅清理名称包含指定前缀的任务,可根据需求修改判断规则 if (queuedItem.task.name.startsWith("测试任务-")) { buildQueue.cancel(queuedItem.task) } }
内容的提问来源于stack exchange,提问作者Azusena Huacache
相关产品推荐
相关产品推荐

