写在前面
最近在学习Linux运维的过程中,需要搭建一套Jenkins持续集成环境。整个过程涉及JDK安装、WAR包部署、Systemd服务管理、防火墙与SELinux配置,以及日志持久化等多个环节。这篇文章不是简单的命令罗列,而是把我从踩坑到解决问题的完整思路记录下来,希望对同样在实践的朋友有所帮助。
一、环境准备与软件选型
1.1 系统环境
| 操作系统 | Rocky Linux 9 |
| JDK版本 | OpenJDK 25 |
| Jenkins版本 | 2.516.x LTS(稳定版) |
| 部署方式 | WAR包 + Systemd服务 |
1.2 为什么选择Rocky Linux 9
Rocky Linux作为CentOS的替代方案,在企业级生产环境中应用越来越广泛。它完全兼容RHEL,包管理使用dnf,系统稳定且社区活跃。
1.3 为什么用WAR包而非YUM安装
Jenkins官方提供了两种主流安装方式:
| YUM/DNF仓库 | 安装简单,自动处理依赖 | 版本更新较慢,路径固定 |
| WAR包部署 | 版本灵活,可自定义路径 | 需手动管理服务和启动参数 |
生产环境中,为了更好的版本控制和服务管理,使用WAR包部署更为灵活。配合Systemd服务文件,同样可以实现开机自启和崩溃自动重启。
二、JDK环境配置
Jenkins是基于Java开发的应用,从2.357版本开始要求JDK 11以上,我们使用最新的JDK 25。
2.1 安装OpenJDK 25
Rocky Linux 9的默认仓库已经收录了JDK 25:
# 安装headless版本(生产环境无需图形界面)
sudo dnf install -y java-25-openjdk-headless
验证安装
java -version
预期输出:
openjdk version "25.0.3" 2026-04-21 LTS
OpenJDK Runtime Environment (Red_Hat-25.0.3.0.9-1) (build 25.0.3+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-25.0.3.0.9-1) (build 25.0.3+9-LTS, mixed mode, sharing)
💡 提示:如果dnf下载速度慢,建议先配置国内镜像源(如阿里云、清华源),可以显著提升软件包下载速度。
2.2 JDK安装路径验证
# 查看Java可执行文件路径
which java
# 输出: /usr/bin/java
查看完整路径
readlink -f /usr/bin/java
输出: /usr/lib/jvm/java-25-openjdk-25.0.3.0.9-1.x86_64/bin/java
这个路径在配置Systemd服务文件时需要用到。
三、下载与部署Jenkins
3.1 创建专用目录
按照良好的目录规范,将Jenkins部署在/opt目录下:
# 创建Jenkins工作目录
sudo mkdir -p /opt/jenkins
切换目录
cd /opt/jenkins
3.2 下载Jenkins WAR包
从国内镜像站下载,速度快且稳定:
# 使用清华镜像站下载最新稳定版
sudo wget -O /opt/jenkins/jenkins.war \\
https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war
查看下载结果
ls -lh /opt/jenkins/
-rw-r–r– 1 root root 97M Jul 9 23:42 jenkins.war
官方镜像站汇总:
| 清华镜像 | mirrors.tuna.tsinghua.edu.cn/jenkins/ | 教育网/国内首选 |
| 阿里云镜像 | mirrors.aliyun.com/jenkins/ | 国内备用 |
| 官方站 | mirrors.jenkins.io/ | 国外环境 |
3.3 关于字体错误的处理
第一次使用java -jar启动时,可能会遇到如下错误:
java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration
这是由于最小化安装的系统缺少字体包,Jenkins的Web图表功能依赖字体渲染。
解决方案:
# 安装字体配置工具和常用字体
sudo dnf install -y fontconfig dejavu-sans-fonts dejavu-serif-fonts
刷新字体缓存
fc-cache -fv
安装完成后重启Jenkins即可正常启动。
四、Systemd服务管理
4.1 为什么要用Systemd
手动执行java -jar jenkins.war的方式有诸多问题:
- 关闭终端后服务即停止
- 服务器重启后需手动重新启动
- 进程崩溃后无法自动恢复
- 无法通过systemctl统一管理
通过Systemd将Jenkins注册为系统服务,可以完美解决以上所有问题。
4.2 编写Service文件
创建服务文件:
sudo vim /etc/systemd/system/jenkins.service
写入以下内容:
[Unit]
Description=Jenkins Continuous Integration Server
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/jenkins
ExecStart=/usr/bin/java -jar /opt/jenkins/jenkins.war
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
配置项说明:
| Type | 服务类型 | simple(前台进程) |
| WorkingDirectory | 工作目录 | 指向Jenkins安装目录 |
| ExecStart | 启动命令 | 完整路径的java命令 |
| Restart | 重启策略 | on-failure(非正常退出自动重启) |
| RestartSec | 重启等待时间 | 10秒 |
4.3 启动与验证
# 重新加载systemd配置
sudo systemctl daemon-reload
启动Jenkins服务
sudo systemctl start jenkins
设置开机自启
sudo systemctl enable jenkins
查看服务状态
sudo systemctl status jenkins
状态显示active (running)说明启动成功。
4.4 崩溃自动重启验证
Systemd的Restart=on-failure配置可以自动恢复崩溃的进程:
# 1. 查看当前进程PID
ps aux | grep jenkins.war | grep -v grep
2. 强制杀掉进程(模拟崩溃)
kill -9 <PID>
3. 等待10秒后查看状态
systemctl status jenkins
进程已经自动恢复,运行时间重新计时
五、防火墙与SELinux配置
5.1 防火墙放行8080端口
Jenkins默认监听8080端口,需要放行外部访问:
# 永久开放8080端口
sudo firewall-cmd –permanent –add-port=8080/tcp
重新加载防火墙规则
sudo firewall-cmd –reload
查看已开放的端口
sudo firewall-cmd –permanent –list-all
确认输出中包含ports: 8080/tcp。
六、日志管理与持久化配置
6.1 Journald日志管理
Systemd管理的服务日志默认由journald收集。生产环境下需要合理配置日志存储策略,防止日志占满磁盘。
查看日志占用空间:
journalctl –disk-usage
# 输出: Archived and active journals take up 1.2G in the file system.
日志清理命令:
# 按大小清理——保留500MB
journalctl –vacuum-size=500M
按时间清理——只保留7天
journalctl –vacuum-time=7d
6.2 持久化配置
编辑journald配置文件,设置合理的上限:
sudo vim /etc/systemd/journald.conf
关键配置项:
[Journal]
# 持久化存储(默认是自动,建议设为持久)
Storage=persistent
最大日志文件大小(单个文件)
SystemMaxUse=500M
最大日志文件总大小
SystemMaxFileSize=50M
保留日志文件的最大天数
MaxRetentionSec=7day
压缩日志文件
Compress=yes
修改后重启journald服务:
sudo systemctl restart systemd-journald
6.3 Jenkins日志文件配置
除了Systemd日志,Jenkins自身也会生成日志文件。可以通过修改启动参数来配置日志级别和输出位置。
编辑/etc/systemd/system/jenkins.service文件,在ExecStart行添加日志参数:
ExecStart=/usr/bin/java -Djava.util.logging.config.file=/opt/jenkins/logging.properties -jar /opt/jenkins/jenkins.war
创建日志配置文件/opt/jenkins/logging.properties:
handlers=java.util.logging.FileHandler
java.util.logging.FileHandler.pattern=/var/log/jenkins/jenkins.log
java.util.logging.FileHandler.limit=10485760
java.util.logging.FileHandler.count=5
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append=true
创建日志目录并设置权限:
sudo mkdir -p /var/log/jenkins
sudo chown -R root:root /var/log/jenkins
sudo chmod 755 /var/log/jenkins
重启Jenkins服务使配置生效:
sudo systemctl daemon-reload
sudo systemctl restart jenkins
以下是根据要求调整后的内容(已删除“七、安全加固与优化建议”部分):
6.4 修改默认端口
生产环境建议修改默认的8080端口,减少被扫描的风险。修改Systemd服务文件:
ExecStart=/usr/bin/java -jar /opt/jenkins/jenkins.war –httpPort=9090
同时更新防火墙规则:
sudo firewall-cmd –permanent –remove-port=8080/tcp
sudo firewall-cmd –permanent –add-port=9090/tcp
sudo firewall-cmd –reload
6.5 使用非root用户运行
为安全考虑,建议创建专用用户运行Jenkins:
# 创建jenkins用户
sudo useradd -r -m -d /opt/jenkins -s /bin/bash jenkins
修改目录权限
sudo chown -R jenkins:jenkins /opt/jenkins
修改Systemd服务文件中的用户配置
User=jenkins
Group=jenkins
6.6 配置反向代理
使用Nginx或Apache作为反向代理,可以提供HTTPS支持和更好的性能:
# Nginx配置示例
server {
listen 80;
server_name jenkins.yourdomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
七、总结
本文详细记录了在Rocky Linux 9上从零部署Jenkins CI环境的完整过程,涵盖了从JDK安装、WAR包部署到Systemd服务管理、防火墙配置和日志持久化的全流程。通过Systemd服务管理,我们实现了Jenkins的自动启动、崩溃恢复和统一管理;通过合理的日志配置,确保了生产环境的稳定运行。
关键要点总结:
- 系统选择:Rocky Linux 9作为企业级Linux发行版,稳定且兼容性好
- 部署方式:WAR包部署提供更好的版本控制和灵活性
- 服务管理:Systemd确保服务的高可用性和易管理性
- 安全配置:防火墙、和非root用户运行提升安全性
- 日志管理:合理的日志配置防止磁盘空间被占满
这套部署方案已经过生产环境验证,可以作为企业级Jenkins部署的参考模板。根据实际需求,还可以进一步配置HTTPS、备份策略和监控告警,构建更完善的CI/CD平台。
网硕互联帮助中心




评论前必须登录!
注册