温馨提示×

如何在CentOS上备份和恢复Jenkins配置

小樊
33
2025-12-07 20:32:28
栏目: 智能运维

在 CentOS 上备份与恢复 Jenkins 配置

一 核心要点与准备

  • 确认 JENKINS_HOME(默认通常为 /var/lib/jenkins),备份与恢复均围绕该目录进行。
  • 关键安全文件:
    • $JENKINS_HOME/secrets/hudson.util.Secret(控制器密钥,用于加密凭据,切勿包含在常规备份中)。
    • $JENKINS_HOME/master.key(控制器主密钥,需单独、离线、严格保护;完整恢复时再放回)。
  • 建议始终备份:config.xml、jobs、users、plugins、secrets(不含 master.key)。
  • 可安全排除:workspace、builds/*/artifacts、cache、tools、logs(除非用于审计)。
  • 操作前建议先停服以保证一致性(见下文脚本)。

二 方法一 手动脚本备份与恢复(推荐)

  • 备份脚本示例(全量与增量二选一)
#!/usr/bin/env bash
# jenkins_backup.sh
set -e

JENKINS_HOME="${JENKINS_HOME:-/var/lib/jenkins}"
BACKUP_ROOT="${BACKUP_ROOT:-/mnt/backups/jenkins}"
DATE=$(date +%Y%m%d_%H%M%S)
TMP_DIR="$BACKUP_ROOT/tmp_$DATE"
ARCHIVE="$BACKUP_ROOT/jenkins_backup_$DATE.tar.gz"

# 0) 创建目录
mkdir -p "$BACKUP_ROOT" "$TMP_DIR"

# 1) 可选:停服保证一致性(小型实例建议停服;大型实例可用 rsync 无锁增量)
sudo systemctl stop jenkins || true

# 2) 备份核心子目录(排除大体积与可重建数据)
rsync -a --delete \
  --exclude='workspace/' \
  --exclude='builds/*/artifacts/' \
  --exclude='cache/' \
  --exclude='tools/' \
  --exclude='logs/' \
  "$JENKINS_HOME/" "$TMP_DIR/"

# 3) 单独导出插件清单(便于恢复后核对/批量安装)
find "$TMP_DIR/plugins" -maxdepth 1 -name '*.jpi' -printf '%f\n' | sed 's/\.jpi$//' \
  > "$BACKUP_ROOT/plugins_list_$DATE.txt"

# 4) 打包
tar -czf "$ARCHIVE" -C "$BACKUP_ROOT" "tmp_$DATE"
rm -rf "$TMP_DIR"

# 5) 权限与保留策略(示例:保留最近 30 天)
chmod 600 "$ARCHIVE"
find "$BACKUP_ROOT" -name 'jenkins_backup_*.tar.gz' -mtime +30 -delete

echo "Backup complete: $ARCHIVE"
  • 定时任务(每天 02:00 执行)
sudo crontab -e
# 0 2 * * * /opt/scripts/jenkins_backup.sh >> /var/log/jenkins_backup.log 2>&1
  • 恢复步骤
#!/usr/bin/env bash
# jenkins_restore.sh
set -e

ARCHIVE="/mnt/backups/jenkins/jenkins_backup_YYYYMMDD_HHMMSS.tar.gz"
JENKINS_HOME="${JENKINS_HOME:-/var/lib/jenkins}"
TMP_DIR=$(mktemp -d)

# 0) 校验
[ -f "$ARCHIVE" ] || { echo "Archive not found: $ARCHIVE"; exit 1; }

# 1) 停服
sudo systemctl stop jenkins

# 2) 备份当前目录(可回滚)
sudo tar -czf "$JENKINS_HOME-backup-$(date +%s).tar.gz" -C "$JENKINS_HOME" .

# 3) 清空并解压
sudo find "$JENKINS_HOME" -mindepth 1 -delete
sudo tar -xzf "$ARCHIVE" -C "$JENKINS_HOME"

# 4) 权限
sudo chown -R jenkins:jenkins "$JENKINS_HOME"
sudo find "$JENKINS_HOME/secrets" -type f -exec chmod 600 {} \;
sudo chmod 644 "$JENKINS_HOME/config.xml"

# 5) 启动并验证
sudo systemctl start jenkins
echo "Restore complete. Check service and UI."
  • 安全提示:上述流程未备份 master.key。如做“完整灾难恢复”,请将 master.key 单独离线保管,并在恢复完成后放回 $JENKINS_HOME/ 再启动服务。

三 方法二 使用插件进行备份与恢复

  • 安装 ThinBackup 插件(Jenkins 管理 → 插件管理 → 搜索并安装)。
  • 配置备份目录与计划(如每日/每周),可一键备份与按时间点恢复。
  • 适合希望图形化操作、快速恢复的场景;大规模或跨机房备份仍建议配合脚本/远程存储使用。

四 远程与离线存储方案

  • rsync 增量 + 硬链(节省空间与传输)
# 每日增量(--link-dest 指向上一版“latest”)
rsync -av --delete \
  --exclude='workspace/' \
  --exclude='builds/*/artifacts/' \
  --exclude='cache/' \
  --exclude='tools/' \
  --exclude='logs/' \
  "$JENKINS_HOME/" "/mnt/backups/jenkins/incremental/backup_$(date +%Y%m%d_%H%M%S)"
ln -sfn "backup_$(date +%Y%m%d_%H%M%S)" /mnt/backups/jenkins/incremental/latest
  • GPG 加密归档(传输/存放更安全)
gpg --encrypt --recipient "backup-admin@company.com" \
  --output "$ARCHIVE.gpg" "$ARCHIVE" && rm -f "$ARCHIVE"
  • 远程传输示例(FTP,使用 lftp)
lftp -u "$FTP_USER,$FTP_PASS" "$FTP_HOST" <<EOF
set ftp:ssl-allow no
mirror -R "$BACKUP_ROOT" jenkins_home
quit
EOF
  • 保留策略示例(清理 30 天前归档)
find "$BACKUP_ROOT" -name 'jenkins_backup_*.tar.gz' -mtime +30 -delete
  • 以上方案可与定时任务结合,实现无人值守的远程/加密备份。

五 恢复验证与常见问题

  • 验证清单
    • 服务状态:systemctl status jenkins
    • 启动日志:tail -f /var/log/jenkins/jenkins.log
    • Web 界面:登录检查任务、用户、权限、插件是否正常
    • 测试构建:选一个简单任务执行,确认日志与产出
  • 常见问题与处理
    • 权限错误:恢复后执行 chown -R jenkins:jenkins $JENKINS_HOME
    • 版本不兼容:尽量在相近版本间恢复,先小范围演练
    • 插件缺失:用备份的 plugins_list_*.txt 批量安装或对比安装
    • 构建产物缺失:workspace 与 artifacts 默认不备份,需从 SCM 重新拉取或从制品库恢复。

0