使用 systemd 管理 Jenkins 服务

从 Jenkins 2.332.1 和 2.335 开始,Linux 安装包使用 systemd 管理服务。RPM 与 deb 安装器会将 System V init 配置迁移到 systemd 覆盖配置中。

查看服务配置

使用以下命令,查看安装包与覆盖文件共同形成的当前 Jenkins 服务配置:

systemctl cat jenkins
# /etc/systemd/system/jenkins.service
#
# This file is managed by systemd(1). Do NOT edit this file manually!
# To override these settings, run:
#
#     systemctl edit jenkins
#
# For more information about drop-in files, see:
#
#     https://www.freedesktop.org/software/systemd/man/systemd.unit.html
#

[Unit]
Description=Jenkins Continuous Integration Server
Requires=network.target
After=network.target

[Service]
Type=notify
NotifyAccess=main
ExecStart=/usr/bin/jenkins
Restart=on-failure
SuccessExitStatus=143

# /etc/systemd/system/jenkins.service.d/override.conf
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true"

覆盖服务配置

在运行 systemd 的现代 Linux 发行版上,服务单元文件位于:

发行版 路径
Debian /lib/systemd/system/jenkins.service
Red Hat /usr/lib/systemd/system/jenkins.service
openSUSE /usr/lib/systemd/system/jenkins.service

主服务单元是只读的,不应手动编辑。文件顶部也有醒目的只读提示。

可以在服务的 drop-in 单元,也就是 override.conf 文件中覆盖值。执行:

# systemctl edit jenkins

文件保存在 /etc/systemd/system/jenkins.service.d/override.conf,用于自定义服务。服务相关设置需要放在 [Service] 部分才会生效。示例内容:

[Unit]
Description=My Company Jenkins Controller

[Service]
# Add JVM configuration options
Environment="JAVA_OPTS=-Djava.awt.headless=true -XX:+UseStringDeduplication"

# Arbitrary additional arguments to pass to Jenkins.
# Full option list: java -jar jenkins.war --help
Environment="JENKINS_OPTS=--prefix=/jenkins --javaHome=/opt/jdk-21"

# Configuration as code directory
Environment="CASC_JENKINS_CONFIG=/var/lib/jenkins/configuration-as-code/"

systemctl edit jenkins 会以 root 身份创建 drop-in 文件,权限为 0644,即 -rw-r--r--。迁移逻辑则以 root 创建权限为 0600,即 -rw------- 的文件。

如果在覆盖配置中保存 HTTPS 密钥库路径或密码,同时又直接在控制器上运行作业,这一区别可能影响安全。Jenkins 项目明确不建议在控制器上直接运行作业。拿不准时,可用 chmod 将覆盖文件权限设为 0600。

drop-in 单元统一了 Debian、Red Hat 和 openSUSE 三类发行版的配置方法,且升级时不会被覆盖。

与 System V init 配置不同,override.conf 只包含自定义项,不包含原始默认值。习惯修改现成默认值的用户,应在编辑时同时参考只读服务单元,或运行 systemctl edit jenkins --full,复制原始服务单元,而不是创建 drop-in。

通过 systemctl edit jenkins 编辑会自动重新加载 systemd 配置,设置在下次 Jenkins 重启时生效。如果不用 systemctl 编辑,则需要自行运行 systemctl daemon-reload。

还应了解服务单元中的 specifier(说明符)。drop-in 不进行 shell 展开,但可以使用说明符插入主机名、单元名称、操作系统内核版本等上下文信息。systemd 文档提供了可用说明符列表。

启动服务

定义服务后,运行:

# systemctl start jenkins

如果 Jenkins 没有在配置的时间内报告启动完成,systemd 会认为启动失败并再次关闭服务。

每达到一个初始化里程碑,超时期限都会增加 jenkins.model.Jenkins.extendTimeoutSeconds 系统属性指定的时长,默认 15 秒。这些里程碑包括开始初始化、列出所有插件、准备所有插件、启动所有插件、增强所有扩展、加载系统配置、适配系统配置、加载所有作业、更新全部作业配置,以及完成初始化。

可以通过服务单元中的 TimeoutStartSec 指令配置启动超时。

停止服务

# systemctl stop jenkins

重启服务

# systemctl restart jenkins

重新加载服务定义

修改配置文件后,可能需要重新加载服务定义:

# systemctl daemon-reload

查看服务日志

journalctl -u jenkins

清理服务日志

systemd 保存的日志通常会自动轮转。如果需要缩减日志占用,可以运行:

journalctl --vacuum-size=500M

查看服务状态

使用 systemctl status jenkins 查看状态。下面是几个示例。

升级插件之后:

systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: active (running) […]
   Main PID: […] (java)
     Status: "Restart in 10 seconds"

Jenkins 正在关闭:

systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: deactivating (stop-sigterm) since […]
   Main PID: […] (java)
     Status: "Stopping Jenkins"

Jenkins 正在启动:

systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: activating (start) since […]
   Main PID: […] (java)

成功启动后:

systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: active (running) since […]
   Main PID: […] (java)

延伸阅读

原文推荐 DigitalOcean 的 systemd 服务与单元教程、Fedora 的 systemd 理解与管理指南、freedesktop.org 的 systemd 参考文档,以及 Debian Wiki 的 systemd 页面。相关链接可从原文访问。


原文:Managing systemd services。作者/维护方:Jenkins 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容