Jenkins基础教程(199)Jenkins维护之磁盘使用及Jenkins Maven 项目类型:Jenkins磁盘救急指南:告别“磁盘已满”的噩梦!

一次深夜, Jenkins服务器突然告警,磁盘空间不足。手忙脚乱地清理,却发现积压的构建记录和日志像雪球一样越滚越大——这是多少开发者的共同噩梦?

一、 Jenkins磁盘空间危机:深夜运维的噩梦根源

当Jenkins服务器的磁盘空间满时,构建任务会失败,严重影响项目的持续集成和部署。这不仅会导致开发流程中断,还会浪费大量时间在排查和修复问题上。

1.1 磁盘空间被快速吞噬的元凶

Jenkins磁盘空间不足的问题主要源于以下几个方面:

  • 构建历史记录:Jenkins会保存每个构建的历史记录,包括构建结果和日志文件,这些记录会随着时间的推移占用大量磁盘空间。
  • 工作空间残留:每次构建过程中产生的临时文件和目录,尤其是@tmp目录中的内容,如果没有及时清理,会累积占用大量空间。
  • 日志文件积累:构建过程中生成的各种日志文件,特别是那些大于100MB的大文件,是磁盘空间的“隐形杀手”。
  • 插件和依赖库:安装的插件和其依赖库也会占用不少磁盘空间,尤其是那些已经不再使用的插件。

1.2 紧急磁盘空间释放:救火队员手册

当磁盘空间告急时,你需要立即采取以下措施:

1.2.1 快速清理命令

对于紧急情况,可以通过以下命令快速释放磁盘空间:

# 清理Docker无用资源(如果使用容器化部署)
docker system prune -a --volumes --force

# 清理Jenkins工作空间历史记录
find /home/jenkins/jenkins_home -type d -name "builds" -exec rm -rf {}/* \;

# 删除超大日志文件
find /home/jenkins/jenkins_home -type f -name "*.log*" -size +100M -exec rm -f {} \;

1.2.2 诊断磁盘占用根源

明确空间占用来源是优化的前提,可以使用以下工具:

# 安装磁盘分析工具
sudo yum install ncdu -y

# 分析Jenkins目录占用情况
ncdu /home/jenkins_jdk17

# 按大小排序显示Jenkins主目录下各子目录占用
du -h --max-depth=1 /home/jenkins_jdk17/jenkins_home | sort -hr

执行这些命令后,你会重点关注workspace(工作空间)和jobs(构建任务)目录,因为它们通常是空间占用最大的区域。

二、 Jenkins磁盘空间长期治理:从根源解决问题

仅仅解决紧急情况是不够的,我们需要建立长期有效的预防机制,确保磁盘空间问题不再反复出现。

2.1 针对性清理策略

2.1.1 Jenkins专用清理

定期执行以下命令清理Jenkins特定文件:

# 按时间清理构建历史:删除7天前的构建记录
find /home/jenkins_jdk17/jenkins_home/jobs/ -path "*/builds/*" -type d -mtime +7 -exec rm -rf {} \;

# 清理工作空间残留:删除临时工作空间
find /home/jenkins_jdk17/jenkins_home/workspace/ -name "@tmp" -type d -mtime +1 -exec rm -rf {} \;

2.1.2 Docker专项优化

如果使用Docker部署Jenkins,可以通过以下方式优化:

# 清理悬空镜像
docker images -q -f dangling=true | xargs docker rmi

同时,限制容器日志大小,编辑Docker配置文件(/etc/docker/daemon.json),添加以下内容:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

这个配置将容器日志限制为每个文件最大10MB,保留3个文件,防止日志占满磁盘。

2.2 长期预防方案

2.2.1 Jenkins配置优化

实施以下长期预防策略,确保磁盘空间持续健康:

  • 安装监控插件:安装Disk Usage插件(实时监控Jenkins磁盘占用)和ThinBackup插件(增量备份与清理),通过插件界面查看空间使用趋势并触发清理。
  • 设置构建保留策略:进入Manage Jenkins → System Configuration,找到“丢弃旧的构建”选项,配置Max # of builds to keep(保留最大构建次数,如10次)和Days to keep builds(保留天数,如7天),自动清理过期构建。
  • 自动化清理脚本:创建定时清理任务(如/etc/cron.daily/jenkins_cleanup),内容如下:
#!/bin/bash
# 清理30天前的构建记录
find /home/jenkins_jdk17/jenkins_home/jobs/ -path "*/builds/*" -type d -mtime +30 -delete
# 清理临时工作空间
find /home/jenkins_jdk17/jenkins_home/workspace/ -name "@tmp" -type d -mtime +1 -exec rm -rf {} \;
# 清理Docker日志
find /var/lib/docker/containers/ -name "*.log" -size +50M -exec truncate -s 0 {} \;

2.2.2 存储扩容方案

当清理无法满足需求时,考虑扩容:

  • LVM动态扩展:如果使用LVM分区,执行以下命令扩展分区(以扩展50GB为例):
sudo lvextend -L +50G /dev/mapper/ubuntu--vg-home  # 扩展逻辑卷
sudo resize2fs /dev/mapper/ubuntu--vg-home       # 调整文件系统大小

扩展后无需重启服务器,立即生效。

  • 迁移Jenkins数据目录:将数据目录迁移至大容量磁盘:
# 停止Jenkins服务
sudo systemctl stop jenkins

# 同步数据
rsync -avz /home/jenkins_jdk17 /new/storage/

# 创建软链接
sudo ln -sf /new/storage/jenkins_jdk17 /home/jenkins_jdk17

# 启动服务
sudo systemctl start jenkins

2.3 监控与告警增强

配置Prometheus告警规则,当Jenkins存储使用率超过阈值(如10%)时触发告警。

示例规则如下:

- alert: JenkinsLowDiskSpace
  expr: (node_filesystem_avail_bytes{mountpoint="/home/jenkins_jdk17"} / node_filesystem_size_bytes{mountpoint="/home/jenkins_jdk17"}) * 100 < 10
  for: 15m
  labels:
    severity: critical
  annotations:
    summary: "Jenkins存储空间不足 (实例 {{ $labels.instance }})"
    description: "挂载点 /home/jenkins_jdk17 剩余空间仅剩 {{ printf \"%.2f\" (100 - (node_filesystem_avail_bytes{mountpoint=\"/home/jenkins_jdk17\"} / node_filesystem_size_bytes{mountpoint=\"/home/jenkins_jdk17\"}) * 100) }}%"

告警可通过邮件、钉钉等方式发送,及时提醒管理员处理。

三、 Jenkins Maven项目类型深度探索

了解了磁盘管理后,我们转向Jenkins的另一个核心功能——Maven项目类型。Jenkins中自动构建项目的类型有很多,常用的有三种:自由风格软件项目(FreeStyle Project)、Maven项目(Maven Project)和流水线项目(Pipeline Project)。

每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别。

3.1 Maven项目类型的优势

Maven项目类型旨在简化一些常见任务,例如触发下游的依赖项任务、将工件部署到Maven repo、可选择仅对更改的模块进行重新构建,以及按模块分解测试结果。

与自由风格项目相比,Maven项目提供了更贴近Maven工作流程的构建环境,减少了配置复杂度。

3.2 创建Maven项目的准备工作

在创建Maven项目前,需要安装以下插件:

  • Maven Integration plugin:提供Maven项目支持
  • Git PreBuildMerge Trait Plugin:Git集成支持
  • Publish over SSH:通过SSH发布构建产物

安装插件后,就可以开始创建Maven项目了。

四、 实战演示:构建Java Maven应用

让我们通过一个完整的示例,演示如何使用Jenkins构建一个简单的Java Maven应用程序。

4.1 环境准备和项目设置

4.1.1 获取示例代码

首先,从GitHub获取"Hello world!" Java应用程序:

# 克隆示例仓库
git clone https://github.com/YOUR-GITHUB-ACCOUNT-NAME/simple-java-maven-app

4.1.2 启动Jenkins控制器

使用Docker启动专用的Jenkins环境:

# 克隆教程仓库
git clone https://github.com/quickstart-tutorials/quickstart-tutorials

# 进入目录并启动服务
cd quickstart-tutorials
docker compose --profile maven up -d

# 验证容器运行状态
docker compose ps

控制器可以在http://localhost:8080访问。

4.2 创建Pipeline项目

在Jenkins中创建新的Pipeline项目:

  1. 在Jenkins中,选择New Item under Dashboard > 在左上角。
  2. Enter an item name中输入新的Pipeline项目名称。
  3. 向下滚动(如有必要)并选择Pipeline,然后在页面末尾选择OK
  4. 在左侧窗格中选择Pipeline
  5. 选择Definition,然后选择Pipeline script from SCM选项。此选项指示Jenkins从源代码管理(SCM)中获取Pipeline,即你fork的Git仓库。
  6. SCM中的选项中选择Git
  7. Repositories/Repository URL中输入仓库的URL。此URL可以在GitHub仓库主页点击绿色Code按钮找到。
  8. 在页面末尾选择Save

4.3 创建初始Pipeline

创建一个Pipeline,自动在Jenkins中使用Maven构建Java应用程序。Pipeline被创建为一个Jenkinsfile,它被提交到本地克隆的Git仓库(simple-java-maven-app)。

这是"Pipeline-as-Code"的基础,它将持续交付流水线视为应用程序的一部分,像任何其他代码一样进行版本控制和审查。

创建初始Pipeline的步骤:

  1. 使用首选的文本编辑器或IDE,在本地simple-java-maven-app Git仓库的根目录创建并保存一个名为Jenkinsfile的新文本文件。
  2. 复制以下Declarative Pipeline代码并粘贴到新创建的Jenkinsfile中:
pipeline {
    agent any
    stages {
        stage('Build') { 
            steps {
                sh 'mvn -B -DskipTests clean package' 
            }
        }
    }
}

此处定义了出现在Jenkins UI上的名为Build的阶段(指令),并且这个sh步骤运行Maven命令来干净地构建Java应用程序,而不运行任何测试。

  1. 保存编辑的Jenkinsfile并将其提交到本地simple-java-maven-app Git仓库。

在simple-java-maven-app目录中,运行以下命令:

git add .
git commit -m "Add initial Jenkinsfile"
git push

4.4 添加测试阶段

回到文本编辑器/IDE,确保Jenkinsfile是打开的。

Jenkinsfile的Build阶段下添加Test阶段:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') { 
            steps {
                sh 'mvn test' 
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml' 
                }
            }
        }
    }
}

此处定义了一个出现在Jenkins UI上的名为Test的阶段(指令)。这个sh步骤执行Maven命令来在Java应用程序上运行单元测试。该命令还生成一个JUnit XML报告,该报告保存在Jenkins容器内的/var/jenkins_home/workspace/simple-java-maven-app目录中的target/surefire-reports目录中。这个junit步骤(由JUnit插件提供)归档由上面的mvn test命令生成的JUnit XML报告,并通过Jenkins接口显示结果。包含此junit步骤的post部分的always条件确保无论阶段结果如何,在该阶段完成时始终执行该步骤。

4.5 添加最终交付阶段

在Test阶段下添加Deliver阶段:

pipeline {
    agent any
    options {
        skipStagesAfterUnstable()
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
            }
        }
    }
}

这个三阶段的Pipeline展示了完整的CI/CD流程:构建、测试和交付。skipStagesAfterUnstable选项确保如果某个阶段失败,后续阶段将被跳过。

五、 传统Maven项目与Pipeline项目对比

虽然Pipeline项目提供了极大的灵活性,但了解传统Maven项目的创建过程仍然很有价值。

5.1 创建传统Maven项目

5.1.1 项目配置

创建传统Maven项目的步骤:

  1. 在Jenkins中选择"新建任务"。
  2. 输入项目名称,选择"构建一个Maven项目"。
  3. 在"源码管理"部分:
    • 如果代码在GitHub等服务器上,需要填写路径、凭证(账号密码或密钥文件)。
    • 拉取后默认进入项目目录。
5.1.2 构建配置

在"构建"部分配置Maven参数:

  • Goals and optionsclean install -Dmaven.test.skip=true
  • 说明:clean清理,install本地安装,-Dmaven.test.skip跳过测试代码
5.1.3 构建后操作

构建完成后,通常需要打包构建产物:

  • 使用tar命令将当前目录下的内容打包,这个包用于发布到目标主机。
  • 默认位置在/root/.jenkins/workspace/下。

5.2 项目类型选择指南

在实际开发中,可以根据自己的需求和习惯来选择项目类型。以下是三种主要项目类型的比较:

项目类型

灵活性

易用性

功能强大

推荐场景

自由风格项目

中等

中等

简单构建任务

Maven项目

中等

中等

纯Maven项目

流水线项目

非常高

中等

复杂构建流程

个人推荐使用流水线类型,因为灵活度非常高。

结论:打造健壮高效的Jenkins环境

通过本文的深入分析,我们全面探讨了Jenkins磁盘空间管理和Maven项目类型的各个方面。有效的Jenkins维护需要综合运用多种方法:定期清理不必要的构建历史记录、配置磁盘空间警报、清理插件和依赖库、使用外部存储以及优化构建任务配置。

同时,根据项目需求选择合适的项目类型——无论是自由风格项目、Maven项目还是流水线项目——都能显著提高持续集成和持续部署的效率和可靠性。

通过合理地运用这些方法和策略,你可以有效地优化Jenkins的磁盘使用,提高其运行效率,确保你的开发流程顺畅无阻,告别"磁盘已满"的深夜告警噩梦。

记住,一个健康管理的Jenkins环境是高效CI/CD流程的基石,花时间在预防性维护上,远比应对紧急磁盘空间危机要划算得多。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值