美文网首页
Jenkins备份和恢复的实施方案

Jenkins备份和恢复的实施方案

作者: 羋学僧 | 来源:发表于2023-05-05 17:53 被阅读0次

一、相关概念概述

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

二、备份原则

  1. jenkins容器备份,每次对jenkins系统版本升级后备份一次,保留3次的备份文件。
  2. jenkins数据备份,每天23点备份一次,保留7天的备份文件。
  3. 备份文件异地存储,在每次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

四、恢复步骤:

主服务器上恢复:

  1. 停止正在运行的jenkins容器boring_hertz(容器名称),删除容器boring_hertz。

    docker stop boring_hertz
    docker rm boring_hertz
    
  2. 导入jenkins容器备份的压缩文件,生成新的镜像boring_hertz-backup(镜像名称)。

    docker load -i boring_hertz-20230506094927.tar
    
  3. 解压jenkins数据备份的压缩文件,覆盖原有目录/home/jenkins/data/jenkins_home。

  4. 启动新的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
    

异地恢复:

  1. 安装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
    
  2. 导入jenkins容器备份的压缩文件,生成新的镜像boring_hertz-backup。

  3. 解压jenkins数据备份的压缩文件,目录/home/jenkins/data/jenkins_home。

  4. 启动新的jenkins容器,挂载目录/home/jenkins/data/jenkins_home,容器名boring_hertz,使用镜像boring_hertz-backup。

  5. 重新配置gerrit的秘钥。

  6. 登录jenkins系统,在系统管理 ==》 系统信息 ==》Jenkins Location ==》Jenkins URL 修改成备份服务器访问地址。

  7. 登录jenkins系统,在系统管理 ==》 工具和动作 ==》读取设置。

相关文章

网友评论

      本文标题:Jenkins备份和恢复的实施方案

      本文链接:https://www.haomeiwen.com/subject/vaxqsdtx.html