You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动