18.8.7 灾备演练与恢复流程标准化

本节围绕Jenkins灾备演练与恢复流程标准化,目标是形成可执行、可审计、可复现的演练方案,覆盖RTO/RPO设定、资产清单、恢复顺序、验证标准与持续改进,并配套可运行的脚本、命令与练习。

原理与流程草图(控制面+数据面+外部依赖):

文章图片

核心目标与指标(示例):
- RTO=30分钟,RPO=15分钟
- 验收标准:控制台可访问、核心插件加载完成、关键流水线可执行、制品可追溯、审计记录可用
- 关键作业优先级:发布主干 > 关键测试 > 非关键任务

灾备资产与依赖清单(示例结构):

JENKINS_HOME/
├── config.xml
├── jobs/
├── plugins/
├── credentials.xml
├── secrets/
├── users/
├── nodes/
├── fingerprints/
└── updates/
外部依赖: Git仓库, 制品库(Nexus/Artifactory), Docker仓库, K8s集群, DNS/证书

备份与恢复基线(示例脚本):
1) 全量+增量策略(全量周备、增量日备)
2) 备份命名含时间戳与校验和
3) 备份完成后做可恢复性测试

# 1. 全量备份(建议离线低峰)
export JENKINS_HOME=/var/lib/jenkins
export BACKUP_DIR=/data/backup/jenkins
TS=$(date +%F_%H%M)
mkdir -p "$BACKUP_DIR"

tar --exclude='workspace' --exclude='caches' \
    -czf "$BACKUP_DIR/jenkins_full_${TS}.tar.gz" \
    -C "$JENKINS_HOME" .

# 2. 生成校验和
sha256sum "$BACKUP_DIR/jenkins_full_${TS}.tar.gz" \
  > "$BACKUP_DIR/jenkins_full_${TS}.sha256"

# 3. 预期效果:备份与校验文件存在
ls -lh "$BACKUP_DIR/jenkins_full_${TS}.*"

恢复标准流程(演练步骤+命令示例):

1) 启动事件与通知
- 演练工单、窗口确认、通知群组

echo "DR Drill Start: $(date)" >> /var/log/jenkins_drill.log

2) 环境准备与依赖校验(DNS/证书/存储)

# DNS解析
dig +short jenkins.example.com

# 证书有效期
openssl x509 -in /etc/ssl/certs/jenkins.crt -noout -dates

# 存储可写
df -h /var/lib/jenkins

3) 恢复JENKINS_HOME

systemctl stop jenkins

# 清空旧目录(谨慎)
rm -rf /var/lib/jenkins.bak
mv /var/lib/jenkins /var/lib/jenkins.bak

mkdir -p /var/lib/jenkins
tar -xzf /data/backup/jenkins/jenkins_full_2024-01-01_0100.tar.gz \
    -C /var/lib/jenkins

chown -R jenkins:jenkins /var/lib/jenkins

4) 插件与版本一致性
- 版本锁定:使用离线插件目录或插件清单

# plugins.txt用于离线安装
cat > /var/lib/jenkins/plugins.txt <<'EOF'
git:4.12.1
workflow-aggregator:2.7
credentials:1254.vb_96f366e7b_a_d
EOF

# 使用Jenkins插件CLI离线安装(需jenkins-cli.jar)
java -jar /opt/jenkins-cli.jar -s http://localhost:8080 \
  -auth admin:password install-plugin \
  -deploy -restart @/var/lib/jenkins/plugins.txt

5) 凭据与密钥恢复
- 确保 secrets 与 master.key 完整

ls -l /var/lib/jenkins/secrets/
test -f /var/lib/jenkins/secrets/master.key && echo "master.key OK"

6) 外部依赖连通性

# Git 仓库连通
git ls-remote https://git.example.com/ops/jenkins-pipeline.git

# 制品库连通
curl -I https://nexus.example.com

# Docker仓库鉴权
docker login registry.example.com

7) 代理节点恢复

# 以systemd方式重启代理
systemctl restart jenkins-agent
systemctl status jenkins-agent

# 预期:Jenkins控制台看到节点在线

8) 核心流水线验证(代表性任务)
- 在Jenkins中新建“DR-Verify”流水线

pipeline {
  agent any
  stages {
    stage('Checkout') {
      steps { git 'https://git.example.com/ops/jenkins-pipeline.git' }
    }
    stage('Build') {
      steps { sh 'echo build ok' }
    }
    stage('Publish') {
      steps { sh 'echo publish ok' }
    }
  }
}

9) 数据一致性校验

# 作业数量统计
find /var/lib/jenkins/jobs -maxdepth 2 -name config.xml | wc -l

# 构建历史文件存在性
find /var/lib/jenkins/jobs -path '*builds*' | head

10) 恢复完成与业务确认
- 产出演练报告:耗时、失败点、修复策略

常见问题与排错(示例):
- Jenkins启动失败(插件冲突)

# 查看启动日志
journalctl -u jenkins -n 200 --no-pager

# 临时禁用插件(重命名.hpi)
mv /var/lib/jenkins/plugins/problematic.hpi \
   /var/lib/jenkins/plugins/problematic.hpi.disabled
systemctl restart jenkins
  • 凭据无法解密(master.key缺失)
# 确认secrets目录完整
ls -l /var/lib/jenkins/secrets/
# 修复:从同版本备份恢复secrets目录
  • 外部依赖不可达(DNS/网络)
# 路由与防火墙
ip route
ss -tulpen | grep 8080

演练练习(建议执行):
1) 备份并在隔离环境恢复,记录RTO/RPO
2) 人为删除一个插件并验证恢复流程
3) 模拟Git不可达,观察失败点并记录改进

交付物清单(模板建议):
- 灾备演练SOP(角色分工、操作步骤、回滚策略)
- 资产与依赖清单
- 备份策略与恢复脚本
- 演练记录与复盘报告
- RTO/RPO达标证明与持续改进计划