如何配置Jenkins:仅删除同时超出保留天数与数量上限的构建?
Jenkins 实现「既超期又超量才删除旧构建」的配置方案
问题背景
默认的Jenkins「丢弃旧构建」配置中,numToKeep和daysToKeep是或逻辑:只要构建超出保留数量,或者超出保留天数,就会被清理。这会导致两种不符合预期的情况:
- 任务低活跃度时(比如假期两周未运行),所有超过10天的构建会被全删,无法保留足够的历史
- 任务高频率运行时(比如每日5次),达到数量上限后会删除10天内的旧构建,无法保留足够的时间范围
我们需要的是与逻辑:仅删除那些「既超过10天」且「不在最近10个构建列表中」的构建,确保始终保留至少10个构建、至少保留10天内的所有构建。
实现方案
方案一:Groovy脚本自定义清理逻辑(推荐)
通过构建后执行Groovy脚本,精准控制保留规则,替代默认的丢弃逻辑。
自由风格项目配置步骤
- 取消任务中默认的「丢弃旧构建」勾选(若已勾选,将
numToKeep和daysToKeep设为极大值,比如9999/999,避免默认逻辑干扰) - 安装「Groovy插件」后,添加构建后操作:Execute system Groovy script
- 填入以下脚本,替换
你的任务名称、keepNum和keepDays为实际值:
def job = Jenkins.instance.getItemByFullName("你的任务名称") def keepNum = 10 // 最少保留的构建数量 def keepDays = 10 // 最少保留的天数 def cutoffTime = System.currentTimeMillis() - (keepDays * 24 * 60 * 60 * 1000) // 按构建编号倒序获取所有构建(最新在前) def builds = job.getBuilds().sort { it.number }.reverse() // 筛选需要保留的构建:最近keepNum个 + 10天内的所有构建 def buildsToKeep = builds.take(keepNum) + builds.findAll { it.timeInMillis >= cutoffTime } // 去重,避免重复保留同一构建 def uniqueBuildsToKeep = buildsToKeep.unique { it.number } // 遍历删除不符合保留规则的构建 builds.each { build -> if (!uniqueBuildsToKeep.contains(build)) { println "删除构建 #${build.number} (构建时间:${new Date(build.timeInMillis)})" build.delete() } }
流水线项目(Jenkinsfile)配置
在post阶段添加脚本块,实现相同逻辑:
pipeline { agent any stages { stage('构建') { steps { echo '执行构建流程...' } } } post { always { script { def keepNum = 10 def keepDays = 10 def cutoffTime = System.currentTimeMillis() - (keepDays * 24 * 60 * 60 * 1000) // 获取当前任务的所有构建,按编号倒序 def builds = currentBuild.parent.builds.sort { it.number }.reverse() // 确定需要保留的构建集合 def buildsToKeep = builds.take(keepNum) + builds.findAll { it.timeInMillis >= cutoffTime } def uniqueBuildsToKeep = buildsToKeep.unique { it.number } // 删除不符合规则的构建,排除当前正在运行的构建 builds.each { build -> if (!uniqueBuildsToKeep.contains(build) && build != currentBuild) { echo "删除构建 #${build.number} (构建时间:${new Date(build.timeInMillis)})" build.delete() } } } } } }
注意事项
- 权限检查:确保执行脚本的Jenkins用户拥有删除构建的权限
- 测试验证:首次使用时可注释
build.delete(),仅打印待删除构建列表,确认逻辑符合预期后再执行删除 - 插件依赖:自由风格项目需提前安装「Groovy插件」
内容的提问来源于stack exchange,提问作者Moberg
相关产品推荐
相关产品推荐

