如何通过Jenkins.instance.queue.items区分构建与仓库扫描任务
解决Jenkins仓库扫描耗尽API限额的问题
问题背景
我们遇到仓库扫描耗尽API限额的问题,计划修改JobDSL种子任务,使其运行后终止大量仓库扫描。目前已采用Webhooks,除触发日志轮转外,扫描并无必要。但通过Jenkins.instance.queue.items获取任务队列后,无法区分构建任务与仓库扫描任务,当前队列能识别的任务类型包括:
org.jenkinsci.plugins.workflow.job.WorkflowJoborg.jenkinsci.plugins.workflow.support.steps.ExecutorStepExecution$PlaceholderTask
尚未找到仓库扫描任务对应的类型。
解决方案步骤
1. 定位仓库扫描任务的真实类型
在Jenkins脚本控制台执行以下Groovy脚本,遍历队列任务并打印完整类型信息,从中找出扫描任务的类名:
Jenkins.instance.queue.items.each { task -> println "任务名称: ${task.name}, 完整类型: ${task.class.name}" }
常见的仓库扫描任务类名类似org.jenkinsci.plugins.github_branch_source.GitHubSCMSource$ScanTask(根据你使用的SCM插件不同会有差异)。
2. 在JobDSL种子任务中添加终止扫描任务的逻辑
将找到的扫描任务类名替换到以下代码中,加入JobDSL脚本里:
// 替换为实际找到的扫描任务类名 def scanTaskClass = Class.forName("org.jenkinsci.plugins.github_branch_source.GitHubSCMSource\$ScanTask") Jenkins.instance.queue.items.each { task -> // 判断任务类型为扫描任务,且排除日志轮转相关任务 if (task.class == scanTaskClass && !task.name.contains("日志轮转")) { Jenkins.instance.queue.cancel(task) println "已终止扫描任务: ${task.name}" } }
根据日志轮转任务的名称特征,调整!task.name.contains("日志轮转")这一判断条件,确保保留必要的扫描任务。
3. 验证效果
运行修改后的JobDSL种子任务,查看Jenkins队列确认无关扫描任务已被终止,同时监控API限额的使用情况,确认问题得到缓解。
内容的提问来源于stack exchange,提问作者Peter Kahn
相关产品推荐
相关产品推荐

