如何配置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ć

