【Jenkins】备份恢复方案实践

Jenkins备份恢复实施方案

通过Jenkins第三方插件ThinBackup进行,在原有的Jenkins上通过该插件来定时备份数据和插件,再到备份主机上开启定时任务执行脚本去拉取备份数据,利用插件来选择备份数据来进行恢复,重启系统后方可正常使用。

Jenkins备份

Jenkins 有一个备份插件,它可以用来与Jenkins备份重要的配置设置。按照下面给出有一个适当的备份所需的步骤。

1、 管理员登陆172.20.15.36:8080,点击“系统管理”,然后选择“插件管理”选项

 【Jenkins】备份恢复方案实践

2、在可用Available选项卡上,搜索并勾选“ThinBackup”。点击“Install without Restart”。完成后,重新启动Jenkins实例

 【Jenkins】备份恢复方案实践

【Jenkins】备份恢复方案实践

3、进入系统管理->ThinBackup→Settings下进行相关参数配置,配置说明如下:

【Jenkins】备份恢复方案实践

 【Jenkins】备份恢复方案实践

备份目录

指定备份目录。Jenkins进程需要对此目录的写访问权。您可以使用$ {JENKINS_WORKSPACE}等环境变量来指定路径。

完整备份的备份计划

指定触发完整备份的计划。使用Cron表示法。即使没有更改,完整备份也会备份所有文件。

差异备份的备份计划

指定触发差异备份的计划。使用Cron表示法。差异备份仅存储自上次完全备份以来修改的数据。如果未检测到任何更改,则不会创建差异备份。

注意:如果只需要完整备份,则无需指定差异备份计划。由于差异备份依赖于完整备份,因此如果指定差异备份计划,则必须提供完整备份计划。

等到Jenkins / Hudson闲置以执行备份

建议启用此选项(默认)。然而,许多用户报告说安静模式阻止了长时间运行的作业的执行。如果禁用此选项,则无需等待实例的安全状态即可进行备份。换句话说,备份将立即完成,这可能导致损坏的备份。

在指定的分钟后强制Jenkins进入完全模式

在指定的时间(分钟)后强制安静模式,以强制安全的备份环境。零表示在调度程序触发备份时直接强制执行完全模式。阅读下面有关备份过程的更多信息。

最大备份集数

要节省磁盘空间,可以指定存储的最大备份集数。备份集定义为完整备份及其引用差异备份。在下一次完整备份操作后,将删除较旧的备份集。这也适用于压缩备份集。

备份中排除的文件

如果您有特定文件而不想备份,则在此处输入标识这些文件的正则表达式将阻止它们被备份。名称与此正则表达式匹配的所有文件都不会被备份。如果不需要,请留空。如果表达式无效,则将忽略该表达式。

备份构建结果

如果启用此选项,则还将备份构建结果。这可能是很多数据,所以要仔细考虑它。一旦您决定备份构建结果,您还可以选择备份构建存档。再次注意这个选项,因为它可能非常耗时并且可能需要大量的磁盘空间!

备份‘userContents‘

Jenkins提供了一个URL,您可以在其中放置常用数据(例如静态HTML,工具......)。如果选中此选项,则可以备份所有这些数据。

备份仅构建标记为保留

如果启用此选项,则仅备份标记为“永久保留此构建”的构建的结果/工件。

清理差异备份

如果启用此选项,则只要完成新的完整备份,就会删除所有差异备份。

将旧备份移动到ZIP文件

如果选中此选项,则每当执行新的完整备份时,所有旧备份集都将移动到ZIP文件。每个ZIP文件将包含一个备份集,即一个完整备份和引用它的任何差异备份。文件名将标识包含备份的时间范围(即完整备份的时间戳和最新差异备份的时间戳)。

注意: “ 最大备份集数”设置也适用于由thinBackup创建的备份ZIP文件。

注意:如果选中“ 清理差异备份 ”,则在完成压缩之前将执行diff清理,因此ZIP文件中不会进行差异备份。

以上配置表示每天凌晨12点自动完整备份到设置的目录/Trendy/jenkins_backup下
备份内容包括:Backup next build number file、Backup ‘userContent’folder、
Backup plugins archives、 Clean up differential backups;

此外可以手工执行备份

点击“Backup Now”,此时页面等待备份响应,实际上jenkins在后台运行备份程序,可以通过备份目录中查看,已经生成备份目录类似“FULL-2018-12-25_00_00”

通过备份进行恢复Jenkins

一、Jenkins恢复环境部署

假设现有的Jenkins已经损坏不能正常使用;需要通过最近的完整备份恢复Jenkins服务;

1、首先在备份主机上部署与原主机上相同版本的Jenkins(按照原主机方式安装)

2、备份主机开启定时任务去执行脚本从原主机上拉取完整备份

3、在备份主机Jenkins上利用ThinBackup插件选择最近的备份数据进行恢复

4、重启备份主机上Jenkins服务,正常使用系统

二、备份主机配置(拉取原主机备份文件)

1、拉取备份代码脚本

172.50.10.16主机/home/jenkins/jenkins_backup.sh(root用户权限赋予777权限)

#!/bin/bash

backup_path=/home/jenkins/master_backup/

backup_file_filter=*"`date +%Y-%m-%d`"*

jenkins_home_directory=/Trendy/jenkins_backup/

jenkins_server_ipaddress=172.20.15.36

jenkins_server_ssh_username=root

# which files and directory backup

for i in `ssh $ssh_host find /Trendy/jenkins_backup/ -name ${backup_file_filter}`

do

    backup_files[j]=$i

    j=`expr $j + 1`

done

echo ${backup_files[0]}

echo ${backup_file_filter}

backup_files_num=${#backup_files[@]}

# do backup files copy

for (( i = 0; i < $backup_files_num; i++ )); do

   scp -r $jenkins_server_ipaddress:${backup_files[i]}  $backup_path

done

2、SSH免密登陆配置

脚本中需要172.50.10.16远程登陆172.20.15.36,实际连接的时候会让你输入密码,但执行脚本的时候无法干预,就需要设置SSH免密登陆。

  • 172.50.10.16机器执行ssh-keygen -t rsa一路回车后生成公钥id_rsa.pub
    【Jenkins】备份恢复方案实践
  • 172.20.15.36上将16主机的公钥添加到/root/.ssh/authorized_keys

         【Jenkins】备份恢复方案实践

3、172.50.10.16上开启定时任务去执行脚本拉取备份文件

crontab -e添加00 01 * * * /home/jenkins/jenkins_backup.sh(表示1点自动执行脚本)

三、配置ThinBackup并恢复

1、登陆172.50.10.16:8080备份主机,进入系统管理->ThinBackup页面,进行thinnBackup Configuration配置,配置Backup directory为主机获取存放备份文件路径

 【Jenkins】备份恢复方案实践

2、返回ThinBackup, 点击Restore,如图钩选上
Restore next build number file(build文件)
Restore plugins(还原插件)
点击Restore 同样需要等待一段时间;可以查看/var/lib/jenkins目录的变化;

3、重启备份主机Jenkins服务,查看系统恢复数据,项目、用户、插件等信息都恢复存在

【Jenkins】备份恢复方案实践

测试Jenkins使用

选择某个工程进行build,会需要重新配置凭证,修改脚本中鉴权ID等(遇到问题按照主机上操作修改相关配置,基本都是环境更改后鉴权和工具安装问题)

优化自动删除15天前的备份文件

在原主机和备份主机上每天都会保存配置文件和备份文件,长时间运行会导致空间占用过大,所以添加在两台主机上分别添加脚本AutoClean_backup.sh去删除15天之前的备份文件,该脚本每个月15号通过定时任务执行去清理

 
#!/bin/sh
BAK_HOME="/Trendy/jenkins_backup"

keepNum=13
fileNum=$(find ${BAK_HOME} -mtime +1 -name "FULL*" | wc -l)

echo "${fileNum}"

for file in $(find ${BAK_HOME} -mtime +1 -name "FULL*"); do
if test $[fileNum] -gt $[keepNum];then
rm -rf ${file}
fileNum=${fileNum}-1
echo "delete backup file"
else
echo "do no thing"
fi
done