同一マシンの同一OS上に二つのHudson環境を構築する

はじめに

運用中のHudson本体を予習なしでアップグレードするわけにはいきません。また、Hudson本体のアップグレードよりも既存環境に与える影響度合いが少ないとはいえ、プラグインを予習なしでインストール/アップグレードするのも避けたいものです。
そこで、今回の記事では、このような不安を多少なりとも払拭できるようにするために、試験用のHudson環境の構築について説明したいと思います。

なお、この記事では運用中のHudson環境に可能な限り近いハードウェア構成で試験用のHudson環境を構築することを目的として、同一マシンの同一OS上に二つのHudson環境を構築する方法について説明します。


以下では、Hudsonの起動方法の違いを簡易的に表現するためのアイコンを用います。
   : Hudsonをコマンドシェルから起動することを表します
   : HudsonをWindowsのサービスとして起動することを表します
   : HudsonをTomcatに配備して起動することを表します

二つのHudson環境を構築する前に

環境の区別に必要な要素

二つのHudson環境を区別する際に、(通常のHudson環境で)異なる値に設定する必要がある要素は次の通りです。

要素 概要
(A) : HUDSON_HOMEディレクト Hudsonの環境が構築されているディレクトリです。詳細は「Hudsonのホームディレクトリを変更する」を参照してください。
(B) : HTTPポート番号 またはの場合に異なる値に設定する必要があります。
(C) : HTTPSポート番号 またはの場合に異なる値に設定する必要がありますが、今回はポートを無効化しているものとします。
(D) : AJP13ポート番号 またはの場合に異なる値に設定する必要がありますが、今回はポートを無効化しているものとします。
(E) : JNLPスレーブ用TCPポート番号 競合しないポート番号をランダムで自動設定するようになっているので、ファイヤーウォール対策でポート番号を固定化する場合以外は設定する必要がありません。
(F) : Windowsサービス名 の場合に異なる値に設定する必要があります。
(G) : Tomcatの配備ディレクト の場合に異なる値に設定する必要があります。
JNLPスレーブ用TCPポート番号の固定化

ファイヤーウォール対策が必要な場合は、以下の手順でJNLPスレーブ用TCPポート番号を固定化します。

  • Hudsonをシャットダウンモードにして、実行中のビルドが無くなるのを待ちます。
  • Hudsonのトップ画面で[Hudsonの管理]を選択し、続けて[システムの設定]を選択します。

  • 設定画面で次の操作をします。
    1. [セキュリティを有効化]をチェックします。
    2. JNLPスレーブ用TCPポート番号の[固定]ラジオボタンを選択し、ポート番号を入力します。
    3. アクセス制御のユーザ情報から[Hudsonのユーザーデータベース]を選択します。
    4. 設定画面下部の[保存]ボタンを押します。


補足: アクセス制御を既に設定していた場合は、設定を変更する必要はありません。
補足: アクセス制御の設定は本来不要なはずですが、この設定をしないとJNLPスレーブ用TCPポート番号の設定変更が保存されません。

  • 最後にシャットダウンモードをキャンセルして設定変更を終了します。

二つのHudson環境を構築する

の場合
  • 一つ目のHudson環境を次の条件で稼動させるものとします。
要素
(A) : HUDSON_HOMEディレクト C:\Hudson\Home
(B) : HTTPポート番号 8080
(C) : HTTPSポート番号 -1 (無効)
(D) : AJP13ポート番号 -1 (無効)
(E) : JNLPスレーブ用TCPポート番号 ランダム
  • 二つ目のHudson環境を次の条件で稼動させるものとします。
要素
(A) : HUDSON_HOMEディレクト C:\Hudson\Test
(B) : HTTPポート番号 8090
(C) : HTTPSポート番号 -1 (無効)
(D) : AJP13ポート番号 -1 (無効)
(E) : JNLPスレーブ用TCPポート番号 ランダム


上記の場合、次のように起動オプションを区別することで、二つのHudson環境を同居させることができます。

> java -DHUDSON_HOME=C:\Hudson\Home -jar hudson.war --httpPort=8080 --httpsPort=-1 --ajp13Port=-1
> java -DHUDSON_HOME=C:\Hudson\Test -jar hudson.war --httpPort=8090 --httpsPort=-1 --ajp13Port=-1

補足: HTTPSポート番号はデフォルトで無効になっているので、明示的にオプションを記述する必要はありません。


の場合
  • 一つ目のHudson環境が次の条件で稼動しているものと仮定します。
要素
(A) : HUDSON_HOMEディレクト C:\Hudson\Home
(B) : HTTPポート番号 8080
(C) : HTTPSポート番号 -1 (無効)
(D) : AJP13ポート番号 -1 (無効)
(E) : JNLPスレーブ用TCPポート番号 ランダム
(F) : Windowsサービス名 hudson
  • 二つ目のHudson環境を次の条件で稼動させるものとします。
要素
(A) : HUDSON_HOMEディレクト C:\Hudson\Test
(B) : HTTPポート番号 8090
(C) : HTTPSポート番号 -1 (無効)
(D) : AJP13ポート番号 -1 (無効)
(E) : JNLPスレーブ用TCPポート番号 ランダム
(F) : Windowsサービス名 hudsontest


上記の場合、以下の手順で二つ目のHudson環境を稼動させることができます。

  • 次の3つのファイルを C:\Hudson\Test にコピーします。
    1. C:\Hudson\Home\hudson.exe
    2. C:\Hudson\Home\hudson.xml
    3. C:\Hudson\Home\hudson.war
> copy C:\Hudson\Home\hudson.exe C:\Hudson\Test\hudson.exe
> copy C:\Hudson\Home\hudson.xml C:\Hudson\Test\hudson.xml
> copy C:\Hudson\Home\hudson.war C:\Hudson\Test\hudson.war
  • C:\Hudson\Test\hudson.xmlを次のように編集します。
<service>
  <id>hudsontest</id>
  <name>hudsontest</name>
  <description>This service runs Hudson continuous integration system.</description>
  <env name="HUDSON_HOME" value="%BASE%"/>
  <!--
    if you'd like to run Hudson with a specific version of Java, specify a full path to java.exe.
    The following value assumes that you have java in your PATH.
  -->
  <executable>java</executable>
  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\hudson.war" --httpPort=8090 --httpsPort=-1 --ajp13Port=-1</arguments>

補足: id、name、argumentsを変更します。

  • 次のコマンドを入力して、二つ目のHudson環境をWindowsサービスとして起動します。
> cd C:\Hudson\Test
> hudson.exe install
> net start hudsontest
  • これで次のようにWindowsサービスが複数個登録され、二つのHudson環境を同居させることができます。


の場合
  • 環境変数またはシステムプロパティに HUDSON_HOME が設定されていないと仮定します。
    また、Tomcatが次の条件で稼動していると仮定します。
要素
(B) : HTTPポート番号 8080
(C) : HTTPSポート番号 コネクタを無効化
(D) : AJP13ポート番号 コネクタを無効化
  • 一つ目のHudson環境が次の条件で稼動中であると仮定します。
要素
(A) : HUDSON_HOMEディレクト C:\Hudson\Home
※ JNDI変数で設定
(E) : JNLPスレーブ用TCPポート番号 ランダム
(G) : Tomcatの配備ディレクト /hudson
  • 二つ目のHudson環境を次の条件で稼動させるものとします。
要素
(A) : HUDSON_HOMEディレクト C:\Hudson\Test
※ JNDI変数で設定
(E) : JNLPスレーブ用TCPポート番号 ランダム
(G) : Tomcatの配備ディレクト /hudsontest


上記の場合、以下の手順で二つ目のHudson環境を稼動させることができます。

  • 「.war」ファイルのファイル名がTomcatの配備ディレクトリ名になるので、「hudson.war」のファイル名を「hudsontest.war」に変更します。
>copy hudson.war hudsontest.war

注意: この時点ではJNDI変数が設定されていないので、%USERPROFILE%\.hudsonがHudsonのホームディレクトリになります。

  • [\webapps\hudsontest\WEB-INF\web.xml]を編集して、JNDI変数を設定します。
  <!-- if specified, this value is used as the Hudson home directory -->
  <env-entry>
    <env-entry-name>HUDSON_HOME</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:\Hudson\Test</env-entry-value>
  </env-entry>
  • [Tomcat Manager]で[/hudsontest]の[再ロード]を選択し、続けて[OK]を押します。


  • 再ロードが完了すると、二つ目のHudson環境のJNDI変数が有効になり、二つのHudson環境を同居させることができます。

おわりに

  • 書いておきながらこう言うのもなんですが、もっとスマートに同居させる方法があるのではないかと思っています。より適切な手順がありましたら、コメント頂けると幸いです。
  • コマンドシェルから起動するだけでも試験用のHudson環境としては十分です。ただし、私自身はプラグインの日本語化をしたときに、の細かな環境差に悩まされました。