专栏首页donghui的博客每日备份JENKINS_HOME至SVN 顶

每日备份JENKINS_HOME至SVN 顶

##每日备份JENKINS_HOME至版本控制系统SVN

Jenkins是一个可扩展的开源的持续集成工具,也是当下最流行的持续集成工具。

###Jenkins主要功能###

  • 易于安装(Easy installation)
  • 易于配置(Easy configuration)
  • 变更集支持(Change set support)
  • 永久链接(Permanent links)
  • RSS/Email/IM集成(RSS/E-mail/IM Integration)
  • 事后标签(After-the-fact tagging)
  • JUnit/TestNG测试报告(JUnit/TestNG test reporting)
  • 分布式构建(Distributed builds)
  • 文件指纹打印(File fingerprinting)
  • 插件支持(Plugin Support)

其中插件支持使得Jenkins可定制、可扩展。

###JENKINS_HOME目录结构### Jenkins的相关文件都存放在文件系统中,而JENKINS_HOME主要用来存放这些文件的,如系统配置文件、插件、每个job的配置文件等。

JENKINS_HOME目录结构如下:

<pre> +- config.xml (jenkins root configuration) +- *.xml (other site-wide configuration files) +- userContent (files in this directory will be served under your http://server/userContent/) +- fingerprints (stores fingerprint records) +- plugins (stores plugins) +- jobs +- [JOBNAME] (sub directory for each job) +- config.xml (job configuration file) +- latest (symbolic link to the last successful build) +- builds +- [BUILD_ID] (for each build) +- build.xml (build result summary) +- log (log file) +- changelog.xml (change log) +- workspace (working directory for the version control system) </pre>

无论是Jenkins的升级、迁移还是备份、恢复都需要对JENKINS_HOME的操作,而备份Jenkins只需备份JENKINS_HOME即可。

在JENKINS_HOME中,有些目录是无需备份的,如:workspace。

因为workspace是版本控制系统的工作目录,这个目录下的相关文件都来自版本控制系统,都可以从版本控制系统获取。

###Jenkins备份插件### Jenkins是可扩展的,有上千个插件可供选择,在备份这方面有两个插件可供选择:thinBackup plugin和backup plugin。

thinBackup plugin可以自动备份全局的和job的指定配置文件(不包括archive和workspace)。

backup plugin可以备份JENKINS_HOME,可以选择是否备份workspace、builds history、maven atifacts archives、fingerprints等。

thinBackup plugin和backup plugin不同:

  1. bakup plugin只能手动触发备份,thinBackup plugin可以定期自动备份。
  2. bakup plugin可以备份JENKINS_HOME,可以选择哪些内容是否需要备份(如workspace、builds history等), thinBackup plugin只备份最重要的信息(全局的和job的指定配置文件)。

上面两个备份插件总体来说满足一般的需求了。

通常持续集成服务器资源专用,Jenkins安装在专门的服务器上(如:虚拟机)。 但是如果虚拟机挂了,短时间内难以恢复,自然也无法从备份恢复了(上面两个插件都是本机备份)。

所以为了应对这种情况的发生,应该把JENKINS_HOME备份到其他地方。

###将JENKINS_HOME备份到版本控制系统### 笔者选择将JENKINS_HOME备份到版本控制系统:

  1. 版本控制系统选择的是SVN
  2. 每晚自动备份JENKINS_HOME至SVN
  3. 此外,通过SVN和可以对比两个revision之间的差异,查看变更,便于追溯

备份前的初始化步骤如下:

  1. 在SVN版本库上新建一个目录如JENKINS_HOME_BAK
  2. 将JENKINS_HOME_BAK检出(checkout)到Jenkins服务器上的某个位置,如E:/JENKINS_HOME_BAK

具体的备份步骤如下:

  1. 拷贝JENKINS_HOME到JENKINS_HOME_BAK
  2. 将JENKINS_HOME_BAK中未纳入版本控制的文件或目录纳入到版本控制(svn add操作)
  3. 遍历JENKINS_HOME_BAK,如果其中的文件或目录不在JENKINS_HOME中,对其执行svn delete操作
  4. 最后提交到SVN版本库(svn ci操作)

上述步骤,如果第2步是手动,理论上是难以实现的,所以如果是手动备份,可以不执行第5步操作 而这些流程化的步骤,如果手动操作,异常繁琐、重复,懒人通常懒的做重复性的事,所以应该将其自动化。

关于自动化备份脚本,主要是实现上面的4个步骤:

  1. 对于第1步,使用Ant脚本实现
    • Ant脚本不仅仅用于构建,还可以用于构建之外
    • Ant的语法很灵活,有很多task可供选择
    • 拷贝操作使用了Ant copy task,可以使用fileset的excludes来排除无需拷贝的文件或目录(如workspace),很方便
    • Ant copy task可以增量copy
  2. 对于第2步、第3步和第4步,使用Python+svn client comands实现
    • 选择Python是因为最近在不断学习Python
    • 选择svn client commands而不是pysvn是因为没有在windows上安装好pysvn,于是用svn client commands代替

此外,自动化备份,可以在Jenkins上创建一个job专门用来定时备份JENKINS_HOME

具体的实现脚本见:

  • oscgit:<a href="http://git.oschina.net/donhui/JENKINS_HOME_BAKCUP" target="_blank">donhui/JENKINS_HOME_BAKCUP</a>
  • github:<a href="https://github.com/donhui/JENKINS_HOME_BACKUP" target="_blank">donhui/JENKINS_HOME_BAKCUP</a>

补充说明,上述所使用到的工具及环境:

* Jenkins 1.592
* Python 2.7.8
* svn client commands(Windows下安装TortoiseSVN时需要手动选择安装)
* Ant 1.8.1
* 在windows环境和linux环境都验证测试过
* 在svn client 1.6和1.7以上环境都验证测试过

###参考###

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jenkins获取JENKINS_HOME过程

    系统管理→系统设置→主目录  (<JENKINS_URL>/configure页面)

    donghui
  • 删除Jenkins JOB后清理workspace

    如果Jenkins使用的Master-Slave多节点架构,删除Jenkins JOB后,相应JOB的slave节点的workspace不会被删除

    donghui
  • Git LFS(Large File Storage)

    Git Large File Storage (LFS),是GitHub推出的基于Git的扩展,专门用来存储大文件。

    donghui
  • 用C#实现字符串相似度算法(编辑距离算法 Levenshtein Distance)

    在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录。 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫...

    Angel_Kitty
  • 一文读懂 TS 中 Object, object, {} 类型之间的区别

    TypeScript 2.2 引入了被称为 object 类型的新类型,它用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:string、...

    阿宝哥
  • 测试插件-infinitest介绍

    写多了业务代码,一些遗留系统里处于基本没有单测的状态,因此最近对 TDD 的开发方式很感兴趣,看了不少 TDD 介绍和实践的书。

    Dylan Liu
  • 验证常用正则表达式

    1.日期时间验证,支持闰年 支持格式:YYYY/MM/DD, YYYY-MM-DD, YYYY_MM_DD, YYYY.MM.DD 1 var reg = /(...

    就只是小茗
  • 回溯:用于服务缓存的在线策略

    原文题目:RetroRenting: An Online Policy for Service Caching at the Edge

    非过度曝光
  • SharePoint 2013 Step by Step——How to Create a Lookup Column to Another Site(Cross Site)

    OverView In this post,I want to show u how to add a look up column in my list or...

    用户1161731
  • 漫话ES6:part5.对象的新增方法

    ES6 提出“Same-value equality”(同值相等)算法,用来解决相等判断的问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否...

    舒克

扫码关注云+社区

领取腾讯云代金券