Hudson APIでジョブを一発コピー

メリー苦しみます!性なる夜のクリスマスイブでも特に予定がないikikkoです、こんばんは。みなさん、いかがお過ごしでしょうか。

滑るような前置きはさておき、本題に入りましょう。今日は、HudsonのRemote Access APIとそれを使ったちょいプログラムを紹介したいと思います。


APIの概要

Hudsonの特徴といえば親切すぎるほどのGUIですが、実はCLI(コマンドラインインターフェース)APIも付いています。HudsonでどんなAPIが使えるかは、Hudson上の各URLの末尾に"API"を付けてやると分かります。

例えばジョブ一覧画面の

https://hudson.eclipse.org/hudson/

で使えるAPI

https://hudson.eclipse.org/hudson/api/

を叩くと判断できます。「Create Job」や「Copy Job」「Restarting Hudson」ができるみたいですね。

プログラムの概要

HudsonではGUI上で楽にコピーを行えるのですが、コピーしてもまんま使うというわけにはいかないですよね。最低限、リポジトリのURLなどは変更する必要があるかと思います。あとは、プロジェクト名を含んだパスを使用する設定がある場合。*1

ということで、APIを使ってジョブをコピーしてその辺の設定も合わせて変えてくれるプログラムを組んでみました。ソースコードはこちらに置いてます*2

メインフローはこんな感じになります。

  1. テンプレートとなるジョブをコピー
  2. コピーされたジョブを有効化
  3. コピーされたジョブ設定で、適切な箇所を置換する

プログラムで表すと↓な感じ。

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%"として埋め込んでいます。あと、このコピー元のジョブはビルド実行される必要がないので、念のため無効化しておきましょう。
f:id:ikikko:20101224030354p:image

で、このジョブをAPI経由でコピーするには、以下のURLにPostリクエストします。

http://localhost:8080/hudson/createItem

パラメータは3つ指定。

  • name=NEWJOBNAME
  • mode=copy
  • from=FROMJOBNAME

(以降、コピー元ジョブを"templateJob"、コピー先ジョブを"helloCopyJob"として進めます)

ちなみに、ジョブをビューで管理されている方も多いでしょうが、コピーだとビューまで反映することができません。ビュー名を性器表現にかけて一致したものをビューに含めるという機能があるので、ビュー名を工夫すればこれには対応できるでしょう。

ジョブの有効化

↓のURLにポストしてやればおkです(パラメータ不要)。

http://localhost:8080/hudson/job/helloCopyJob/enable

ジョブの設定内容を痴漢

以下のURLにGetすると、ジョブの設定内容(config.xml)が返ってきます。Postしてやると、設定を更新することができます。

http://localhost:8080/hudson/job/helloCopyJob/config.xml

設定内容の更新には、本来ならconfig.xmlを解析して適切な箇所を修正しないといけないのでしょうが、JavaXMLを処理するのはちょっと面倒だったのでパスしました。ここでは、あらかじめ埋め込んでおいた痴漢文字列をreplaceAll()で[%PROJECT% -> helloCopyJob]とすることによって実現します。


今回得たもの

  • Hudson APIの叩き方
  • args4jの使い方
  • HttpClientの使い方
  • ロギング処理についての再復習
  • しょうもないシモネタ

*1:例えば「ビルド後の処理」でJavadocを保存する設定にした場合ですね。Javadocの保存では"**/build/javadoc/"みたいな形式が使用できないので、一般的にはプロジェクト名をパスに含んで"JobName/build/javadoc"必要があります。

*2:他の言語を使ったほうが圧倒的に楽なんでしょうが、色々考えてJavaを選択しますた。