一、相关概念概述
- 主服务器:当前运行jenkins容器的服务器,需要备份的服务器
- 备份服务器:接收备份压缩文件的服务器
- boring_hertz:容器名称
- boring_hertz-backup:镜像名称
- 本文中的jenkins备份分为三大模块:jenkins容器备份、jenkins数据备份、备份文件异地存储
- jenkins数据备份:是对jenkins容器外部挂载目录的备份,包含jenkins配置文件、jenkins插件、jenkins jobs等数据。
- jenkins容器备份:是对正在运行的jenkins容器进行备份,先将容器快照成镜像,再保存快照出来的镜像。主要是备份jenkins系统(系统版本)。
- 备份文件异地存储:是将jenkins数据备份和jenkins容器备份输出的压缩文件,传输到备份服务器,进行异地备份。

二、备份原则
- jenkins容器备份,每次对jenkins系统版本升级后备份一次,保留3次的备份文件。
- jenkins数据备份,每天23点备份一次,保留7天的备份文件。
- 备份文件异地存储,在每次jenkins容器备份或jenkins数据备份后执行一次。
三、备份脚本执行
1、脚本使用说明
此处提供jenkins_backup_all.sh脚本
#!/bin/bash
######args######
dataPath="/home/jenkins/data/jenkins_home"
bakPath="/home/jenkins/data/jenkins_bak"
bakName=`date "+jenkins-bak-%Y%m%d-%H-%M"`
tmpPath=$bakPath/$bakName
containerName="boring_hertz"
backupServerP="mhg"
backupServerU="mhg"
backupServerI="10.100.102.136"
get_args_num=$#
##########Jenkins backup#############################
print_time_stamp(){
time_stamp=`sudo date +%Y-%m-%d" "%H:%M:%S`
echo "=======================Now time is:$time_stamp======================="
}
jenkins_data_fun(){
echo "*********Jenkins data backup started******************************"
print_time_stamp
rsync --delete -azp --exclude=builds --exclude=nextBuildNumber $dataPath $tmpPath
cd $tmpPath
tar zcPf $tmpPath".tar.gz" .
echo `date "+%Y%m%d-%H:%M:%S"`'save file :'$tmpPath'.tar.gz'
rm -rf $tmpPath
num=`ls $bakPath |grep jenkins|wc -l`
oldFile=`ls $bakPath|grep jenkins|sort|head -1`
[ $num -gt 7 ] && rm -f $bakPath/$oldFile && echo `date "+%Y%m%d-%H:%M:%S"`'too many files, rm file: '$oldFile
echo "*********Jenkins data backup completed******************************"
}
jenkins_container_fun(){
echo "*********Jenkins container backup started******************************"
print_time_stamp
backupFileName="$containerName-$(date +%Y%m%d%H%M%S).tar"
docker commit $containerName $containerName-backup
docker save $containerName-backup -o $bakPath/$backupFileName
docker rmi $containerName-backup
num=`ls $bakPath |grep $containerName|wc -l`
oldFile=`ls $bakPath |grep $containerName|sort|head -1`
[ $num -gt 3 ] && rm -f $bakPath/$oldFile && echo `date "+%Y%m%d-%H:%M:%S"`'too many files, rm file: '$oldFile
echo "*********Jenkins container backup completed******************************"
}
file_remote_fun(){
echo "*********File remote backup started******************************"
print_time_stamp
cd ~
rsync -avzPt --delete $bakPath -e 'sshpass -p mhg ssh -o StrictHostKeyChecking=no' $backupServerU@$backupServerI:/home/$backupServerU
echo "*********File remote backup completed******************************"
}
##################################################################################
if [ $get_args_num = 1 ];then
backup_type=$1
if [ "$1" = "-h" -o "$1" = "-help" ];then
echo "================================================================================="
echo "Parameter 1 : backup_type , the enumeration values are as follows: "
echo " 0 : Execute All"
echo " 1 : Jenkins data backup"
echo " 2 : Jenkins container backup"
echo " 3 : File remote backup"
echo " 4 : Jenkins data backup & File remote backup"
echo " 5 : Jenkins container backup & File remote backup"
echo "================================================================================="
exit 1
elif [ "$1" = "0" ];then
jenkins_data_fun
jenkins_container_fun
file_remote_fun
elif [ "$1" = "1" ];then
jenkins_data_fun
elif [ "$1" = "2" ];then
jenkins_container_fun
elif [ "$1" = "3" ];then
file_remote_fun
elif [ "$1" = "4" ];then
jenkins_data_fun
file_remote_fun
elif [ "$1" = "5" ];then
jenkins_container_fun
file_remote_fun
else
echo "The parameter you entered is not correct, you can type \"-h\" or \"-help\" to view."
exit 1
fi
else
echo "The parameter you entered is not correct, you can type \"-h\" or \"-help\" to view."
exit 1
fi
参数 | 功能 | 执行命令 |
---|---|---|
-h | 查看备注 | bash jenkins_backup_all.sh -h |
-help | bash jenkins_backup_all.sh -help | |
0 | 执行:jenkins容器备份、jenkins数据备份、备份文件异地存储 | bash jenkins_backup_all.sh 0 |
1 | 执行:jenkins数据备份 | bash jenkins_backup_all.sh 1 |
2 | 执行:jenkins容器备份 | bash jenkins_backup_all.sh 2 |
3 | 执行:备份文件异地存储 | bash jenkins_backup_all.sh 3 |
4 | 执行:jenkins数据备份、备份文件异地存储 | bash jenkins_backup_all.sh 4 |
5 | 执行:jenkins容器备份、备份文件异地存储 | bash jenkins_backup_all.sh 5 |
2、脚本使用步骤
2.1、上传jenkins_backup_all.sh脚本到主服务器。
2.2、新建目录/home/jenkins/data/jenkins_bak。
mkdir /home/jenkins/data/jenkins_bak
2.3、根据实际情况修改shell脚本中的变量,例如:备份服务器的IP、用户名、密码等。
ps:shell脚本第63行sshpass -p mhg ssh -o StrictHostKeyChecking=no
中的mhg是备份服务器的密码,根据情况自行修改。
vim jenkins_backup_all.sh
chmod +x jenkins_backup_all.sh
2.4、下载sshpass
apt install sshpass
2.5、执行jenkins_backup_all.sh
bash jenkins_backup_all.sh 0
2.6、设置定时任务,每天23点备份一次,执行jenkins数据备份和备份文件异地存储。
crontab -e
添加的内容(每天23点执行)
# 添加的内容,每天23点执行
0 23 * * * sh /home/jenkins/data/jenkins_backup_all.sh 0 >> /home/jenkins/data/jenkins_backup_all.log
重启cron
service cron restart
四、恢复步骤:
主服务器上恢复:
-
停止正在运行的jenkins容器boring_hertz(容器名称),删除容器boring_hertz。
docker stop boring_hertz docker rm boring_hertz
-
导入jenkins容器备份的压缩文件,生成新的镜像boring_hertz-backup(镜像名称)。
docker load -i boring_hertz-20230506094927.tar
-
解压jenkins数据备份的压缩文件,覆盖原有目录/home/jenkins/data/jenkins_home。
-
启动新的jenkins容器,挂载目录/home/jenkins/data/jenkins_home,容器名boring_hertz,使用镜像boring_hertz-backup。
docker run -d -v /home/jenkins/data/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure -u 0 --name boring_hertz boring_hertz-backup
异地恢复:
-
安装docker。
sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io sudo systemctl status docker
-
导入jenkins容器备份的压缩文件,生成新的镜像boring_hertz-backup。
-
解压jenkins数据备份的压缩文件,目录/home/jenkins/data/jenkins_home。
-
启动新的jenkins容器,挂载目录/home/jenkins/data/jenkins_home,容器名boring_hertz,使用镜像boring_hertz-backup。
-
重新配置gerrit的秘钥。
-
登录jenkins系统,在系统管理 ==》 系统信息 ==》Jenkins Location ==》Jenkins URL 修改成备份服务器访问地址。
-
登录jenkins系统,在系统管理 ==》 工具和动作 ==》读取设置。
网友评论