18.9.6 备份恢复与灾难演练要点
围绕 Jenkins 备份恢复与灾难演练,应建立“配置—数据—制品—密钥”全覆盖策略,并用可执行命令固化流程。备份对象最小集:$JENKINS_HOME(jobs、config.xml、credentials.xml、plugins、secrets、users)、构建历史与日志、流水线共享库、插件清单、全局工具配置、节点配置,以及外部依赖(Git/制品库/镜像库/数据库/对象存储)。建议采用 JCasC 与插件清单化,配合镜像或包仓库固定版本,实现可重建。
1) 备份策略与示例(含命令解释)#
目标:每日全量、关键变更即时备份;本地+异地双份;校验可用性。
说明:示例使用 systemd 定时器或 cron,生产建议加密与审计。
# 1) 准备变量
export JENKINS_HOME=/var/lib/jenkins
export BKP_DIR=/data/backup/jenkins/$(date +%F)
export BKP_DST=/data/backup/jenkins/latest
# 2) 创建目录
mkdir -p "$BKP_DIR"
# 3) 只读打包(减少写入中断风险)
tar --exclude='workspace' --exclude='jobs/*/builds/*/archive' \
-czf "$BKP_DIR/jenkins_home.tgz" -C "$JENKINS_HOME" .
# 4) 生成校验和,校验备份完整性
sha256sum "$BKP_DIR/jenkins_home.tgz" > "$BKP_DIR/jenkins_home.tgz.sha256"
# 5) 同步到异地(示例)
rsync -av --delete "$BKP_DIR/" backup@10.0.0.20:/backup/jenkins/$(date +%F)/
# 6) 更新 latest 指向,便于恢复
ln -sfn "$BKP_DIR" "$BKP_DST"
命令要点解释
- --exclude:剔除可再生成的大量文件(workspace、archive)。
- sha256sum:用于恢复前的完整性校验。
- rsync --delete:异地副本保持一致,避免冗余历史污染。
2) 插件与配置即代码(JCasC)示例#
# plugins.txt 生成(在 Jenkins 节点上)
ls -1 $JENKINS_HOME/plugins | sed 's/\.jpi$//g' | sort > /data/backup/jenkins/plugins.txt
# /var/lib/jenkins/jcasc.yaml(示例片段)
jenkins:
systemMessage: "Jenkins from JCasC"
numExecutors: 2
credentials:
system:
domainCredentials:
- credentials:
- usernamePassword:
id: "git-cred"
username: "gituser"
password: "${GIT_PASSWORD}"
3) 恢复流程 SOP(含命令与验证)#
目标:干净环境可重建 + 关键流水线可用。
# 1) 安装指定 Jenkins 版本(示例:Debian/Ubuntu)
apt-get update
apt-get install -y openjdk-17-jre
wget -q -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/" \
> /etc/apt/sources.list.d/jenkins.list
apt-get update && apt-get install -y jenkins=2.401.3
# 2) 停止 Jenkins
systemctl stop jenkins
# 3) 恢复 $JENKINS_HOME
tar -xzf /data/backup/jenkins/latest/jenkins_home.tgz -C /var/lib/jenkins
# 4) 校验完整性
sha256sum -c /data/backup/jenkins/latest/jenkins_home.tgz.sha256
# 5) 启动 Jenkins
systemctl start jenkins
恢复后验证清单(命令化)
# Web 端检查
curl -s -I http://127.0.0.1:8080/login | head -n 1
# 查看插件加载是否异常
grep -i "Plugin" /var/log/jenkins/jenkins.log | tail -n 20
# 验证凭据是否存在(需 Script Console)
# Jenkins > Manage Jenkins > Script Console:
# println(com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
# com.cloudbees.plugins.credentials.Credentials.class, Jenkins.instance, null, null).size())
4) 常见故障排错示例#
场景 A:插件冲突导致启动失败
# 查看错误日志
grep -i "Failed Loading plugin" /var/log/jenkins/jenkins.log | tail -n 5
# 临时禁用插件
mv $JENKINS_HOME/plugins/problem-plugin.jpi \
$JENKINS_HOME/plugins/problem-plugin.jpi.disabled
systemctl restart jenkins
场景 B:凭据解密失败(secrets/缺失)
# 检查 secrets/ 是否完整
ls -l $JENKINS_HOME/secrets/
# 关键文件:master.key、hudson.util.Secret
# 若缺失,需从备份恢复 secrets/ 与 credentials.xml
场景 C:迁移后权限异常
# 修复目录权限
chown -R jenkins:jenkins /var/lib/jenkins
systemctl restart jenkins
5) 灾难演练(演练脚本与RTO/RPO)#
演练目标:验证“可恢复性”而非仅备份存在。
建议演练场景:单机故障、磁盘损坏、误删配置、插件升级失败、凭据丢失。
# 演练脚本(模拟误删 job 配置)
export JENKINS_HOME=/var/lib/jenkins
mv $JENKINS_HOME/jobs/demo-job/config.xml /tmp/config.xml.bak
# 验证 Job 是否异常(UI 访问或日志)
grep -i "demo-job" /var/log/jenkins/jenkins.log | tail -n 5
# 恢复验证
mv /tmp/config.xml.bak $JENKINS_HOME/jobs/demo-job/config.xml
systemctl restart jenkins
RTO/RPO 示例
- RTO(恢复时间):30 分钟内恢复 Jenkins 与关键流水线
- RPO(数据丢失):不超过 24 小时配置变更
6) 最佳实践清单(可执行)#
- 备份与恢复脚本纳入 Git 管理,变更审计。
- Jenkins 镜像或包版本固定,避免“恢复后版本漂移”。
- 生产启用“只读演练”:恢复后先禁用构建或禁用队列。
# 禁用队列,避免误触发
# 在 Script Console 执行:
# Jenkins.instance.setNumExecutors(0)
练习题#
1) 编写每日备份脚本,包含校验、异地同步与日志。
2) 通过 JCasC 重建 Jenkins 基础配置并验证流水线可运行。
3) 模拟插件冲突导致 Jenkins 启动失败并完成恢复。