谈到备份跟恢复那么我们就要先看看jenkins的数据存储结构,了解一下我们需要备份什么?
Jenkins的数据存储结构
进行有效的Jenkins数据备份,首先要理解Jenkins的数据存储结构,然后根据业务场景选择合适的粒度进行备份。
典型的jenkins实例包含以下文件和目录:
*.xml 需要备份 config-history 需要备份 fingerprints 需要备份 global-build-stats 需要备份 *.key* 需要备份 jobs jobs配置需要备份(config.xml, nextBuildNumber), builds目录(build logs等)根据需求而定 logs 插件logs,根据需求而定,可以不备份 monitoring 可以不备份,插件会实时生成监控数据 nodes 需要备份 plugins 需要备份 *.jpi及 *.hpi,可以不备份每个插件子目录,jenkins启动后会更新插件子目录 secrets 需要备份 updates 需要备份 userContent 用户上传内容,可以根据需要备份 users 用户缓存信息,最好备份
目前官方提供了几个插件,可以实现简单的数据备份
下面是地址连接:
https://wiki.jenkins.io/display/JENKINS/Backup+Plugin
https://wiki.jenkins.io/display/JENKINS/PeriodicBackup+Plugin
https://wiki.jenkins.io/display/JENKINS/thinBackup
这些插件的基本原理是备份特定的配置信息,归档存储到master,同时提供restore的功能。
潜在问题: 数据归档在master,单点问题依然存在。如果master宕机了,备份数据无法获得,也就失去了意义了。
使用Rsync异地备份
为了避免master单点故障,可以将数据备份到远程备份机器。可以使用rsync工具同步Jenkins home到远程,可以利用rsync工具的 “--exclude-from=FILE”功能,定制一个exclude文件,过滤掉无需备份的数据。
潜在问题: 这种方法解决了单点备份的问题,但是需要权衡全量备份和增量备份的问题。如果每次同步到远端一个新的目录,每次同步将是一个全量备份,数据同步量大,速度慢;如果每次同步到相同的远端目录,将是增量备份,数据同步量少,速度快。每次全量备份,在牺牲网路带宽和远端存储等资源下,备份会有多个版本;而每次增量备份,远端备份和最新数据同步后,只保留最新版本。
全量还是增量,多版本还是最新版本等,用户需要去权衡。
使用版本控制工具进行备份
如果把Jenkins home看成代码的话,我们可以使用版本控制的方法备份到代码仓库。一般情况下,公司的代码仓库安全性比较高。
这种方法基于版本控制仓库的备份方法,通过版本控制工具将备份服务器需要的配置增量备份到版本仓库中。
把Jenkins配置备份到版本控制仓库,有两大好处:
1. 增量备份,避免了归档备份等冗余备份对CPU,Disk等的浪费
2. 理论上可以恢复到所有历史版本,取决于备份周期
比如使用Gitlab作为备份仓库,基本步骤:
1. 创建gitlab repo用作Jenkins home 备份远程repo
2. 设置gitlab repo权限,确保Jenkins account可以 push code等
3. 将Jenkins home 初始化为本地repo
4. 添加 .gitignore 文件
5. 将Jenkins home 本地仓库内容push到远程repo中,创建master分支
6. 创建Jenkins job或者Crontab 实现定时周期性备份
潜在问题: 不要手动在Jenkins home下使用 类似 git pull 等命令,谨记Jenkins home下数据是第一最新数据,代码仓库只是备份数据。每次备份,代码仓库会生成一个新的commit版本,周期取决于备份job或者cron的设置周期。