Hudsonでリモートサーバ上でコマンドを起動したい

Hudsonでは、ノードの追加を行うことで分散ビルド環境が比較的簡単に実現できます。

分散ビルド環境は、まだまだ必要ありませんが、これ、リモートサーバにJavaの実行環境さえあれば、リモートサーバでバッチファイルを実行したりできるのではないかと考え、ノードの追加にチャレンジしてみました。まず、Hudsonの管理>ノードの管理>新規ノード作成で作成します。

最初は、以下のように赤い×がついてますが、これはこれでOKです。書いてあるように、今度はスレーブ側のサーバで作業します。

スレーブ側のサーバのコマンドプロンプトで、


javaws http://XX.XX.XX.XX:YYYY/hudson/computer/remote/slave-agent.jnlp
と打ち込むとユーザ認証が起動しますので、ユーザIDとパスワードを入力します。私の環境はTracLightning環境下のHudsonなので、Tracユーザで認証しています。

認証が成功すれば、

のウィンドウが現れ、コネクションが確立されます。この状態で親(マスター)から子(スレーブ)へJOBを依頼できます。子にHudsonをインストールする必要がないのが素敵です。
このままではログオフするとコネクションが切れますので、サービス化します。

ところが、このままではうまくいきませんでした。ログには以下のようにでています。

Failing to obtain http://XX.XX.XX.XX:YYYY/hudson/computer/remote/slave-agent.jnlp
java.io.IOException: Failed to load http://XX.XX.XX.XX:YYYY/hudson/computer/remote/slave-agent.jnlp: 401 Authorization Required
at hudson.remoting.Launcher.parseJnlpArguments(Launcher.java:229)
at hudson.remoting.Launcher.run(Launcher.java:191)
at hudson.remoting.Launcher.main(Launcher.java:167)
Waiting 10 seconds before retry
なるほど、、、認証で落ちているようです。
これには、以下で対応しました。
スレーブ側のワークディレクトリに指定したフォルダ(リモートFSルート:上の図だと、C:\Users\Administrator)に、hudson-slave.xmlというファイルがありますので、認証情報を追加します。
下の-auth user:passwdの部分です。

<service>
  <id>hudsonslave</id>
  <name>Hudson Slave</name>
  <description>This service runs a slave for Hudson continuous integration system.</description>
  <!--
    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>C:\Program Files\Java\jre6\bin\java.exe</executable>
  <arguments>-Xrs -jar "%BASE%\slave.jar" -auth user:passwd -jnlpUrl http://XX.XX.XX.XX:YYYY/hudson/computer/MDM-DEP/slave-agent.jnlp</arguments>
  <!--
    interactive flag causes the empty black Java window to be displayed.
    I'm still debugging this.
  <interactive />
  -->
  <logmode>rotate</logmode>
</service>
  • auth user:passwdの部分には、実際はユーザIDとパスワードを指定してください。

これでうまく行く筈。。。