为 Jenkins 控制器保留可靠的备份至关重要。备份可以用于灾难恢复,恢复旧的配置,以及找回损坏或意外删除的文件。配置被意外修改后,可能经过一段时间才会被发现。
本页介绍如何创建备份、应该备份哪些文件,以及如何验证备份确实可用。
创建备份
创建备份有多种方式:文件系统快照、备份插件,或者编写用于备份 Jenkins 控制器的 Shell 脚本。
文件系统快照
文件系统快照能为备份提供最高程度的一致性。它通常也比在线逐文件备份更快,能降低把不同时间点的数据混合复制的可能性。以下技术支持快照:
- Linux 逻辑卷管理器(LVM)
- Linux btrfs
- Solaris ZFS,也支持增量备份
- FreeBSD ZFS
- Linux 上的 OpenZFS
- 部分其他文件系统架构
- 许多云服务商
一些独立存储设备也允许在存储层创建快照。
备份插件
有多种备份插件可用。从主菜单选择 Manage Jenkins,然后进入 Plugins → Available,搜索 backup。原文指出,开源备份插件中目前只有 thinBackup 仍在维护。其他插件也可以尝试,但可能遇到问题。
编写备份 Shell 脚本
可以自行编写脚本,将适当的文件和目录复制到备份位置,再用 cron 安排执行时间。
脚本应创建用于存放备份的目录,例如 /mnt/backup,并确保具有该目录的写权限。可以考虑让它成为具有独立挂载点的单独文件系统。另一种做法是在 /var 下建立子目录;采用这种方式时,恢复操作可能需要用 sudo 执行。不建议把备份放在 /tmp 中,因为它可能在重启时被清空。
为每次备份创建唯一标识,例如时间戳,防止今天的备份覆盖昨天的备份。写入本地文件系统通常最快;备份完成后,可以将其复制到远程备份服务器或设备长期保存。
单独备份控制器密钥
控制器密钥用于加密 secrets 目录中保护凭据的数据。它存放在 $JENKINS_HOME/secrets/hudson.util.Secret 中,并由 master.key 加密。恢复系统时需要这些信息;如果其他人同时取得备份与解密所需密钥,就能完整访问其中的信息。
应像保护 SSH 私钥一样保护控制器密钥,不要把用于解锁它的 master.key 放进常规备份。应单独备份 master.key,将其放在远离其他备份的安全位置。该文件很小,且很少变化。执行完整系统恢复时,先恢复其余系统内容,再单独恢复 master.key。
哪些文件应该备份?
备份文件的数量会影响备份耗时、备份大小,以及恢复系统的复杂程度。本节说明各种文件为何需要备份,以及哪些文件可以从至少部分备份中排除。
$JENKINS_HOME
备份整个 $JENKINS_HOME 目录,可以保存整个 Jenkins 控制器。恢复时,只需把完整备份复制到新系统。注意仍应遵循前面的主密钥分离要求。
不过,JENKINS_HOME 包含不少并非必须备份的文件。选择特定文件和目录能缩小备份,但恢复时可能需要更多工作。也可以为不同目录安排不同的备份周期。
配置文件
配置文件直接保存在 $JENKINS_HOME 中。./config.xml 是 Jenkins 主配置文件,其他配置文件也使用 .xml 后缀。用 $JENKINS_HOME/*.xml 可指定所有配置文件。
也可以把配置文件保存在源码管理(SCM)仓库中,从而保留每个文件的历史版本,并使用标准 SCM 功能取回它们。
./jobs 子目录
$JENKINS_HOME/jobs 保存 Jenkins 中创建的所有作业相关信息。原文列出的相关目录与文件包括:
./builds:构建记录。./builds/archive:归档产物。需要长期保留产物时应备份;产物可能很大,显著增加备份体积。./workspace:从 SCM 检出的文件。通常无需备份;恢复后可执行一次干净检出。./plugins/*.hpi:系统所用特定版本的插件包。./plugins/*.jpi:系统所用特定版本的插件包。
哪些内容可能不必每次备份
以下文件和目录通常不必包含在每次常规备份中,因为恢复时可以下载最新版本。不过,一些灾难恢复专家建议恢复期间不要升级,以免兼容性问题导致延误。如果灾难恢复计划要求恢复到原有软件版本,可以较低频率备份系统及全部已下载工具,并以此恢复:
./war:展开后的 WAR 文件。恢复时可以下载最新 WAR 文件。./cache:已下载的工具。恢复时可以重新下载当前版本。./tools:已解压的工具。恢复时重新解压。./plugins/xxx:已安装插件的子目录。下次重启时会自动重新生成。
验证备份
备份策略应包含每次备份的验证。不要等到真正需要恢复时,才发现备份不可用。
验证完整备份的一种简单方法,是将其恢复到临时位置。先创建测试目录,例如 /mnt/backup-test,再将备份恢复到该目录。
把 $JENKINS_HOME 指向此目录,并指定一个不同的 HTTP 端口,避免与真实 Jenkins 控制器冲突:
export JENKINS_HOME=/mnt/backup-test然后启动恢复出来的 Jenkins 控制器:
java -jar jenkins.war --httpPort=9999
总结
备份是 Jenkins 最佳实践,也是灾难恢复的关键。始终制定备份策略,明确控制器的哪些配置与记录需要保存、备份频率,以及备份存储位置。
验证备份。应定期检查备份是否完整,能否满足恢复目标。
进一步阅读
原文推荐以下资料:











暂无评论内容