每日備份JENKINS_HOME至SVN

##每日備份JENKINS_HOME至版本控制系統SVNhtml

Jenkins是一個可擴展的開源的持續集成工具,也是當下最流行的持續集成工具。linux

###Jenkins主要功能###git

  • 易於安裝(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可定製、可擴展。github

###JENKINS_HOME目錄結構### Jenkins的相關文件都存放在文件系統中,而JENKINS_HOME主要用來存放這些文件的,如系統配置文件、插件、每一個job的配置文件等。windows

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>maven

不管是Jenkins的升級、遷移仍是備份、恢復都須要對JENKINS_HOME的操做,而備份Jenkins只需備份JENKINS_HOME便可。分佈式

在JENKINS_HOME中,有些目錄是無需備份的,如:workspace。ide

由於workspace是版本控制系統的工做目錄,這個目錄下的相關文件都來自版本控制系統,均可以從版本控制系統獲取。svn

###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以上環境都驗證測試過

###參考###

相關文章
相關標籤/搜索