Jenkins casual notification using Remote access API

はじめに

このエントリは Jenkins Advent Calendar jp 2011 の21日目分です。

はてなダイアリーで書くのが流行っているようですが、あえてのはてなブログからお送りします。

今日は、ビルド結果の通知とリモートアクセスAPIの組み合わせについて話します。

Jenkinsの通知処理

Jenkins は各種プラグインが揃っており、そのうちの幾つかはこのアドベントカレンダーでも紹介されています。通知系のプラグインも IRC Plugin や Growl Plugin, Skype Plugin など色々揃ってますね。これらを使えば、ジョブのビルド結果をいろんな手段で通知させることができます。

これら通知系のプラグインを使っていると、メッセージをカスタマイズしたくなると思います。私はなりました。Growl などはデフォルトでもいいのですが、IRC 通知の場合、ビルド結果で色やメッセージを適切に変えたくなります。

こういうときはどうすればいいのでしょうか。JavaJRuby で通知系のプラグイン、例えば IRC2 Plugin みたいなものを作るのでしょうか。それはコストがかかりすぎるので無いですね。

それでは別の手を考えましょう。IRC で通知するというお題で話を進めているわけですが、IRC を開発ツールとして活用されている方は、Ikachan のような便利ツールも導入されている場合が多いかと思います。この場合、Web API を使って通知できるので非常に捗ります。

curl -F channel=\#jenkins -F message="Jenkins ($JOB_NAME): $BUILD_URL" http://example.com/ikachan

こんな感じで Web APIcurl とかでカジュアルに叩いてやれば通知できちゃいますが、ここで問題が2つほどあります。

  1. Jenkins のビルド後の処理で、上記のような任意コマンドを実行するにはどうすればよいか
  2. 実行できたとして、その中でジョブが成功したか失敗したかのステータスをどうやって取得できるか

まず 1. ですが、これは Post build task を使えば実現できます。このプラグインを導入すると、ビルド後の処理に "Post build task" が選択できるようになり、"Script" 欄に直接シェルスクリプトが書けます。なお、このスクリプト中ではビルド時と同様の環境変数が使えるので、JOB_NAME や BUILD_URL などビルド結果の通知に役立ちそうな値が利用可能です。

さて、前述のスクリプトでは、ビルド結果が SUCCESS なのか FAILURE なのか ABORTED なのかわからないので、まだそこまで便利ではありません。というわけで、2. をどうにかして解決してステータスを取得したいわけです。

ここでリモートアクセスAPIの出番です。Jenkins のリモートアクセス API にはいくつか種類がありますが、ジョブ用のAPIだってもちろん存在します。このAPIを使ってデータを取得すると、実はステータスがわかります!

<mavenModuleSetBuild>
  <action>...</action>
  ...
  <result>SUCCESS</result>
  ...
</mavenModuleSetBuild>

${BUILD_URL}api/xml (/job/{jobName}/lastBuild/api/xml みたいなURL) にアクセスすると、上記のような結果を XML で取得できます。末尾を /json に変えれば、予想通り JSON で取得できたりもしますが、ここでは割愛します。

XML API の場合、の値がステータスそのものになっているので、これを取り出して通知結果に入れてやると、以下のような感じで2行で書けちゃいました!

RESULT=`curl ${BUILD_URL}api/xml | perl -le '$_=<>;print [/<result>(.+?)</]->[0]'`
curl -F channel=\#jenkins -F message="Jenkins ($JOB_NAME): $RESULT - $BUILD_URL" http://example.com/ikachan

簡単でいいですね。でもこれだと色が単一で面白くありません。やはり red-green 的な色の変化はつけたいところなので、SUCCESS なら緑、FAIURE なら赤、ABORTED なら黄色、みたいに結果に応じて IRC 用の色コマンドを埋め込んで通知しちゃいましょう。

RESULT=`curl ${BUILD_URL}api/xml | perl -le '$_=<>;/<result>(.+?)</;printf "\x02\x0301,%02d%s\x0f",{A=>8,S=>3,F=>4}->{substr $1,0,1},$1'`
curl -F channel=\#jenkins -F message="Jenkins ($JOB_NAME): $RESULT - $BUILD_URL" http://example.com/ikachan

1行目がだいぶ長くなりましたが、それでも2行は保ったまま、色まで付いて結果通知できるようになりました!

おわりに

というわけで長くなりましたが、Post build task とリモートアクセスAPIを組み合わせることで、任意の通知をカジュアルにしちゃおう、という一例を示しました。

Post build task プラグインは中々便利で、シェルスクリプトでビルド後処理として任意に書けちゃうわけですから、使い勝手が非常に良いですね。ちなみに、私はビルド処理自体もビルドサポート系のプラグイン(例えば MSBuild Plugin とか Rake Plugin とか)を使わずに、シェルスクリプトかバッチファイル(Windows 用ジョブの時)で書いています。理由は、プラグインだと細かいオプション指定が出来ないことなどがあるからですが、普段からこのような使い方をしている人には、違和感なく使えると思います。

また、リモートアクセスAPIも、ビルド後のフェーズで呼んでやると、ちゃんと今実行したばかりのジョブ結果も普通に取れちゃったりして、中々スグレモノです。データさえ取得できれば、あとはどう調理するか次第ですから、拡張の幅が広がりますね。

そんなわけで、最近個人的にオススメの Post build task + リモートアクセスAPI について簡単に紹介しましたが、プロジェクトなど状況にあわせて、カジュアルに拡張していきたいときの一助になれば幸いです。

明日は誕生日(?)の bleis さんです!お誕生日おめでとうございます!お楽しみに!

Yokohama.pm忘年会に行ってきた

気がつけば半年以上ブログ書いていませんでした。こんにちは。AM 03:00です。

今年は、YAPCも行かず裏で北海道でHYのライブハウスツアーに行ってたり、Shibuya.pmも当日キャンセルするなど散々でしたが、最後の最後に忘年会だけは参加できました。そんなこんなで、1年以上ぶりに会う人ばかりでした。

個人的なトピックを抜粋すると

  • tomyhero さんに金払わされた
  • bayashi さんにはまっこカードを委譲する
  • zigorou さんに説教された
  • yusukebe さんありがとう、パパによろしく

などなど。楽しかったです。

2011年もよろしくお願いします。

「Webを支える技術 -HTTP、URI、HTML、そしてREST」

本日発売になりトークセッションも行われたこの本ですが、ご縁があってレビュアをさせていただきました。

第1部のものすごく濃いWeb概論、第2〜4部ではWeb構成要素の詳しい解説と、もうこれだけでお腹いっぱいの内容なのですが、個人的一番好きなのは第5部です。シンプルな題材ですが、CRUD可能なWebサービスAPIを実際に設計していくケーススタディな構成になっていて、こういう場面ではこういうステータスコードを使うといった具体的TIPSが気を抜くと見逃しそうな勢いで書かれています。

この設計指針を示した部分からは、「WebサービスとWebAPIを分けて考えない」という著者の強い想いを感じるとともに、著者の今までの知見と経験で作り上げた設計指針を伺い知る事ができ、いわゆるRESTfulな設計の参考として必読です。

t_wadaさんも書かれていますが、私も本書はこれからの定番本の1つになるものだと思っています。ここ数年ほど、会社の部署の新人や初めてWeb開発に携わる人に、まさしく本書の内容をかいつまんだ感じの資料で説明する機会がよくあったのですが、今度から「これ読め」で済ませようかと思います。

ありがたいことに献本いただきましたので、週末にあらためて読み返したいと思います。あと筆ペンでサインください。

Yokohama.pm #5 に参加しました

2010-03-05にいつもの技能文化会館にて開催されたYokohama.pm #5に参加してきました。当日の内容は例によってid:hirataraさんの日記に詳しくまとまっています。

ちなみにid:ZIGOROuさんのトーク中で軽く触れていたMySQLのパーティショニングについてよくまとまっているというブログはこちらですね。

自分のトーク予定は無かったのですが、最後に飛び込みで「Webを支える技術」本の告知LTをさせていただきました。

今回自分はレビューアの一人としてこの本に関わらせてもらいました。そんなこんなで急遽告知してみたわけですが、トークでも話したとおり、この本はRESTで有名な筆者が送り出す渾身の1冊だと思います。Webの基本構成技術の説明に始まり、Webらしいプラクティスを交えた設計の話まで、Web開発者にとって必読書の1冊になるのではないでしょうか。

あと告知で言い忘れた話ですが、4/8の発売日にジュンク堂書店池袋店でトークセッションを行います。まだ席に余りがあるので、ご参加お待ちしておりますとのことです。

今日の出来事

あけましておめでとうございます。たまには雑記を。

今日は仕事でid:segawabikiさんとお会いしました。4コマ漫画が面白くて毎日読んでます。

直接お話したのは実に3年ぶりくらいだったのだけど、相変わらず若くて熱いおじさんで安心しました。

別件があって途中参加だったのと、体調がちょっと悪くて飲みも行けなかったので、今度改めてゆっくり話したいな。というわけでそのうち飲みに誘いたいと思います。