Hudson環境のバックアップ

はじめに

リリースに向けて追い込みに入っている状況なのに、マーフィーの法則が予定どおりに(?)働いて、「昨日まで動いていたHudsonがハードディスク故障のせいで動作しなくなっている」なんてことになると大変です。
この記事では、そんな状況でも慌てず騒がず対処できるようにするために、Hudson環境のバックアップについて説明したいと思います。

なお、この記事におけるバックアップ方針は次のとおりです。

  • (A) : お金をかけずに取得する
  • (B) : 安全なタイミングで取得する
  • (C) : 分かりやすい方法で取得する
  • (D) : Hudson自身に(定期的に)取得してもらう

バックアップの前に

バックアップ対象

バックアップ対象は、Hudson環境が構築されているHUDSON_HOMEディレクトリの内容になります。 (HUDSON_HOMEディレクトリ内のディレクトリ構成例は以下を参照)

HUDSON_HOMEディレクトリ
  +--- fingerprints
  +--- jobs
         +--- [JOBNAME]                 (各ジョブ毎のサブディレクトリ)
                +--- workspace          (ワークディレクトリ)
                        +--- builds
  +--- log
  +--- plugins
  +--- tools
  +--- updates
  +--- userContent
  +--- users
  +--- war                              (Hudson本体のディレクトリ)
   ...

補足: Hudsonの設定状態によって多少ディレクトリ構成が変わります。


ただし、HUDSON_HOMEディレクトリのすべての内容をバックアップする必要はありません。
例えば、「war」ディレクトリの内容は、通常「hudson.war」の内容と一致しているはずなのでバックアップ対象外にしても復元できます。また、「workspace」ディレクトリの内容は、通常「構成管理ツールから得たもの」または「ビルド処理によって自動生成されたもの」のどちらかになるはずなので、バックアップ対象外にしても復元できます。
このため、バックアップ対象は、バックアップにかかる時間、バックアップファイルのサイズ、リストアのしやすさのバランスを取って決めることになります。

シャットダウンモードについて

実行中のビルドが存在している状態でバックアップを取得してしまうと、中途半端な状態でバックアップされたビルドと、そうでないビルドが切り分けられなくなってしまいます。
このため、バックアップはシャットダウンモードに移行してから実施することをお勧めします。(Hudsonのアップグレード - シャットダウンモードについて参照)

バックアップの開始時刻について

シャットダウンモードへの移行を前提にしたバックアップ計画を立案する場合、バックアップを実際に開始できる時刻(シャットダウン状態で実行中の全ビルドが終了する時刻)が問題になります。
例えば、一回のビルドに何日も要してしまうようなジョブが存在する場合は、バックアップサイクルが安定しにくくなるので「ビルドの実行時間を短縮する」、「バックアップサイクルを考慮したビルドの実行サイクルにする」などの対策が必要になります。もしくは、これらの対応が難しい場合は、シャットダウンモードへの「移行を前提にしないバックアップ」と「移行を前提にするバックアップ」を併用するなどの対策が必要になります。

バックアップ手段について

Administrating Hudson - バックアップとリストアのとおり、Hudson環境はファイルをアーカイブするだけでバックアップできますが、この記事では先に述べた方針に従って、次の点を考慮した2つのバックアップ手段を紹介します。

  • HudsonとHudsonのプラグインを使ってバックアップする。(方針(A)&(D)より)
  • 中途半端な状態でバックアップされないようにする。(方針(B)より)
  • 除外したいファイルを分かりやすい方法で設定できるようにする。(方針(C)より)


2つのバックアップ手段は次のとおりです。

手段 概要
Backup Pluginを使用したバックアップ Backup専用のプラグインを使用してバックアップします。
Exclusive Execution Plugin + Antタスクを使用したバックアップ シャットダウンモードの管理をするプラグインとAntタスクを組み合わせてバックアップします。


使用するプラグインの名称と関連URLは次のとおりです。

プラグイン Wiki URL ダウンロード URL GitHub URL
Backup Plugin http://wiki.hudson-ci.org//display/HUDSON/Backup+Plugin http://updates.hudson-labs.org/download/plugins/backup/ https://github.com/hudson/backup-plugin
Exclusive Execution Plugin http://wiki.hudson-ci.org//display/HUDSON/Exclusive+Execution+Plugin http://updates.hudson-labs.org/download/plugins/exclusive-execution/ https://github.com/hudson/exclusive-execution-plugin

バックアップを取得する

ここから、それぞれのバックアップ手段の実施手順を説明します。
(それぞれのバックアップ手段のメリット/デメリットは後述します)

Backup Pluginを使用したバックアップ
  • Backup Pluginがインストール済みであると仮定します。
  • バックアップファイルの格納先ディレクトリは「C:\Hudson\Backup」であるとします。
  • Hudsonのトップ画面から、[Hudsonの管理] - [Backup manager]を選択します。

  • [Setup]を選択します。

  • 必要な設定をしてから[Save]ボタンを押します。


補足: 最低限設定する必要がある項目は、[Backup directory](バックアップファイルの格納先ディレクトリ)のみです。
補足: Windowsの場合は、(扱いやすいという意味で) [Format]を "zip" に変更した方が良いでしょう。
補足: バックアップファイル名は、[File name template]に従って決定されます。(例: backup_20110101_1200.zip)
補足: [Backup content]の設定項目でバックアップ対象を制御できます。

  • 設定後に、Hudsonのトップ画面から、[Hudsonの管理] - [Backup manager] - [Backup Hudson configuration]を選択してバックアップを取得します。

  • [Backup started at ...]と表示され、シャットダウンモードに移行します。


補足: 実行中のビルドがなくなってから、バックアップが開始されます。

  • [Backup end at ...]と表示されれば、バックアップ終了です。


補足: [Number of errors:]の値が 0 であることを確認してください。
補足: 自動的にシャットダウンモードがキャンセルされます。
注意: 実行ログ画面は再表示できません。画面を切り替えた場合は、%HUDSON_HOME%\backup.logをテキストエディタなどで直接開く必要があります。

Exclusive Execution Plugin + Antタスクを使用したバックアップ
  • Antがインストール済みであると仮定します。
  • Exclusive Execution Pluginがインストール済みであると仮定します。
  • バックアップファイルの格納先ディレクトリは「C:\Hudson\Backup」であるとします。
  • 次の操作で新しいジョブを作成します。
    • Hudsonのトップ画面で[新規ジョブ作成]を選択する。
    • ジョブ名を入力する。
    • [フリースタイル・プロジェクトのビルド]を選択する。
    • [OK]を押す。


補足: 標準のワークディレクトリにバックアップファイルを作成してから、バックアップファイルの格納先にファイルを移動する方が素直ですが、ここではバックアップファイルの格納先をワークディレクトリにすることで移動処理を省いています。

  • 次の操作でバックアップスケジュールを設定します。
    • [ビルド・トリガ]の[定期的に実行]をチェックします。
    • [スケジュール]にビルドの開始タイミングを設定します。


補足: ここでは"@daily"を設定していますが、バックアップ計画に基づいてより適切な値を設定してください。

  • 次の操作でシャットダウンモードでバックアップが実施されるようにします。
    • [ビルド環境]の[Set exclusive execution]をチェックします。


補足: Exclusive Execution Pluginによって追加される設定項目です。
補足: [Set exclusive execution]を設定すると、この設定をしたジョブだけが実行できる状態になってから、ジョブのビルドが実行されるようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project default="backup" basedir=".">
  <property environment="env" />
  <target name="backup" >
    <zip basedir="${env.HUDSON_HOME}"
             destfile="Hudson${label}.zip" excludes="war/**, jobs/*/workspace/**">
    </zip>
  </target>
</project>

補足: Hudsonのバックアップ - azuki notebuild.xmlを参考にさせて頂きました。
補足: "backup"がターゲット名です。
補足: 「war」と「workspace」をバックアップ対象外にしています。
補足: プロパティ(ここでは"label")を用いて、バックアップファイル名をパラメータ化しています。

  • 次の操作でビルドアクションを設定します。
    • [ビルド]の[ビルド手順の追加]を押して、[Antの呼び出し]を選択します。
    • 必要に応じて[使用するAnt]を選択します。
    • [ターゲット]に"backup"と記述します。
    • [高度な設定...]を押して、[プロパティ]を表示し、"label=$BUILD_ID"と記述します。


補足: バックアップファイル名に使用している$BUILD_IDは、Hudsonが提供する環境変数の一つです。
補足: Antのビルドファイル名が"build.xml"以外の場合は、[ビルドファイル]にファイル名を記述する必要があります。

  • [保存]ボタンを押して設定を終了します。
  • ビルドを実行すると、次のようにシャットダウンモードに移行してからビルドアクションが実行されます。

  • [Finished SUCCESS]と表示されれば、バックアップ終了です。

メリット/デメリット

Backup Pluginを使用したバックアップ
  • メリット
    • シャットダウンモードに移行してからバックアップを取得できる。
    • リストア機能も提供されている。
    • Antなどに頼らずにプラグイン単独でバックアップを取得できる。
    • バックアップ対象に関する設定項目が標準で提供されている。
  • デメリット
    • バックアップ中かどうかをHudsonのGUIから確認できない。(再表示の場合)
    • Hudsonの標準機能だけを用いて定期的にバックアップできない。(wgetなどが必要)
    • Hudsonの標準機能だけを用いてバックアップの成功/失敗が管理できない。
    • バックアップの終了判定がしにくい。(%HUDSON_HOME%\backup.logのチェックが必要)
    • バックアップ終了後の追加処理が設定しにくい。
    • バックアップ対象を細かく設定できない。
Exclusive Execution Plugin + Antタスクを使用したバックアップ
  • メリット
    • シャットダウンモードに移行してからバックアップを取得できる。
    • バックアップ中かどうかをHudsonのGUIから確認できる。
    • Hudsonの標準機能だけを用いて定期的にバックアップできる。
    • Hudsonの標準機能だけを用いてバックアップの成功/失敗が管理できる。
    • Hudsonの標準機能だけを用いてバックアップの終了判定ができる。
    • バックアップ終了後の追加処理を設定しやすい。
    • バックアップ対象を細かく設定できる。また、ビルドに必要なファイルが、HUDSON_HOMEディレクトリ外にあったとしてもバックアップできる。
  • デメリット
    • 手動でリストアを実施する必要がある。
    • プラグイン単独ではバックアップを取得できない。
    • バックアップ対象に関する設定項目が標準で提供されていない。

おわりに

  • 「バックアップの成功/失敗の管理をHudsonに任せられる」ので、私自身は「Exclusive Execution Plugin + Antタスクを使用したバックアップ」を採用しています。
  • インストールするものが少なく、かつ、Hudsonが標準でサポートしているのでAntを採用しましたが、Ant以外でアーカイブを作成していただいても何ら問題ありません。
  • Administrating Hudson - バックアップとリストアのとおり、バックアップしたファイルをHUDSON_HOMEディレクトリに展開しなおすだけでHudson環境をリストアできます。