如何通过在Ubuntu上优化Jenkins存储空间,实现工作效率的显著提升?
- 内容介绍
- 文章标签
- 相关推荐
一、定位大目录与根因
痛点:硬盘空间告急。建立经常因为 no space left on device 而失败,排查时找不到真正的占用者。
需要找出 Jenkins 中占用磁盘最多的目录。老实说,常见的高占用方法包括:
-
/var/lib/jenkins/jobs/*/builds—— 每个建立产生的工作区和产物。 -
/var/lib/jenkins/workspace—— 手动保留下来的临时文件。 -
/var/lib/jenkins/plugins—— 旧插件未及时清理。
使用以下命令快速定位前五大目录:
du -h /var/lib/jenkins | sort -hr | head -n 5
二、建立保留策略与自动清理
痛点:手动删除历史建立费时费力,误删自定义工作区导致业务中断。
1. 配置 Job 的“建立丢弃策略”
在每个 Job → “配置” → “建立丢弃策略”中设定:
- 保留最近 N 次建立
- 或保留最近 X 天内的建立
- 同时保留标记为“Release”的关键建立
2. 使用程序任务实现全局清理
创建一个 “程序任务” 并勾选 “定期执行”。再看脚本示例,
# 删除超过 30 天且未被标记的旧工作区
find /var/lib/jenkins/jobs/*/builds -mindepth 1 -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;# 清理空工作区
find /var/lib/jenkins/workspace -type d -empty -delete
三、迁移 JENKINS_HOME 到更大磁盘
痛点:根分区已满。无法再写入新数据,升级硬件成本高。
1. 准备新磁盘并挂载
# 假设新磁盘已挂载到 /mnt/bigdisk
sudo mkdir -p /mnt/bigdisk/jenkins_home
sudo chown -R jenkins:jenkins /mnt/bigdisk/jenkins_home
2. 停止 Jenkins 并拷贝数据
# 关闭服务
sudo systemctl stop jenkins
# 同步数据
sudo rsync -avz /var/lib/jenkins/ /mnt/bigdisk/jenkins_home/
# 修改环境变量
sudo sed -i 's|JENKINS_HOME=.*|JENKINS_HOME=/mnt/bigdisk/jenkins_home|' /etc/default/jenkins
# 开启服务
sudo systemctl start jenkins
四、日志轮转 & 高性能存储
痛点:日志文件无限增长,占满数十 GB 硬盘空间; 读取大量文件时响应慢,
1. 配置 logrotate
/etc/logrotate.d/jenkins:
/var/log/jenkins/*.log {
weekly
rotate 4
compress
missingok
notifempty
copytruncate
}
2. 使用 SSD 替代 HDD
SATA SSD 或 NVMe SSD 能将 I/O 延迟从数毫秒降至 <0.1 ms,尤其在大量源码检出和制品上传时效果明显。
五、容器 & 程序层面的综合调整
痛点:Kubernetes/Docker 部署的 Jenkins 容器频繁 OOM,资源利用率低下。其实,
1. 合理分配 CPU & Memory
-
Kubernetes:在 Deployment 中设置
,. -
从Docker来看。使用
-m 4g --cpus=2.
2. 增加 swap 与 vm.swappiness
# 创建 8G swap 文件
sudo fallocate -l 8G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
# 调整 swappiness 为 10
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
3. 调整 SCM 检出
- Sparse checkout,只检出需要的子目录。
- Caching:在 Jenkins 节点上启用 Git 本地缓存,减少网络拉取时间。
-
Pipelines 中使用
@Library,避免重复拉取同一仓库。
4. 定期审计插件
PJ 插件是磁盘和内存的大消耗源。每季度运行一次插件审计脚本,卸载不再使用或已被官方废弃的插件。
痛点:A/B 调整后缺乏可视化数据,不确定是否真的提高了效率。
- `df -h` 检查磁盘余量:
# 示例输出
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 28G 42% /
/dev/sdb1 200G 30G 160G 16% /mnt/bigdisk
一、定位大目录与根因
痛点:硬盘空间告急。建立经常因为 no space left on device 而失败,排查时找不到真正的占用者。
需要找出 Jenkins 中占用磁盘最多的目录。老实说,常见的高占用方法包括:
-
/var/lib/jenkins/jobs/*/builds—— 每个建立产生的工作区和产物。 -
/var/lib/jenkins/workspace—— 手动保留下来的临时文件。 -
/var/lib/jenkins/plugins—— 旧插件未及时清理。
使用以下命令快速定位前五大目录:
du -h /var/lib/jenkins | sort -hr | head -n 5
二、建立保留策略与自动清理
痛点:手动删除历史建立费时费力,误删自定义工作区导致业务中断。
1. 配置 Job 的“建立丢弃策略”
在每个 Job → “配置” → “建立丢弃策略”中设定:
- 保留最近 N 次建立
- 或保留最近 X 天内的建立
- 同时保留标记为“Release”的关键建立
2. 使用程序任务实现全局清理
创建一个 “程序任务” 并勾选 “定期执行”。再看脚本示例,
# 删除超过 30 天且未被标记的旧工作区
find /var/lib/jenkins/jobs/*/builds -mindepth 1 -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;# 清理空工作区
find /var/lib/jenkins/workspace -type d -empty -delete
三、迁移 JENKINS_HOME 到更大磁盘
痛点:根分区已满。无法再写入新数据,升级硬件成本高。
1. 准备新磁盘并挂载
# 假设新磁盘已挂载到 /mnt/bigdisk
sudo mkdir -p /mnt/bigdisk/jenkins_home
sudo chown -R jenkins:jenkins /mnt/bigdisk/jenkins_home
2. 停止 Jenkins 并拷贝数据
# 关闭服务
sudo systemctl stop jenkins
# 同步数据
sudo rsync -avz /var/lib/jenkins/ /mnt/bigdisk/jenkins_home/
# 修改环境变量
sudo sed -i 's|JENKINS_HOME=.*|JENKINS_HOME=/mnt/bigdisk/jenkins_home|' /etc/default/jenkins
# 开启服务
sudo systemctl start jenkins
四、日志轮转 & 高性能存储
痛点:日志文件无限增长,占满数十 GB 硬盘空间; 读取大量文件时响应慢,
1. 配置 logrotate
/etc/logrotate.d/jenkins:
/var/log/jenkins/*.log {
weekly
rotate 4
compress
missingok
notifempty
copytruncate
}
2. 使用 SSD 替代 HDD
SATA SSD 或 NVMe SSD 能将 I/O 延迟从数毫秒降至 <0.1 ms,尤其在大量源码检出和制品上传时效果明显。
五、容器 & 程序层面的综合调整
痛点:Kubernetes/Docker 部署的 Jenkins 容器频繁 OOM,资源利用率低下。其实,
1. 合理分配 CPU & Memory
-
Kubernetes:在 Deployment 中设置
,. -
从Docker来看。使用
-m 4g --cpus=2.
2. 增加 swap 与 vm.swappiness
# 创建 8G swap 文件
sudo fallocate -l 8G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
# 调整 swappiness 为 10
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
3. 调整 SCM 检出
- Sparse checkout,只检出需要的子目录。
- Caching:在 Jenkins 节点上启用 Git 本地缓存,减少网络拉取时间。
-
Pipelines 中使用
@Library,避免重复拉取同一仓库。
4. 定期审计插件
PJ 插件是磁盘和内存的大消耗源。每季度运行一次插件审计脚本,卸载不再使用或已被官方废弃的插件。
痛点:A/B 调整后缺乏可视化数据,不确定是否真的提高了效率。
- `df -h` 检查磁盘余量:
# 示例输出
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 28G 42% /
/dev/sdb1 200G 30G 160G 16% /mnt/bigdisk

