You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Jenkins:仅删除同时超出保留天数与数量上限的构建?

Jenkins 实现「既超期又超量才删除旧构建」的配置方案

问题背景

默认的Jenkins「丢弃旧构建」配置中,numToKeep和daysToKeep是或逻辑:只要构建超出保留数量,或者超出保留天数,就会被清理。这会导致两种不符合预期的情况:

  • 任务低活跃度时(比如假期两周未运行),所有超过10天的构建会被全删,无法保留足够的历史
  • 任务高频率运行时(比如每日5次),达到数量上限后会删除10天内的旧构建,无法保留足够的时间范围

我们需要的是与逻辑:仅删除那些「既超过10天」且「不在最近10个构建列表中」的构建,确保始终保留至少10个构建、至少保留10天内的所有构建。

实现方案

方案一:Groovy脚本自定义清理逻辑(推荐)

通过构建后执行Groovy脚本,精准控制保留规则,替代默认的丢弃逻辑。

自由风格项目配置步骤

  1. 取消任务中默认的「丢弃旧构建」勾选(若已勾选,将numToKeep和daysToKeep设为极大值,比如9999/999,避免默认逻辑干扰)
  2. 安装「Groovy插件」后,添加构建后操作:Execute system Groovy script
  3. 填入以下脚本,替换你的任务名称、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:04:51