hudson入門

hudsonのサイト
https://hudson.dev.java.net/


https://hudson.dev.java.net/servlets/ProjectDocumentList?folderID=2761&expandFolder=2761&folderID=0
からhudson.warをダウンロード。

java -jar hudwon.war

で起動できる。
defaultで8080ポートを使うので開発時にTomcatをつかっているとバッティングするので

>type hudson.bat
@IF "%DEBUG%" == "" @ECHO OFF
@REM ####################################################
@REM hudsonを起動
@REM ####################################################
pushd %~dp0.

SET HUDSON_HOME=.hudson
java -jar hudson.war --httpPort=8082

popd
:end


のようなhudson.batを作ってエクスプローラから起動できるようにしするとよいだろう。
起動したら http://localhost:8082/ でアクセスするとよい。


プロジェクトの作り方などは


Hudsonを使ったアジャイルな開発入門(hudson作者の川口耕介さんによる解説)
http://gihyo.jp/dev/feature/01/hudson


hudsonの日本語ドキュメント
http://hudson.gotdns.com/wiki/display/JA/Hudson


などをみればよいだろう。

hudsonのよい点、いまいちな点

よい点

  • CIとして優秀(すごいなー。便利そうな機能を使いこなしてないけど)
  • 日本語化されている
  • java -jar hudson.war で起動できるのが非常にうれしい。DOTNETな人にに5分でCI環境できるのでためしてといったら3分でできたと報告をもらった(もちろんJavaがインストールされている必要があるが)。
  • プラグインが作りやすい。実際に作ってみたがそんなに難しくなかった。他のプラグインのソースを読まないといけないことも多いけど。
  • プラグインが豊富。
  • Java以外にも対応できるのがGood。他のCIは結局つかわなくなってシェルベース(*.bat,*.sh)になってしまうことが多かった。

いまいちな点

  • java.netが重くてドキュメント参照がしずらい。
  • jelleyを使っている。ただしmaven1よりはましな使い方だとは思う。ViewのTemplate(ロジックではなくて)としてつかうのでVelocityと同じだと思えばよいだろう。
  • javascriptが有効じゃないとプロジェクトの設定を変えたあと保存時にエラーになる。まあ有効にしろってことだと思いますが。
  • プラグイン開発者の向けのドキュメントがもうちょっと多いといいなー(特に https://stapler.dev.java.net/ を勉強するのが面倒だ)。

hudson skype plugin

つくって見ようとおもった契機


いままで自前のバッチファイルでmvnして結果をチームのskypeに流していた(http://d.hatena.ne.jp/udagawa/20071102#p1)。
hudsonが便利なのと自分のマシンにしかCI環境がないのはいまいちなのでhudsonに移行することにした。
skype通知プラグインがないかなと
http://hudson.gotdns.com/wiki/display/HUDSON/Plugins
みたけど skype という文字がなかったので作ってみることにした。

実際に作ってみた


まずhudsonのプラグインを作り方を
http://d.hatena.ne.jp/fits/20080502/1209726765
で学ぶ。hello worldレベルのものはすぐにできた。


次にどうやって作るか考えた。
すでにskype通知の部分はGroovyでおこなっていたのと
pluginを固めてdeployするのは面倒だと思ったので
hudsonからGroovyのスクリプトを呼ぶ出す方式にすることに決めた。
hudsonは内部でgroovyを使っているのでたぶん大丈夫だろうと。


hudson自体にきちんとライブラリがあったので呼び出す部分はすぐにできた。
hudsonのWebの画面の作り方はいまいちよくわからないのでかなり適当に他のプラグインのソースをコピペーして作る。


できた画面はこんな感じ

ファイルはとりあえずここにおいておきます。
http://uda.up.seesaa.net/dev/skype.hpi
%HUDSON_HOME%\plugins におけば動きます。確認したhudsonのバージョンは2009/02/15最新の1.283。
特にhudsonのバージョンによってうごかないということはないと思います。

うまくうごけば
%HUDSON_HOME%\plugins\skype\WEB-INF\classes\hudson\plugins\skype
にgroovyのスクリプトが入っているのでhudson起動中でもスクリプトを変更してかえることができます。
Java側を触るのは仕組みを作ったあとはgroovyのスクリプトに渡したい設定項目をWebに追加する時だけでした。

最初のアクセス時に「SkypeAPIをつかってSkypeにアクセスするけどいいのか」というメッセージがでるのでOKにする必要がある。

Skype Build Status


ビルドの状況をムードメッセージに表示するもの。

Skype Build Error


ビルドに失敗した時にチャットにメッセージ送信するもの。
Chat Nameはskypeのチャットの名前
Error Stringはエラーの文字列を正規表現で指定。たいていはdefaultで大丈夫だとおもうけど
MSBuildC#のビルドエラーが日本語ででるのでかえないとだめ。

Skype Test Error


JUnitReport形式(xxx.xml)を解析して失敗しているときにチャットにメッセージ送信するもの。


ためしたパターンは


NUnitPHPUnitは実運用でつかっていないのでうまくいかないことがあるかも。
JUnitReport形式に変換してくれるやつはたぶんどのUnitTestでも問題ないだろう。
NUnitはなぜか独自形式なのでNUnit Pluginのxslを拝借してJUnit Reportの形式に変換したものを使うようにしてある。
(NUnit Pluginの変換結果を使いたかったがNUnitPluginが動いた後にこいつを動かすようにする設定がよくわからなかったので)


テストに失敗するとこんな感じのメッセージが飛んでくる。

[build-ant]Test Error
hoge.String2Test.test_fail
junit.framework.ComparisonFailure: expected:<test2> but was:<test>
 at hoge.String2Test.test_fail(String2Test.java:11)
 
[build-mvn]Test Error
hoge.String2Test.test_fail
junit.framework.ComparisonFailure: null expected:<test[2]> but was:<test[]>
 at junit.framework.Assert.assertEquals(Assert.java:81)
 at junit.framework.Assert.assertEquals(Assert.java:87)
 at hoge.String2Test.test_fail(String2Test.java:15)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Meth...

[build-flex]Test Error
StringTest.test_fail
expected:<test> but was:<test2>

[build-phing]Test Error
.test_fail
test_fail(String2Test)
Failed asserting that two strings are equal.
expected string <test>
difference      <    ?>
got string      <test2>

C:\dev\hudson-1.283\.hudson\jobs\build-phing\workspace\build-phing\hoge\String2Test.php:18
C:\dev\php-5.2.8\PEAR\phing\tasks\ext\phpunit\PHPUnitTestRunner.php:9...

[build-nunit]Test Error
unittest.hoge.String2Test.TestFail

MESSAGE:
  Expected string length 5 but was 4. Strings differ at index 4.
  Expected: "Test2"
  But was:  "Test"
  ---------------^

+++++++++++++++++++
STACK TRACE:
場所 unittest.hoge.String2Test.TestFail() 場所 c:\dev\hudson-1.283\.hudson\jobs\build-nunit\workspace\unittest\hoge\String2Test.cs:行 25

問題点

Linuxで動かない(たぶんMacでも)


skype通知のライブラリ(Skype4java:http://skype.sourceforge.jp/)Windows, Linux, Mac でうごくことになっているがLinuxでは動かず。Macはマシンがないので試せず。
hudsonの問題ではなくてSkype4Javaの使い方の問題だと思われるが調べるのが面倒なので放置。

started
Updating http://localhost/svn/trunk/program/java/build-mvn
At revision 6087
no change for http://localhost/svn/trunk/program/java/build-mvn since the previous build
Parsing POMs
FATAL: com.skype.connector.linux.LinuxConnector.init(Ljava/lang/String;)V
java.lang.UnsatisfiedLinkError: com.skype.connector.linux.LinuxConnector.init(Ljava/lang/String;)V
  at com.skype.connector.linux.LinuxConnector.init(Native Method)
  at com.skype.connector.linux.LinuxConnector.init(LinuxConnector.java:68)
  at com.skype.connector.linux.LinuxConnector.initialize(LinuxConnector.java:114)


WEB-INF/lib には libJSA.jnilib, libJSA.so, skype_linux.jar swt-win32-3232.dll x86-3.3.0-v3346.jar をいれてみたがだめだった。

Windowsでサービス上で動かない


hudsonをservice wrapperで動かすとskype4javaがうまく動かない(Vistaで試した)。
hudsonがWindowsのserviceに対応するようになったのでそれをつかってみたがやっぱり動かない。


なのでWindows上で常にコマンドプロンプトが動いていることになります。。。

今後

仕事が忙しかったので公開が遅くなってしまった。。。
問題点を直してからにしたかったってのもあるがそれだといつまでも公開できないので。。。

今後の予定

  • できれば本家に取り込んでもらう。java.netのidは udagawa です。
  • できれば問題点を解消したい
  • MSTest, MbUnit, TestNG, flex-mojos, as3unitなど他のUnitTestとレポートの形式の検証。
  • スクリプトの中のクラスをファイルにきちんとわけたい。hudsonからの呼び出し時にクラスパスを設定できればいいだけなはずだけど方法がいまいちわからなかった。
  • 使う人が多いようであればいんちきな英語をきちんと直す。
  • リソースの日本語化