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

如何配置Jenkins按名称筛选删除构建而非按时间?

实现按构建名称参数分组删除旧构建的Jenkins方案

当然可以实现这个需求!我之前帮同事配置过类似的场景——核心就是按构建名称里的参数后缀(比如build1、example1这类)分组,每组保留指定数量的最新构建,自动清理同组的旧构建。下面给你两种可行的方案,覆盖自由风格和Pipeline任务:

一、插件配合Groovy脚本(自由风格任务首选)

你需要两个Jenkins官方生态的插件,都是稳定且常用的:

  • Build Name Setter Plugin:帮你精准控制构建命名(如果已经配置好命名规则可以跳过)
  • Groovy Postbuild Plugin:允许你执行自定义脚本实现精准的构建筛选删除

1. 先确认构建命名规则

如果还没配置自动生成#编号-参数名的构建名称,安装Build Name Setter Plugin后,在任务配置的「Build Environment」里勾选「Set build name」,然后填入命名模板:

#${BUILD_NUMBER}-${YOUR_PARAM_NAME}

把YOUR_PARAM_NAME换成你实际的参数变量名,这样每个构建都会自动生成类似#1-build1的名称。

2. 配置Groovy脚本实现分组删除

安装Groovy Postbuild Plugin后,在任务的「Post-build Actions」里添加「Groovy Postbuild」,选择「Execute a system Groovy script」,粘贴以下脚本:

// 定义每组要保留的最新构建数量,比如保留2个
def keepCount = 2
// 从当前构建名称中提取参数后缀(比如从#5-example3中拿到example3)
def currentParam = manager.build.displayName.split('-')[1]

// 获取当前任务的所有历史构建
def allBuilds = manager.build.project.builds

// 筛选出和当前构建参数后缀相同的所有构建,按编号倒序排列(最新的在前)
def sameGroupBuilds = allBuilds.findAll { build ->
    build.displayName.split('-')[1] == currentParam
}.sort { it.number }.reverse()

// 删除超出保留数量的旧构建
if (sameGroupBuilds.size() > keepCount) {
    sameGroupBuilds.drop(keepCount).each { build ->
        println "正在删除旧构建: ${build.displayName}"
        build.delete()
    }
}

这个脚本的逻辑完全贴合你的需求:当触发#5-example3时,会找出所有后缀为example的构建(#2-example1、#4-example2、#5-example3),保留最新的2个(#4和#5),自动删除#2-example1,完全不会碰build组的#1-build1。

二、Pipeline任务直接实现(无需额外插件)

如果你的任务是Pipeline类型,直接在post阶段添加脚本即可,不需要安装额外插件:

pipeline {
    agent any
    parameters {
        // 这里替换成你实际的参数定义
        string(name: 'BUILD_SUFFIX', defaultValue: 'build1', description: '构建名称后缀')
    }
    options {
        // 全局先保留10个构建,再叠加自定义分组筛选
        buildDiscarder(logRotator(numToKeepStr: '10'))
    }
    stages {
        stage('Build') {
            steps {
                echo "正在构建: #${BUILD_NUMBER}-${params.BUILD_SUFFIX}"
                // 这里放你的实际构建步骤
            }
        }
    }
    post {
        always {
            script {
                def keepCount = 2
                def currentParam = params.BUILD_SUFFIX
                def currentProject = Jenkins.instance.getItem(env.JOB_NAME)
                
                // 筛选同参数后缀的构建并排序
                def sameGroupBuilds = currentProject.builds.findAll { build ->
                    build.displayName.split('-')[1] == currentParam
                }.sort { it.number }.reverse()
                
                // 清理旧构建
                if (sameGroupBuilds.size() > keepCount) {
                    sameGroupBuilds.drop(keepCount).each { build ->
                        echo "删除旧构建: ${build.displayName}"
                        build.delete()
                    }
                }
            }
        }
    }
}

注意:如果遇到权限报错,需要在Jenkins全局安全配置中,允许Pipeline脚本执行这类系统级操作(调整「Script Security」相关设置)。

三、可视化插件备选(无需写脚本)

如果你不想写代码,可以试试Build Filter Plugin,它提供可视化的筛选条件来删除构建。配置时选择「Delete builds matching the filter」,用正则表达式匹配构建名称里的参数部分(比如.*-example.*),再设置保留数量就能实现分组删除。不过灵活性不如自定义脚本,适合简单的分组需求。

内容的提问来源于stack exchange,提问作者Milica Matić

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:02