如何备份和恢复您的 Jenkins 实例

掌握 Jenkins 备份与恢复技术,保护您的 CI/CD 流水线。本指南提供了一个专家级的、关于最可靠备份策略(即文件系统方法)的分步教程。学习如何识别和归档 `$JENKINS_HOME` 目录中的关键数据,重点关注配置、作业和安全密钥,同时排除大型构建产物。我们还将介绍恢复实例的基本步骤,包括关键的文件权限修复,以确保您的 Jenkins 环境能够快速无缝地进行灾难恢复。

36 浏览量

如何备份和恢复您的 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 密钥或密码)的密钥,这些凭据将变得无法使用,并且必须手动重新输入。