Hudsonを使ったアジャイルな開発入門

第3回 Hudsonによるチーム間の連携

この記事を読むのに必要な時間:およそ 4 分

分散ビルド

Hudsonの利用が進み,多くのビルドやテストがHudsonに移ると,一台のコンピュータで全てのビルドを賄うのは困難になります。実際,ビルドもテストもCPUやI/O帯域をごっそり消費するので,数個のアクティブなビルドがHudson上に存在するだけでこの問題は顕著になってきます。ビルドの待ち時間が伸びるとCIの効果は薄れますし,所詮一台のコンピュータができることはたかがしれています。この問題を解決するために,Hudsonはビルドを複数のコンピュータに分散させる機能を持っています。これによって,ジョブの数が増えても大きな性能低下を招かずにビルドの実行が行えます。

Hudsonの分散ビルドの仕組みはマスター・スレーブ方式です。hudson.warのウェブアプリケーション自身がマスターとなり,HTTPリクエストのハンドリング,データの保存,及びスレーブの管理を行います。マスターは1台だけで,また大規模なHudsonではHTTPリクエスト処理だけでそれなりのパワーが必要になりますから,一番良いコンピュータを割り当てましょう。一方,スレーブは,マスターの指示によってビルドを行うだけの存在です。ビルド自体に必要な計算機資源の他には特に必要なものはありません。筆者の職場では,同僚達の使っていないコンピュータや廃品回収されたPentium4 PCを中心にスレーブ30台以上のクラスタが,Sun Blade 2500のマスターに接続されて稼働しています。

Hudsonはスレーブを制御するために「スレーブエージェント」という小さなプログラムをスレーブ上で走らせる必要があります。このプログラムは,配備・更新が簡単なように100K弱の小さなjarファイル1つにまとめられています。起動方法によって厳密な仕組みは異なりますが,何らかの方法でマスターと双方向の通信チャンネルを確立すればOKで,スレーブエージェントは残りのプログラムをon-demandでマスターからダウンロードして処理を進めます。

スレーブ起動方式

スレーブがマスターとの接続を確立するには主に2つの方式があります。

  1. マスターがスレーブエージェントを起動する方法:
    マスター側からsshやrshなどを介して別マシン上にスレーブエージェントを起動します。この時スレーブエージェントの標準入出力はマスターと接続されているので,これが通信チャンネルになります。この方法はsshなど既存のリモートログインメカニズムが必要ですが,スレーブ側で別途デーモンプロセスを管理する必要がない点が優れています。sshが標準で入っているUnixシステム向けの方法です。
  2. Java Web Startを使ってスレーブエージェントを起動する方法:
    スレーブマシンからHudsonのUIにアクセスし,下図のようにボタンをクリックしてスレーブエージェントを起動します。この仕組みはJava Web Startを利用していて,マスターとの間にTCPソケットを使った通信路を確立します。この方法はsshのような仕組みが必要ありませんが,GUIが必要です。また,自動的にスレーブエージェントを起動させるためには,オートログインとスタートアップグループなどを組み合わせてプログラムが自動的にスタートするようにする必要があります。

画像

そもそもは前者がUnixシステム/大規模Hudson向け,後者がWindowsシステム/小規模Hudson向けに作られているのですが, Cygwinを使ってWindows上にsshをインストールしたり,Java Web StartをUnixデーモン/Windowsサービスとして起動する仕組みが開発されたりと,現在では様々な形態で運用することが出来るようになっています。

スレーブを追加してみる

それでは,実際にスレーブを一つ追加してみましょう。ここでは,Windows/Unix共に利用可能な,sshを利用した方法を紹介します。繰り返しますが,ここで解説する形態以外で運用することも出来るので,ここで触れるのは一つの方法に過ぎません。

  1. まず,マスターとなるコンピュータ上に「hudson」ユーザーを作成しましょう。Hudsonに専用のユーザーIDを割り当てることで,複数の人間がHudsonの管理者として作業するのが簡単になりますし,ビルド中に間違って生成されたファイルや,綺麗にシャットダウンされなかったデーモンプロセスをkillするのも簡単になります。
  2. このユーザーIDを使って,Hudsonを起動しましょう。Hudsonはスーパーユーザーではないのでそのままでは80番ポートでは動作できませんが,AJPやmod_proxyを使ってapacheと接続することで,この問題を解決することができます。
  3. スレーブとなるコンピュータを選び,このコンピュータ上にも「hudson」ユーザーを作成しましょう。この時,管理を簡単にするために,ホームディレクトリの位置を「/home/hudson」なり「/export/home/hudson」なり,マスターと同じものを選びます。また,ビルドはファイルアクセスが多いので,ホームディレクトリがNFSではなくローカルディスク上に配置されるようにしましょう。
  4. sshの公開鍵認証を設定し,マスター上のhudsonユーザーがスレーブ上のhudsonユーザーにパスワードなしでログインできるようにしましょう。公開鍵認証の詳細は本稿の範囲を越えますが,インターネット上に沢山のリソースがあるので,それらを参考にしてください。
  5. hudson.war内に含まれているslave.jarを取り出して,スレーブ上に配置します。
  6. マスターのシステム設定画面に移動し「スレーブ」セクションに新しいスレーブを追加します(下図参照)⁠ここでは,最大同時ビルド数を2にして,データファイルがHudsonのホームディレクトリ上に展開されるようにしてあります。
  7. 設定を更新してしばらくすると,スレーブがオンライン状態になるはずです。これで準備が完了です。もしオンラインにならなければ画面左の「ビルド実行状態」からスレーブへのリンクをクリックして,ログを確認してエラーの状況を調べます。

この状態で同時に沢山のビルドが必要になると,Hudsonは自動的にスレーブを活用し始めます。この調子で,任意の数のスレーブをセットアップする事ができます。スレーブの数が増えて,ビルドやテストのために,異なる環境のスレーブを用意する場合,新しいスレーブの追加や古いスレーブの廃棄に対応しやすくするために,スレーブに「windows」⁠linux」などのようなラベルを割り当てましょう。ジョブはラベルに依存させ,個別スレーブへの依存を避けるようにすれば,クラスタの管理が容易になります。

おわりに

Hudsonには,開発チームを跨ってより多くの人々に使われるようになった時に真価を発揮する機能がたくさんあります。連載3回目の今回は,こうした機能に着目して,ファイル指紋によるトラッキングや,分散ビルドを使った大規模なHudsonの運用について簡単に紹介しました。次回は,主だったプラグインのいくつかを紹介します。

著者プロフィール

川口耕介(かわぐちこうすけ)

Sun Microsystems, Inc.のシニアスタッフエンジニア。主としてXMLとのそのスキーマ言語関係の仕事をし,JAXB, JAXP, JAX-WSなどの仕様策定・実装に携わった。仕事の他にも,主にjava.netに多数の趣味のプロジェクトをホストしている。Hudsonは趣味のプロジェクトとして開始したが,今では本業の一部。米国カリフォルニア州在住。

URLhttp://www.kohsuke.org/

コメント

コメントの記入