官方 rpm + systemd 托管 + OpenJDK 21,从安装到初始化全流程
系列第 3 篇 · 共 10 篇
环境版本:Jenkins 2.580.2 LTS / OpenJDK 21.0.13
目 录
一、本篇在主线中的位置
二、安装 OpenJDK 21
三、官方 yum 源与安装
四、systemd 托管:drop-in 覆盖
五、启动与验证
六、Web 初始化向导
七、安全策略:Webhook 能不能触发,现在就定了
八、生成 API Token
九、日常运维与备份
十、本章验证
一、本篇在主线中的位置
第1篇 基线 → 第2篇 GitLab → 第3篇 Jenkins ◀── 你在这里
第4篇 构建节点 → 第5篇 双活集群 → 第6~8篇 流水线
GitLab 管住了代码,还差一个「指挥官」:谁监听 push、谁编排构建、谁推动发布。这就是 Jenkins 控制器。本篇在 jenkins-master(1 核 / 3.5G / 10.10.10.77)上部署 Jenkins 2.580.2 LTS。
安装方式上,本篇与很多旧教程有本质区别,先对比一下:
|
维度 |
旧教程常见做法 |
本篇做法(实测) |
|
运行方式 |
jenkins.war 扔进 Tomcat,或装完手动配 sysconfig |
官方 rpm + systemd 托管,drop-in 覆盖配置 |
|
Java 版本 |
OpenJDK 8 / 11(新版 Jenkins 已不支持) |
OpenJDK 21,JAVA_HOME 显式指定 |
|
配置入口 |
/etc/sysconfig/jenkins(新包已不读取) |
systemctl edit jenkins(override.conf) |
|
升级方式 |
换 war 包重部署 |
dnf 升级,配置不丢 |
一句话:把 Jenkins 当成「系统服务」而不是「一个 war 包」来管。升级不被覆盖、故障自拉起、日志进 journal,这些都是 systemd 白送的。
二、安装 OpenJDK 21
Rocky 9 的 appstream 直接提供 JDK 21,不要用第三方 tar 包:
dnf install -y java-21-openjdk java-21-openjdk-devel
java -version
# openjdk version "21.0.13" 2026-10-20 LTS
ls -d /usr/lib/jvm/java-21-openjdk*
# /usr/lib/jvm/java-21-openjdk
记住这个安装路径,第四步的 systemd 单元里要写它。
一个容易忽略的风险:本机同时存在 java-17 和 java-8 的历史依赖包,默认 java 命令指向哪个版本是不确定的。所以后面必须用 JAVA_HOME 显式指定 21,不能赌系统默认——这是踩过的坑(第 7 篇坑 6)。
三、官方 yum 源与安装
导入签名 key 并配置 repo。实验环境用阿里云镜像加速:
curl -fsSL https://mirrors.aliyun.com/jenkins/rpm-stable/jenkins.io-2026.key -o /tmp/jk.key
rpm –import /tmp/jk.key
cat > /etc/yum.repos.d/jenkins.repo <<EOF2
[jenkins]
name=Jenkins Stable (Aliyun mirror)
baseurl=https://mirrors.aliyun.com/jenkins/rpm-stable/
gpgcheck=1
gpgkey=file:///tmp/jk.key
enabled=0
EOF2
enabled=0 是刻意的:防止日常 dnf update 把 Jenkins 连带插件一起升上去(新版本可能与已装插件不兼容)。安装时显式启用:
dnf –enablerepo=jenkins install -y jenkins
rpm -q jenkins # jenkins-2.580.2-1.noarch
生产环境的改进项:把 key 固定放到 /etc/pki/rpm-gpg/ 下,repo 的 gpgkey 指过去。本机曾把 key 放在 /tmp 里,后来 /tmp 被清理导致再装包报 GPG 校验失败(第 7 篇坑 5)。
四、systemd 托管:drop-in 覆盖
rpm 自带单元文件 /usr/lib/systemd/system/jenkins.service。原则:不直接改它(升级会被覆盖),用 drop-in 覆盖,也就是 systemctl edit jenkins。本机生成的 /etc/systemd/system/jenkins.service.d/override.conf:
[Service]
Environment="JAVA_HOME=/usr/lib/jvm/java-21-openjdk"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Xms512m -Xmx1024m -XX:+UseG1GC"
Environment="JENKINS_PORT=8080"
三行配置各自的用意:
|
参数 |
作用与理由 |
|
JAVA_HOME |
强制 JVM 用 JDK 21。不设的话用系统默认 java,可能是 8 或 17,直接起不来(坑 6) |
|
JAVA_OPTS |
堆 512m~1024m 适配 3.5G 小机器;G1 回收器降低停顿;headless 免去图形依赖 |
|
JENKINS_PORT |
默认就是 8080,显式声明便于日后统一改端口 |
单元文件本身还有几个值得知道的默认值:服务以 jenkins 用户运行,主目录 JENKINS_HOME 在 /var/lib/jenkins,故障自动重启(Restart=on-failure)。最特别的是 Type=notify——systemd 会等 Jenkins 真正就绪才标记 active,所以启动命令停顿 20~60 秒属正常,不要以为卡死又去重启。
五、启动与验证
systemctl daemon-reload
systemctl enable –now jenkins
systemctl is-active jenkins # active
ss -lntp | grep 8080 # 确认监听
tail -f /var/log/jenkins/jenkins.log # 应用日志
journalctl -u jenkins -f # systemd 日志
最后一步验证最容易被省略,也最重要:确认进程用的真是 JDK 21,而不是系统默认的某个旧版本。
pgrep -f jenkins.jar # 拿到进程号
ls -l /proc/<PID>/exe
# 预期指向 /usr/lib/jvm/java-21-openjdk-21.0.13…/bin/java
三条验证对应三个层次:服务活着(is-active)、端口在听(ss)、版本对了(/proc 链接)。缺一不可——前两条过了、版本不对的案例,就是坑 6 的真实形态。
六、Web 初始化向导
浏览器打开 http://10.10.10.77:8080,四步走完初始化:
初始化完成后,插件落盘在 /var/lib/jenkins/plugins,可以 ls 确认:workflow 系列是声明式流水线的本体,git 与 git-client 负责拉代码,localization-zh-cn 让界面变中文。第 6 篇配流水线时,需要的插件此刻已全部就位。
七、安全策略:Webhook 能不能触发,现在就定了
初始化向导默认生成的安全配置,实测在 /var/lib/jenkins/config.xml 里是三件事:开启安全、授权策略为「登录用户拥有全部权限、匿名无任何权限」、开启 CSRF 防护(crumb)。
这个默认配置很安全,但立刻产生一个连锁问题:GitLab 的 Webhook 是匿名请求,推过来直接被 403 拒绝。两种解法,选哪种是原则问题:
- 放开匿名构建权限——不推荐。等于把构建入口向所有人敞开。
- 用 API Token 做 Basic 认证——本环境采用,第 6 篇流水线集成时落地。
crumb 的影响范围也交代一下:用 curl 直接 POST 调 Jenkins API 需要携带 crumb 令牌;但用构建令牌(?token=)触发的接口不受 crumb 限制——这正是 Webhook 场景选构建令牌的原因之一。此处先埋个伏笔,第 6、7 篇展开。
八、生成 API Token
路径:右上角账号 → 设置 → API Token → 添加新 Token。生成后只显示一次,立刻复制保存。这个 Token 就是第 2 篇 Webhook URL 里内嵌的那一个。
命令行调用验证(第 6 篇配好任务后可用):
curl -u 'peng:<API_TOKEN>' \\
"http://10.10.10.77:8080/job/cicd-demo/build?token=<构建令牌>"
# 查构建结果
curl -s -u 'peng:<API_TOKEN>' \\
"http://10.10.10.77:8080/job/cicd-demo/api/json?tree=builds[number,result]"
安全提示:脚本里内联 Token 会留在 history,正式环境建议用 netrc 文件或 Jenkins CLI。
九、日常运维与备份
systemctl restart jenkins # 重启(会中断正在跑的构建)
journalctl -u jenkins –since today # 今日日志
grep -iE 'error|exception' /var/log/jenkins/jenkins.log | tail -50
备份(热备先停服务最稳):
tar czf /root/jenkins-backup.tar.gz \\
/var/lib/jenkins/config.xml \\
/var/lib/jenkins/credentials.xml \\
/var/lib/jenkins/jobs \\
/var/lib/jenkins/nodes \\
/var/lib/jenkins/users \\
/var/lib/jenkins/secrets \\
/etc/systemd/system/jenkins.service.d
一组容易踩雷的关系:secrets 目录与 credentials.xml 是成对的——只拷 credentials.xml 不拷 secrets,恢复后所有凭据都解不开,等于白备。
本机最终状态核对表:
|
项目 |
值 |
|
服务 |
jenkins:active / enabled |
|
监听 |
8080 端口 |
|
JVM |
OpenJDK 21.0.13(/usr/lib/jvm/java-21-openjdk) |
|
JENKINS_HOME |
/var/lib/jenkins(未独立分区,增长风险见第 9 篇) |
|
根分区占用 |
4.9G / 46G(11%) |
十、本章验证
Jenkins 控制器就绪的验收标准,五条:
指挥官就位,但手下还没有兵。下一篇部署构建节点 build-agent——真正跑 mvn package 的地方。
网硕互联帮助中心






评论前必须登录!
注册