Hudson CLIとGroovy shell

GUIから何でも出来る」というのはHudsonの大事なウリの一つなのですが、その一方、自動化やスクリプトを書くために、コマンドラインインターフェース(CLI)が便利な局面と言うのは結構あります。HudsonにはREST APIがついてはいますが、これはプログラムを書く人向けで、管理者の自動化などには、汎用RESTクライアントの不足もあって、あまり便利ではありません。そこで、Hudson 1.302から、HudsonにはCLIが追加されました。CLIのjarは、お使いのHudsonのhttp://server/hudson/cliからダウンロードすることが出来ます。また、このページには使い方の簡単な紹介も載っています。


さて、このCLI実装の中身がちょっと面白いので紹介します。CLI自体には、実はコマンドの実装は何も含まれていません。代わりに、マスター・スレイブの間で利用されているJavaエージェントチックなリモート通信フレームワークを使って、マスターから実行時に必要なクラスファイルなどを取得する仕組みになっています。これによって、汎用のCLI1つで、マスターがバージョンアップしようが新しいプラグインが追加されようが、コマンドを実行できるようになります。


また、このリモート通信フレームワークではどの部分をサーバで実行し、どの部分をCLI JVM上で実行するかをコマンド実装が任意にかつ比較的透過的に選択できるので、ネットワークを効率よく利用するコマンドを書くのが簡単になります。


この仕組みを使って、さっそくGroovy shellを実行するコマンドを実装してみました。このコマンドを実行すると、CLI上にサーバの状態をいじれるシェルが出現します。

$ java -jar hudson-cli.jar -s http://yourserver/hudson groovysh
Groovy Shell (1.6.0, JVM: 1.6.0_02-fastdebug)
Type 'help' or '\h' for help.
                                                                                                                                                            • -
groovy:000> import hudson.model.*; ===> [import hudson.model.*;] groovy:000> Hudson.instance ===> hudson.model.Hudson@4b09558d

リモート通信フレームワークのおかげで、このコマンド実装はコメントや空行やimport文も全て入ってたった45行です。このように、コマンドを書くのはとても簡単です。


Groovy shellはインタラクティブなデバッガのようなもので、任意のオブジェクトの任意のプロパティを調べたり、メソッドを呼んだりできます。これを使って、実行中のHudsonサーバの中をいじることができてしまいます。ちょっとしたトラブルシューティングや、プラグインを書く時、またAPIの挙動を調べるのに、とても便利です。例えば、試しにメソッドを呼んでみて、挙動が気に入らなければ、その場でパラメータを変更してもう一度同じAPIを呼ぶことができます。


なお、こういうコマンドがあると便利じゃないの?というような要望をぜひお待ちしています。