如何删除Jenkins中由特定用户触发的旧构建记录
Jenkins特定用户触发旧构建删除方案
完全支持按构建触发用户维度筛选删除旧构建,无需安装额外插件,直接在Jenkins Script Console执行Groovy脚本即可实现,核心逻辑是通过构建的触发原因类提取触发用户信息做匹配。
重要提醒:构建删除为不可逆操作,请务必先运行预览模式核对待删除记录,确认无误后再执行删除逻辑。
操作步骤
- 进入Jenkins管理界面的Script Console页面(路径:Manage Jenkins → Script Console)
- 运行预览脚本,匹配待删除的构建列表,核对范围:
// ========== 按需修改以下配置项 ========== def jobFullName = "目标任务的完整名称,多层文件夹嵌套的任务需写全路径,例:prod/pay-service/deploy" def triggerUserName = "需要筛选的触发用户名称,例:lisi" def keepLatestCount = 5 // 保留该用户触发的最近N个构建,避免误删最新有效记录 // ====================================== def targetJob = Jenkins.instance.getItemByFullName(jobFullName) if (!targetJob) { println "错误:未找到对应名称的任务,请检查jobFullName配置" return } def matchedBuilds = [] targetJob.builds.each { build -> // 跳过正在运行中的构建 if (build.building) { return } // 提取用户触发的构建原因 def userTriggerCause = build.getCause(hudson.model.Cause.UserIdCause.class) if (userTriggerCause && userTriggerCause.userName == triggerUserName) { matchedBuilds << build } } // 按构建号从新到旧排序,跳过需要保留的最近N个构建 def waitToDelete = matchedBuilds.sort { -it.number }.drop(keepLatestCount) println "匹配结果:用户[${triggerUserName}]共触发${matchedBuilds.size()}个构建,按规则保留最近${keepLatestCount}个,待删除${waitToDelete.size()}个,待删除构建明细:" waitToDelete.each { println "构建号#${it.number} | 触发时间:${new Date(it.startTimeInMillis)}" }
- 核对控制台输出的待删除列表完全符合预期后,在上述预览脚本的末尾追加以下代码,执行即可完成删除:
waitToDelete.each { build -> print "正在删除构建#${build.number}..." build.delete() println "完成" } println "全部删除操作执行完毕"
补充说明
- 如果需要批量清理所有任务下对应用户触发的旧构建,可以把单任务获取逻辑替换为遍历Jenkins所有任务的逻辑,注意递归处理文件夹(
com.cloudbees.hudson.plugins.folder.Folder类型)下的子任务 - 非用户手动触发的构建(比如定时器触发、上游任务触发、Webhook自动触发)不会携带
UserIdCause标识,不会被误匹配删除 - 执行脚本的账号需要拥有目标任务的构建删除权限,否则会抛出权限错误
内容的提问来源于stack exchange,提问作者Omer Eshed
相关产品推荐
相关产品推荐

