在 CentOS 上备份与恢复 Jenkins 配置
一 核心要点与准备
二 方法一 手动脚本备份与恢复(推荐)
#!/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"
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."
三 方法二 使用插件进行备份与恢复
四 远程与离线存储方案
# 每日增量(--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 --encrypt --recipient "backup-admin@company.com" \
--output "$ARCHIVE.gpg" "$ARCHIVE" && rm -f "$ARCHIVE"
lftp -u "$FTP_USER,$FTP_PASS" "$FTP_HOST" <<EOF
set ftp:ssl-allow no
mirror -R "$BACKUP_ROOT" jenkins_home
quit
EOF
find "$BACKUP_ROOT" -name 'jenkins_backup_*.tar.gz' -mtime +30 -delete
五 恢复验证与常见问题
systemctl status jenkinstail -f /var/log/jenkins/jenkins.logchown -R jenkins:jenkins $JENKINS_HOME