同一マシンの同一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の管理]を選択し、続けて[システムの設定]を選択します。
- 設定画面で次の操作をします。
補足: アクセス制御を既に設定していた場合は、設定を変更する必要はありません。
補足: アクセス制御の設定は本来不要なはずですが、この設定をしないと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 にコピーします。
- C:\Hudson\Home\hudson.exe
- C:\Hudson\Home\hudson.xml
- 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環境を同居させることができます。
の場合
要素 | 値 |
---|---|
(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環境を稼動させることができます。
>copy hudson.war hudsontest.war
- Hudsonのセットアップ(Tomcatに配備して起動)に従って、「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環境としては十分です。ただし、私自身はプラグインの日本語化をしたときに、との細かな環境差に悩まされました。