云计算百科
云计算领域专业知识百科平台

彭大帅的CI/CD实战第3篇 调度中枢:Jenkins 控制器部署

官方 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/secrets/initialAdminPassword。
  • 插件:选「安装推荐的插件」。推荐集已包含后续流水线需要的全部组件——pipeline 全家桶、git、credentials-binding、ssh-slaves、中文语言包等,装完即可,不要逐个手选。
  • 创建管理员:本机创建账号 peng。这一步创建的就是超级管理员,不要继续用默认 admin。
  • 实例地址:填 http://10.10.10.77:8080,它影响邮件里的链接和 Webhook 回显地址。
  • 初始化完成后,插件落盘在 /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 控制器就绪的验收标准,五条:

  • rpm -q jenkins 输出 2.580.2;服务 active 且 enabled。
  • /proc/<PID>/exe 指向 java-21 路径,JVM 版本核对无误。
  • Web 可登录(管理员账号 peng),界面为中文,推荐插件安装完成。
  • API Token 已生成并妥善保存,只显示一次的那次复制没有丢。
  • override.conf 三行配置在位,systemctl cat jenkins 能看到合并后的效果。
  • 指挥官就位,但手下还没有兵。下一篇部署构建节点 build-agent——真正跑 mvn package 的地方。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 彭大帅的CI/CD实战第3篇 调度中枢:Jenkins 控制器部署
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!