Jenkinsバックアップ&リストア(Windows編)

今回のゴール

Windows環境で起動しているJenkinsのバックアップを定期的に作成する。
バックアップファイル別のWindows環境にリストアする。

環境情報

OS : Windows7
Jenkins :1.514

バックアップ方法

バックアップ用のプラグインthinBackupなど)を利用する方法もあるが、
バックアップ対象などをフレキシブルに変更できるようにするため
バッチファイルを作成する。
当該のバッチファイルをJENKINSよりスケジュール起動することで、
定期的にバックアップを取得する。

バックアップ対象

下記のファイルを除く%JENKINS_HOME%配下全て

  • ${JENKINS_HOME}/jobs/${JOB_NAME}/builds : ビルド履歴
  • ${JENKINS_HOME}/jobs/${JOB_NAME}/workspace : ワークスペース
  • ${JENKINS_HOME}/jobs/${JOB_NAME}/lastStable : 最終安定ビルド
  • ${JENKINS_HOME}/jobs/${JOB_NAME}/lastSuccessful : 最終成功ビルド
  • ${JENKINS_HOME}/jobs/${JOB_NAME}/nextBuildNumber : 次回ビルド番号

要はビルド履歴に関するデータとワークスペース以外

バッチファイル作成

jenkins_backup.bat

SET BKDATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%

REM バックアップファイル作成
%WORKSPACE%/7za920/7za.exe a -xr!*/jobs/*/workspace -xr!*/jobs/*/builds -xr!*/jobs/*/lastStable -xr!*/jobs/*/lastSuccessful -xr!*/jobs/*/nextBuildNumber "%WORKSPACE%/jenkins_%BKDATE%.zip" "%JENKINS_HOME%"

REM バックアップフォルダへコピー
copy "%WORKSPACE%\jenkins_%BKDATE%.zip" "%BACKUP_DIR%"

REM バックアップ世代管理
pushd "%BACKUP_DIR%"
for /f skip=%BACKUP_GEN% %%A in (`dir /a-d jenkins_????????.zip /b /o-d`) do (
    del /q %%A
)

1.JENKINSより渡される変数

  • JENKINS_HOME : JENKINSホームディレクトリの絶対パス
  • WORKSPACE : JENKINSワークスペース絶対パス
  • BACKUP_DIR : バックアップファイルの配置先
  • BACKUP_GEN : バックアップ世代数

 
2.ディレクトリ構成
%WORKSPACE%
 ├ 7za920
 │ ├ 7za.exe
 │ └ …
 └ jenkins_backup.bat …実行スクリプト
 
3.バックアップファイルにタイムスタンプを付与

SET BKDATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%

 
4.バックアップファイルのZIP化

%WORKSPACE%/7za920/7za.exe a -xr!*/jobs/*/workspace -xr!*/jobs/*/builds -xr!*/jobs/*/lastStable -xr!*/jobs/*/lastSuccessful -xr!*/jobs/*/nextBuildNumber "%WORKSPACE%/jenkins_%BKDATE%.zip" "%JENKINS_HOME%"

WindowsコマンドラインではZIP化のコマンドが無いため、7-Zipコマンドライン版を使用する。
http://sevenzip.sourceforge.jp/howto/non-install-compress.html

各種コマンドは以下のとおり。

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Usage: 7za <command> [<switches>...] <archive_name> [<file_names>...]
       [<@listfiles...>]

<Commands>
  a: Add files to archive
  b: Benchmark
  d: Delete files from archive
  e: Extract files from archive (without using directory names)
  l: List contents of archive
  t: Test integrity of archive
  u: Update files to archive
  x: eXtract files with full paths
<Switches>
  -ai[r[-|0]]{@listfile|!wildcard}: Include archives
  -ax[r[-|0]]{@listfile|!wildcard}: eXclude archives
  -bd: Disable percentage indicator
  -i[r[-|0]]{@listfile|!wildcard}: Include filenames
  -m{Parameters}: set compression Method
  -o{Directory}: set Output directory
  -p{Password}: set Password
  -r[-|0]: Recurse subdirectories
  -scs{UTF-8 | WIN | DOS}: set charset for list files
  -sfx[{name}]: Create SFX archive
  -si[{name}]: read data from stdin
  -slt: show technical information for l (List) command
  -so: write data to stdout
  -ssc[-]: set sensitive case mode
  -ssw: compress shared files
  -t{Type}: Set type of archive
  -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options
  -v{Size}[b|k|m|g]: Create volumes
  -w[{path}]: assign Work directory. Empty path means a temporary directory
  -x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames
  -y: assume Yes on all queries

 
5.世代管理
管理世代数を超えたファイルを削除する。

for /f "skip=%BACKUP_GEN%" %%A in ('dir /a-d jenkins_????????.zip /b /o-d') do (
    del /q %%A
)

JENKINSより起動

週1回の定期実行JOBを作成する。詳細は割愛。

リストア

1.JENKINS_HOME配下を削除(退避)
 
2.バックアップファイル(.zip)を解凍し、JENKINS_HOME配下に配置

※異なる環境にリストアする場合、Jenkinsの設定(Jenkins > Jenkinsの管理 > システムの設定)に留意する必要がある。

  • JDK/インストール済みのJDK …MAVEN_HOMEを適切に設定すること
  • Maven/インストール済みのMaven …JAVA_HOMEを適切に設定すること
  • Jenkinsの位置/Jenkins URL …Jenkins URLを適切に設定すること
  • Subversion/ワークスペースバージョン …バージョンを適切に設定すること
    などなど…