Hudson APIでジョブを一発コピー
メリー苦しみます!性なる夜のクリスマスイブでも特に予定がないikikkoです、こんばんは。みなさん、いかがお過ごしでしょうか。
滑るような前置きはさておき、本題に入りましょう。今日は、HudsonのRemote Access APIとそれを使ったちょいプログラムを紹介したいと思います。
APIの概要
Hudsonの特徴といえば親切すぎるほどのGUIですが、実はCLI(コマンドラインインターフェース)やAPIも付いています。HudsonでどんなAPIが使えるかは、Hudson上の各URLの末尾に"API"を付けてやると分かります。
例えばジョブ一覧画面の
で使えるAPIは
を叩くと判断できます。「Create Job」や「Copy Job」「Restarting Hudson」ができるみたいですね。
プログラムの概要
HudsonではGUI上で楽にコピーを行えるのですが、コピーしてもまんま使うというわけにはいかないですよね。最低限、リポジトリのURLなどは変更する必要があるかと思います。あとは、プロジェクト名を含んだパスを使用する設定がある場合。*1
ということで、APIを使ってジョブをコピーしてその辺の設定も合わせて変えてくれるプログラムを組んでみました。ソースコードはこちらに置いてます*2。
メインフローはこんな感じになります。
- テンプレートとなるジョブをコピー
- コピーされたジョブを有効化
- コピーされたジョブ設定で、適切な箇所を置換する
プログラムで表すと↓な感じ。
public void run(String[] args) throws Exception { // 引数のパース parseArgs(args); // Hudson APIの実行 client = new DefaultHttpClient(); copyJob(srcJob, dstJob); enableJob(dstJob); replaceJobSetting(dstJob); client.getConnectionManager().shutdown(); // ブラウザオープン Desktop.getDesktop().browse(new URI(hudsonUrl + "job" + "/" + dstJob + "/")); }
引数のパース
別にちょいプロなんで何使ってもいいんですが、args4jが気になっていたので、これを使ってみました。引数無しで実行すると、以下のようにヘルプメッセージが出ます。
org.kohsuke.args4j.CmdLineException: Option "-d" is required USAGE: java CopyHudsonJob -d dstJob -s srcJob -u URL -d dstJob : コピー先ジョブ -s srcJob : コピー元ジョブ -u URL : HudsonのURL
HudsonのURLとコピー元ジョブはソースコードにデフォルト値を指定しているのでいいんですが、コピー先ジョブだけは必須なので、こんなメッセージが出ます。"-d XXX"のように、引数で指定してあげましょう。
ジョブのコピー
あらかじめ、コピー元となるジョブを以下のように作っておきます。ここでは、後で置換対象となる文字列を"%PROJECT%"として埋め込んでいます。あと、このコピー元のジョブはビルド実行される必要がないので、念のため無効化しておきましょう。
で、このジョブをAPI経由でコピーするには、以下のURLにPostリクエストします。
パラメータは3つ指定。
- name=NEWJOBNAME
- mode=copy
- from=FROMJOBNAME
(以降、コピー元ジョブを"templateJob"、コピー先ジョブを"helloCopyJob"として進めます)
ちなみに、ジョブをビューで管理されている方も多いでしょうが、コピーだとビューまで反映することができません。ビュー名を性器表現にかけて一致したものをビューに含めるという機能があるので、ビュー名を工夫すればこれには対応できるでしょう。