安全重载Jenkins配置,无需重启
从磁盘安全重载Jenkins配置,了解何时更适合安全重启,并避免使用有风险的脚本控制台快捷方式。
安全重载Jenkins配置,无需重启
重载Jenkins配置听起来无害,直到你在繁忙的控制器上执行此操作,并发现并非所有更改都能在作业运行时干净地应用。正确的命令取决于更改的内容。
如果你编辑了JENKINS_HOME中的XML文件、从备份恢复了作业,或在Web UI之外更改了文件,Jenkins可以从磁盘重载配置。如果你安装或升级了插件、更改了Java选项,或需要刷新运行时状态,安全重启通常是更好的工具。这些是不同的操作。
应避免的误导性快捷方式是在脚本控制台中使用System.exit(10)。根据Jenkins的启动方式,它可能导致进程管理器、Servlet容器或服务包装器重启Jenkins,但这并不是一个干净的“重载配置”命令。它可能中断工作并隐藏意图。请改用Jenkins CLI或内置的管理操作。
使用CLI从磁盘重载配置
最清晰的命令是reload-configuration:
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" reload-configuration
这告诉Jenkins丢弃已加载的配置并重新从磁盘读取。在受控的文件更改后(例如恢复作业配置或应用自动化生成的配置)非常有用。
在运行之前,检查三件事:
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" who-am-i
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" list-jobs >/dev/null
该账户需要管理权限才能重载配置。不要使用某人笔记本电脑上的个人管理员令牌进行日常自动化。使用托管的管理员账户,将令牌保存在密钥存储中,并根据你的策略定期轮换。
如果你更喜欢Web UI,请使用Manage Jenkins,并在你的Jenkins版本和已安装组件中可用时使用重载选项。CLI更容易审计,因为命令可以存在于运行手册中。
何时安全重启是更好的选择
安全重启会等待正在运行的构建完成,然后重启Jenkins。它比重载慢,但当运行时状态必须重建时,它更可靠。
在插件安装或升级、Java选项更改、Jenkins核心升级,或仅在完整控制器重启后出现的行为之后,使用安全重启。
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" safe-restart
如果环境允许,你也可以使用/safeRestart端点,但CLI形式更容易标准化。
不要承诺零停机。重载可能会短暂影响UI,而安全重启会在构建排空后有意重启控制器。如果代理断开连接或插件行为异常,用户可能会注意到。在影响范围可接受的时间安排操作。
更安全的重载运行手册
首先,宣布维护窗口,即使时间很短。然后检查正在运行的内容:
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" list-jobs
对于快速队列检查,通过CLI使用Groovy:
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" groovy = <<'EOF'
Jenkins.instance.queue.items.each { item ->
println "Queued: ${item.task.fullDisplayName}"
}
Jenkins.instance.computers.each { computer ->
computer.executors.findAll { it.isBusy() }.each { executor ->
println "Running on ${computer.displayName}: ${executor.currentExecutable}"
}
}
EOF
备份你要依赖的配置。至少要有JENKINS_HOME的最近备份,特别是config.xml、作业目录、凭据元数据和插件状态。小心处理凭据文件;将备份作为机密保护。
运行重载:
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" reload-configuration
然后验证控制器是否响应:
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" who-am-i
java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN" list-jobs >/dev/null
在宣布工作完成之前,检查系统日志和一个代表性作业。成功返回的重载仍可能暴露错误的作业XML、缺失的插件或权限问题。
关于Groovy重载脚本
脚本控制台功能强大,因为它在Jenkins控制器内部运行。这也是为什么需要谨慎的原因。任何脚本控制台用户都可以读取机密、修改作业、禁用安全控制或破坏控制器。
如果你需要Groovy进行检查,请保持只读且简短。例如:
println Jenkins.instance.version
println Jenkins.instance.items.size()
println Jenkins.instance.queue.items.size()
除非你已经针对你的Jenkins版本和插件进行了测试,否则避免使用未记录的内部重载调用。内部API可能会更改,插件特定的重载方法可能不会重载你关心的状态。
对于“配置即代码”设置,请使用插件文档化的重载机制,而不是通用的Jenkins重载。JCasC有自己的模型和验证行为,一个在磁盘上看起来正确的配置文件在应用时仍可能失败。
如果重载出错该怎么办
如果Jenkins返回时缺少作业、视图损坏或插件错误,不要继续点击重载。捕获系统日志,记录时间,并将更改的文件与备份进行比较。常见原因包括格式错误的XML、引用已卸载插件的作业配置,或在Jenkins仍在写入文件时进行的手动编辑。
如果UI不稳定但进程仍在运行,安全重启可能会清除临时状态。如果配置确实有问题,请先恢复之前的文件,然后重载或重启。
最安全的模式很简单:对磁盘配置更改使用reload-configuration,对运行时和插件更改使用safe-restart,并将脚本控制台保留用于你可以逐行解释的、经过深思熟虑的管理脚本。