Jenkins 构建历史管理与磁盘清理全攻略:5步根治服务器磁盘爆满 Jenkins 构建历史管理与磁盘清理全攻略5步根治服务器磁盘爆满 构建历史管理全景流程图一、核心概念构建历史到底占用了哪些空间1. 构建历史的存储结构2. 磁盘空间占用分析二、策略一全局自动清理配置最基础操作步骤三、策略二Job 级别的丢弃策略最常用操作步骤四、策略三Pipeline 中主动清理最灵活1. 清理工作空间2. 归档产物按需清理3. 使用 buildDiscarder 属性脚本式Pipeline五、策略四脚本批量清理应急救火1. Groovy脚本在Jenkins Script Console中执行2. Shell脚本直接在服务器执行六、监控体系从被动清理到主动预警1. 安装磁盘监控插件2. 配置磁盘阈值告警3. 定期巡检Pipeline 四种清理策略对比 常见问题排查 总结The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇你是否遇到过这样的场景Jenkins运行了半年后服务器磁盘突然告警登录一看jobs目录占用了上百GB空间——几万次的历史构建、几百G的归档产物让服务器不堪重负。构建历史管理就是解决这一问题的系统性方案。 构建历史管理全景流程图先通过一张图理解构建历史从产生到清理的完整生命周期定期执行⚙️ 每次Pipeline执行 生成构建记录存储内容 构建日志log文件 归档产物artifacts JUnit测试报告 工作空间快照存储于 $JENKINS_HOME/jobs/管理策略策略1: 全局自动清理配置策略2: Job级别丢弃策略策略3: Pipeline中清理策略4: 脚本批量删除️ 清理过期构建✅ 释放磁盘空间 监控 告警核心逻辑构建历史管理是一个闭环——清理不是目的建立自动化的清理策略 监控告警才是根本。一、核心概念构建历史到底占用了哪些空间在动手清理之前必须搞清楚Jenkins到底把数据存在哪里、存了什么。1. 构建历史的存储结构Jenkins构建数据存储路径$JENKINS_HOME/jobs/ ├── project-A/ │ ├── builds/ │ │ ├──1/# 第1次构建│ │ │ ├── log# 构建日志│ │ │ ├── archive/# 归档产物jar包等│ │ │ ├── junitResult.xml# 测试报告│ │ │ └── build.xml# 构建元数据│ │ ├──2/# 第2次构建│ │ └──... │ ├── workspace/# 工作空间可能很大│ └── config.xml# Job配置└── project-B/ └──...2. 磁盘空间占用分析存储内容磁盘占用比例清理优先级归档产物Artifacts40-60%⭐⭐⭐⭐⭐ 最高工作空间Workspace20-30%⭐⭐⭐⭐构建日志Logs10-15%⭐⭐⭐测试报告Reports5-10%⭐⭐构建元数据XML1-5%⭐不建议清理关键认知归档产物Artifacts和工作空间Workspace是最大的磁盘消耗者应作为清理的重点目标。二、策略一全局自动清理配置最基础这是Jenkins内置的**全局兜底策略**对所有Job生效。操作步骤登录Jenkins进入Manage Jenkins → System。找到Global Build Discarders部分。勾选并配置清理策略。推荐配置策略类型Log Rotation 保留天数30天 保留最大构建数50注意这个配置是全局默认值每个Job可以独立覆盖。建议设置得宽松一些如保留30天然后在个别高频Job上单独收紧。三、策略二Job 级别的丢弃策略最常用对于每天构建几十次的高频项目需要在Job级别设置更激进的清理策略。操作步骤进入具体Job的Configure → General。找到Discard old builds丢弃旧的构建。配置以下参数策略配置说明参数推荐值高频Job推荐值低频Job说明Days to keep builds7天30天按时间保留Max # of builds to keep20次50次按数量保留Days to keep artifacts3天14天产物保留时长可短于构建保留Max # of builds with artifacts5次20次只保留最近N次的产物工作机制两个条件以**先满足者为准**。例如同时设置保留7天和保留20次某天第21次构建成功时即使它只过了1天最老的第1次也会被清理。最佳实践归档产物Artifacts的保留时长应短于构建记录。生产发布Job的构建历史建议永久保留不设置丢弃策略。特性分支Job建议保留5次以内。四、策略三Pipeline 中主动清理最灵活在Pipeline脚本中可以精确控制构建结束后清理哪些内容。1. 清理工作空间声明式Pipeline示例pipeline{agent any stages{stage(Build){steps{shmvn clean package}}}post{always{// 方法1使用cleanWs插件清理工作空间cleanWs(cleanWhenAborted:true,cleanWhenFailure:true,cleanWhenNotBuilt:true,cleanWhenUnstable:true,deleteDirs:true,patterns:[[pattern:target/,type:INCLUDE],[pattern:node_modules/,type:INCLUDE]])// 方法2直接删除目录// deleteDir()}}}2. 归档产物按需清理pipeline{agent any stages{stage(Archive){steps{// 仅归档重要产物archiveArtifacts artifacts:target/*.jar,fingerprint:true}}}post{always{// 清理构建过程中产生的临时文件sh rm -rf target/tmp/ rm -rf target/*-sources.jar }}}3. 使用 buildDiscarder 属性脚本式Pipelineproperties([buildDiscarder(logRotator(artifactDaysToKeepStr:3,artifactNumToKeepStr:10,daysToKeepStr:7,numToKeepStr:30))])node{stage(Build){// 构建逻辑}}优势将清理策略代码化随Jenkinsfile版本控制团队成员都能看到和修改。五、策略四脚本批量清理应急救火当磁盘已经爆满需要**立即释放空间**时使用脚本批量操作。1. Groovy脚本在Jenkins Script Console中执行进入Manage Jenkins → Script Console执行以下脚本批量删除所有Job的旧构建保留最近10次// 遍历所有JobJenkins.instance.allItems.findAll{itinstanceofhudson.model.Job}.each{job-println清理Job:${job.fullName}// 获取所有构建记录按编号倒序排列defbuildsjob.builds.sort{it.number}.reverse()// 保留最近10次构建defbuildsToKeep10if(builds.size()buildsToKeep){builds.drop(buildsToKeep).each{build-println 删除构建 #${build.number}build.delete()}}}println清理完成仅清理构建产物保留构建日志Jenkins.instance.allItems.findAll{itinstanceofhudson.model.Job}.each{job-println清理产物:${job.fullName}job.builds.each{build-// 获取归档产物目录defartifactsDirnewFile(build.rootDir,archive)if(artifactsDir.exists()){defsizeartifactsDir.directorySize()println 构建 #${build.number}产物大小:${size/ 1024 /1024}MB// 删除产物保留构建记录和日志artifactsDir.deleteDir()println 已删除构建 #${build.number}的产物}}}查找并清理大文件构建// 查找所有构建按磁盘占用排序defbuildSizes[]Jenkins.instance.allItems.findAll{itinstanceofhudson.model.Job}.each{job-job.builds.each{build-defsizebuild.rootDir.directorySize()buildSizes[job:job.fullName,number:build.number,sizeMB:size/ 1024 /1024]}}// 按大小降序排列输出前20个buildSizes.sort{-it.sizeMB}.take(20).each{println${it.job}- Build #${it.number}:${it.sizeMB.round(2)}MB}2. Shell脚本直接在服务器执行查找占用最大的Job目录#!/bin/bashJENKINS_HOME/var/lib/jenkinsecho Jenkins 磁盘占用 Top 20 du-sh$JENKINS_HOME/jobs/*/|sort-rh|head-20echoecho Workspace 占用 Top 10 du-sh$JENKINS_HOME/jobs/*/workspace/|sort-rh|head-10删除所有超过30天的构建产物#!/bin/bashJENKINS_HOME/var/lib/jenkinsDAYS_OLD30echo清理超过${DAYS_OLD}天的构建产物...find$JENKINS_HOME/jobs/*/builds/-maxdepth3-typed-namearchive-mtime$DAYS_OLD|whilereaddir;doecho删除:$dir(大小:$(du-sh$dir|cut-f1))rm-rf$dirdoneecho清理完成⚠️ 安全警告使用Shell脚本前务必先备份$JENKINS_HOME。在测试环境验证脚本。确认find命令的-mtime参数逻辑正确。六、监控体系从被动清理到主动预警清理只是治标监控才是治本。1. 安装磁盘监控插件安装Disk Usage Plugin进入Manage Jenkins → Plugins搜索安装Disk Usage。安装后在Manage Jenkins页面看到Disk Usage链接。可视化管理每个Job的磁盘占用。2. 配置磁盘阈值告警在Manage Jenkins → System中设置磁盘空闲空间告警阈值10GB 当低于阈值时发送邮件通知管理员3. 定期巡检Pipeline创建一个专门的Jenkins Job每周执行一次磁盘巡检pipeline{agent any triggers{cron(0 8 * * 1)// 每周一早上8点执行}stages{stage(Check Disk Usage){steps{script{defjenkinsHomenewFile(/var/lib/jenkins)deffreeSpacejenkinsHome.freeSpace/ 1024 /1024/1024deftotalSpacejenkinsHome.totalSpace/ 1024 /1024/1024echoJenkins磁盘总空间:${totalSpace.round(2)}GBechoJenkins磁盘剩余空间:${freeSpace.round(2)}GBif(freeSpace10){emailext(subject: Jenkins磁盘空间不足告警,body:剩余空间:${freeSpace.round(2)}GB请立即清理,to:admincompany.com)error磁盘空间不足巡检失败}}}}stage(Clean Old Workspaces){steps{sh find /var/lib/jenkins/jobs/*/workspace/ \ -maxdepth 0 \ -type d \ -mtime 14 \ -exec rm -rf {} \\; }}}} 四种清理策略对比策略适用场景粒度优点缺点全局配置兜底策略全局简单、一劳永逸无法差异化处理Job级别日常管理Job级灵活、精细需逐个配置Pipeline中代码化团队协作构建级可版本控制、精确需要编码能力脚本批量应急救火无限制快速、强力风险高、不可逆 常见问题排查问题原因解决方案设置了丢弃策略但没生效旧策略与新策略冲突手动删除一次旧构建后续自动策略生效Pipeline脚本清理失败Jenkins用户无删除权限确认Jenkins进程用户对jobs/目录有写权限清理后磁盘空间未释放删除的文件仍被进程占用重启Jenkins服务或使用lsof检查占用构建历史被误删脚本参数过大提前备份使用更保守的保留数量 总结通过本文你已建立完整的Jenkins构建历史管理知识体系四层清理策略全局配置 → Job级别 → Pipeline脚本 → 应急脚本。空间占用大头归档产物40-60%和工作空间20-30%应优先清理。保留原则构建日志保留时间 归档产物保留时间生产Job永久保留。监控闭环定期巡检 阈值告警变被动清理为主动预防。黄金法则不要把Jenkins当仓库——构建产物的归宿是Nexus/Artifactory构建历史的归宿是定期归档工作空间永远是临时的。做好这三点你的Jenkins服务器就能长期保持健康状态。The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆