Jenkins多分支流水线旧构建未删除问题求助
Troubleshooting "Discard Old Builds" Not Working in Jenkins Multibranch Pipeline (2.176.1)
我之前也碰到过多分支流水线里全局勾选「丢弃旧构建」但子分支任务不生效的情况,结合你的场景(Jenkins 2.176.1,多分支任务OC,子分支productconfigurator-ms/master的构建从541到1039全部保留在服务器路径jenkins@XXXXX:jenkins/jenkins-production/jobs/OC/jobs/productconfigurator-ms/branches/master/builds下),给你梳理下问题原因和解决办法:
核心原因
多分支流水线的全局「丢弃旧构建」设置不会自动继承给子分支任务——每个分支任务(比如productconfigurator-ms/master)是独立的Job,默认不会继承父多分支任务的构建保留规则,这是Jenkins多分支流水线的设计特性。
解决方案
1. 给子分支任务单独配置构建丢弃规则(临时应急)
如果需要快速解决当前文件系统问题,可以先手动给有问题的子分支任务配置:
- 进入子分支任务的配置页(比如你的
productconfigurator-ms/master任务配置页) - 找到「丢弃旧构建」选项,勾选后设置保留的构建数量/天数(比如保留最近10个构建,或保留7天内的构建)
- 保存配置后,Jenkins会自动清理符合规则的旧构建
2. 通过Pipeline代码统一配置(长期方案)
更靠谱的方式是在你的Jenkinsfile里添加构建丢弃规则,这样所有分支都会自动应用,避免手动配置的麻烦:
pipeline { agent any options { // 保留最近10个构建,同时删除超过7天的旧构建 buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '7', artifactNumToKeepStr: '5', // 如果有构建产物,可设置保留的产物数量 artifactDaysToKeepStr: '3' )) } stages { // 你的流水线阶段代码 stage('Build') { steps { echo 'Building...' } } } }
添加这段代码后,每个分支的流水线运行时都会自动应用这个构建清理规则,不用再手动配置每个子任务。
3. 批量清理已存在的旧构建(一次性操作)
如果服务器上已经堆积了大量旧构建(比如你这里的541到1039),可以用Jenkins的脚本控制台批量清理:
- 进入Jenkins的「Manage Jenkins」 -> 「Script Console」
- 执行以下Groovy脚本(替换成你的任务路径):
def job = Jenkins.instance.getItemByFullName("OC/productconfigurator-ms/master") def buildsToKeep = 10 // 保留最近10个构建 job.getBuilds().drop(buildsToKeep).each { build -> build.delete() println "Deleted build #${build.number}" }
运行后会自动删除指定数量之外的旧构建,注意:脚本执行前最好先备份Jenkins数据,避免误删。
额外注意事项
- 确保Jenkins服务的
jenkins用户对服务器上的构建存储路径(jenkins/jenkins-production/jobs/OC/jobs/productconfigurator-ms/branches/master/builds)有写入/删除权限 - 如果你用了第三方插件管理构建保留(比如
Job Configuration History),要确认插件不会阻止构建删除操作
内容的提问来源于stack exchange,提问作者arielma
相关产品推荐
相关产品推荐

