Jenkins已修剪分支的作业文件夹未删除,如何强制清理磁盘?
解决Jenkins已修剪分支作业文件夹残留的磁盘空间问题
我刚好处理过类似的场景,确实如你所说,这是Jenkins的默认预期行为——当分支被合并修剪后,UI里会移除对应的构建作业,但磁盘上的作业文件夹并不会自动被清理。对于单分支构建后就超2GB的仓库来说,这个问题确实会快速耗尽磁盘空间,下面给你几个实用的解决办法:
方法1:用Pipeline Cleanup插件一键配置
这个插件就是专门针对多分支Pipeline的清理场景设计的,能自动识别并删除已被修剪/删除分支对应的作业目录,配置起来很简单:
- 先在Jenkins插件市场安装
Pipeline Cleanup插件 - 打开你的多分支Pipeline配置页面,找到Branch Sources下的Additional Behaviours,点击添加Cleanup orphaned items
- 你还可以自定义清理延迟(比如分支被修剪后3天再删除),避免因为临时分支操作导致误删
方法2:在Pipeline脚本里加自定义清理逻辑
如果不想额外装插件,也可以在你的Pipeline脚本里嵌入清理逻辑,在分支构建完成后检查分支是否还存在于远程仓库,不存在就删除本地作业目录:
pipeline { agent any stages { stage('Build') { steps { // 这里替换成你的构建命令,比如npm install、mvn package等 sh 'npm install && npm run build' } } } post { always { script { // 检查当前分支在远程仓库是否存在 def branchExists = sh(script: "git ls-remote --heads origin ${env.BRANCH_NAME}", returnStatus: true) == 0 if (!branchExists) { // 获取当前作业的磁盘目录路径 def jobDir = Jenkins.instance.getItemByFullName(env.JOB_NAME).getRootDir().getAbsolutePath() // 删除目录 sh "rm -rf ${jobDir}" // 同时从Jenkins系统中删除该作业 Jenkins.instance.getItemByFullName(env.JOB_NAME).delete() } } } } }
注意:这个脚本需要Jenkins具备执行删除操作的权限,建议先在测试环境跑一遍,避免误删正在使用的分支作业。
方法3:定期执行系统级清理脚本
如果你的Jenkins部署在Linux服务器上,还可以写个shell脚本,配合cron定期清理磁盘上的孤儿作业目录:
#!/bin/bash # 替换成你的Jenkins作业根目录 JENKINS_JOBS_DIR="/var/lib/jenkins/jobs" # 替换成你的Git仓库地址 REPO_URL="https://your-git-repo-url.git" cd $JENKINS_JOBS_DIR # 遍历所有作业目录 for job in */; do branch_name=$(basename $job) # 检查远程仓库是否存在该分支 git ls-remote --heads $REPO_URL $branch_name > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "正在删除孤儿作业目录: $job" rm -rf $job fi done
- 把这个脚本保存为
cleanup-jenkins-branches.sh,给它加执行权限:chmod +x cleanup-jenkins-branches.sh - 然后用
crontab -e添加定时任务,比如每周日凌晨执行一次:0 0 * * 0 /path/to/cleanup-jenkins-branches.sh
额外小提示
如果你用的是GitHub Branch Source插件,也可以在插件的配置项里找到Clean up orphaned items并开启,它会定期扫描远程仓库的分支状态,自动清理对应的孤儿作业及磁盘目录。另外,不管用哪种方法,操作前建议先备份Jenkins的作业目录,避免误删重要数据。
内容的提问来源于stack exchange,提问作者pogorman




