如何备份和恢复您的 Jenkins 实例
Jenkins 作为持续集成和持续交付 (CI/CD) 的中央自动化枢纽。其配置数据——包括作业定义、用户凭据、插件设置和构建历史——代表着重要的组织投资。由于硬件故障、配置错误或迁移而丢失这些数据可能会完全中断开发流水线。
本综合指南详细介绍了健壮 Jenkins 备份策略的基本组成部分,重点介绍高度可靠的文件系统快照方法。我们将提供分步说明,用于安全地备份您的实例以及相应的无缝恢复过程,从而确保业务连续性和安心。
核心理解:$JENKINS_HOME 目录
每个 Jenkins 实例都依赖于一个根目录,称为 $JENKINS_HOME。此目录包含所有配置文件、插件、日志和作业数据。备份 Jenkins 的基本含义就是备份此目录的内容。
根据您的安装方法(例如,Linux 软件包、Docker 容器),$JENKINS_HOME 的位置通常不同:
- Linux(软件包安装):
/var/lib/jenkins - Docker: 通常挂载到卷,例如
/var/jenkins_home - 独立 JAR: Jenkins 进程启动的目录,除非通过环境变量指定。
识别关键数据组件
虽然备份整个 $JENKINS_HOME 目录是最简单的方法,但如果包含构建历史和工作区数据,可能会导致档案非常庞大。为了快速有效的灾难恢复备份,您必须确保捕获以下目录和文件:
| 组件 | $JENKINS_HOME 内的路径 |
用途 |
|---|---|---|
| 全局配置 | config.xml |
Jenkins 根实例的主要配置文件。 |
| 作业定义 | jobs/ |
包含每个已配置作业的子目录,每个子目录都有自己的 config.xml。 |
| 用户和凭据 | users/ 和 credentials.xml |
用户帐户、安全领域设置和存储的密钥。 |
| 安全密钥 | secrets/ |
用于解密敏感数据(如存储的凭据)至关重要的加密密钥。 |
| 插件列表 | plugins/ |
包含所有已安装插件的 .hpi 文件。 |
| 节点定义 | nodes/ |
所有连接的构建代理的配置(如果已定义)。 |
方法 1:文件系统备份(推荐)
备份 Jenkins 最可靠的方法是在服务暂时停止时,创建所需文件的一致的压缩档案。
步骤 1:停止 Jenkins 服务
为了确保数据一致性并防止在备份过程中文件部分写入,必须停止 Jenkins 进程。未能停止服务可能会导致备份不完整或损坏。
# 对于使用 systemd 的系统(大多数现代 Linux 发行版)
sudo systemctl stop jenkins
# 或者,对于使用 service 命令的系统
sudo service jenkins stop
步骤 2:创建备份档案
导航到 $JENKINS_HOME 的父目录,并使用 tar 创建一个压缩档案。强烈建议排除大型构建产物以节省空间和时间。
假设 $JENKINS_HOME 是 /var/lib/jenkins:
JENKINS_HOME="/var/lib/jenkins"
BACKUP_TARGET="/mnt/backups/jenkins"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ARCHIVE_NAME="jenkins_backup_${TIMESTAMP}.tar.gz"
# 如果目标目录不存在,则创建它
mkdir -p $BACKUP_TARGET
# 创建档案,排除构建历史和工作区
sudo tar -czvf $BACKUP_TARGET/$ARCHIVE_NAME \n --exclude="${JENKINS_HOME}/workspace" \n --exclude="${JENKINS_HOME}/caches" \n --exclude="${JENKINS_HOME}/jobs/*/builds" \n $JENKINS_HOME
提示:包含构建历史
如果保留构建历史 (
jobs/*/builds) 至关重要,您可以删除相应的--exclude标志。但是,请准备好档案大小可能达到数百千兆字节的情况。
步骤 3:验证并异地存储
档案创建后,测试其完整性并立即将其传输到外部、地理位置独立存储位置(例如 S3 存储桶、网络驱动器),以防止发生全站故障。
步骤 4:重启 Jenkins
sudo systemctl start jenkins
方法 2:利用 Jenkins 备份插件(部分解决方案)
虽然存在 ThinBackup 或 Backup Plugin 等插件,但它们通常只捕获配置文件 (config.xml),并且可能无法稳健地处理大文件或所有必要的安全元素。这些插件通常只适用于备份作业配置,不应作为完整、安全的灾难恢复策略的依据。
恢复您的 Jenkins 实例
恢复涉及将备份数据复制到目标机器的 $JENKINS_HOME 目录,并在启动服务之前确保文件权限正确。
步骤 1:准备目标环境
确保目标系统(或修复后的系统)已安装 Jenkins,但保持服务停止。
sudo systemctl stop jenkins
步骤 2:清除现有 Jenkins 数据(可选但推荐)
如果您要恢复到以前托管过 Jenkins 的机器,请清除现有的 $JENKINS_HOME 内容,以确保环境干净。
# 使用 'rm -rf' 命令时请务必小心!
sudo rm -rf /var/lib/jenkins/*
步骤 3:解压备份档案
将压缩档案 (jenkins_backup_latest.tar.gz) 复制到目标机器,并将其解压到 $JENKINS_HOME 目录中。-C 标志指定解压的目标目录。
# 假设档案在 /tmp 中,并且 JENKINS_HOME 是 /var/lib/jenkins
sudo tar -xzvf /tmp/jenkins_backup_latest.tar.gz -C /var/lib/
# 注意:如果 tar 命令在档案中包含了父目录,请调整路径。
# 结果应该是档案内容替换 /var/lib/jenkins 的内容
步骤 4:验证并更正权限
这是恢复后最关键的步骤。如果文件所有权不正确,Jenkins 将无法启动或安全运行。您必须递归地将所有权设置为 Jenkins 服务运行的用户和组(通常是 jenkins:jenkins)。
JENKINS_HOME="/var/lib/jenkins"
JENKINS_USER="jenkins"
JENKINS_GROUP="jenkins"
sudo chown -R $JENKINS_USER:$JENKINS_GROUP $JENKINS_HOME
sudo chmod -R 755 $JENKINS_HOME
步骤 5:启动 Jenkins 并验证
启动服务并监控日志以确保成功启动。
sudo systemctl start jenkins
# 监控启动日志
sudo tail -f /var/log/jenkins/jenkins.log
成功启动后,验证所有作业、用户和已安装插件是否存在并正常运行。
自动化备份的最佳实践
要超越手动备份,请使用系统工具和外部配置管理实现自动化。
1. 利用 Cron 作业
使用 cron 或类似的调度程序,安排备份脚本(方法 1 的步骤 1 和 2)每日或每晚运行。确保 cron 作业以具有适当权限的用户身份运行,以停止和启动 Jenkins 服务并读/写 $JENKINS_HOME 目录。
2. 配置即代码 (CasC)
考虑采用 Jenkins 配置即代码 (CasC)。CasC 使用声明性 YAML 文件定义 Jenkins 设置、作业和插件。通过将这些 YAML 文件存储在单独的源代码控制存储库(如 Git)中,您的配置变得可移植和版本化,从而大大简化了核心备份要求。
警告:保护凭据
恢复实例时,请确保
secrets/目录存在且正确。如果 Jenkins 找不到用于加密凭据(如 API 密钥或密码)的密钥,这些凭据将变得无法使用,并且必须手动重新输入。