HipChat で CI する

チャットツールと CI ツールを連携させることでより柔軟な運用を行えます。例えば、HipChat から Jenkins のジョブを実行し、その結果を HipChat に通知させる。日々、チーム内のコミュニケーションツールの1つとして利用しているチャットツールから CI できれば、誰もが楽に状態を把握できます。また、問題があった場合のキャッチアップも早くなります。

使ったもの

  • Mac
  • Hubot
  • HipChat
  • Jenkins

※ Hubot と HipChat についてはこちら→ Hubot と HipChat で ChatOps を参照

Jenkins のジョブ実行結果を HipChat に通知

HipChat API トークンの取得 

HipChat に通知させるには API トークンが必要です。API トークンは HipChat の「Group admin」→「API」から取得できます。Type は Admin と Notification 2種類あります。(Admin はチームに関するすべての API へアクセスが許可され、Notificaion はルームにメッセージ送信のみ許可されています。)Label は自由にです。

f:id:tunanosuke:20141117004819p:plain

Create で API トークンが作成されます。

f:id:tunanosuke:20141117014021p:plain

HipChat プラグインをインストール

Jenkins には HipChat と連携するための HipChat プラグインがあります。それをインストールし Jenkins に先程作成した API トークンを登録することで Jenkins と HipChat  が連携できます。Jenkins の「プラグインの管理」からインストールします。

インストールできたら「システムの設定」で API トークンを登録します。Global HipChat Notifier Settings に API Token とルーム名と Jenkins の URL を設定すれば OK です。

f:id:tunanosuke:20141117011241p:plain

ジョブに HipChat の設定を追加

HipChat プラグインが正しくインストールされていれば、ジョブの設定に HipChat Notifications という項目が追加されています。対象のルーム名を入力します。Start Notification にチェックを入れるとジョブ開始時にも通知されます。

    f:id:tunanosuke:20141117012549p:plain

最後に、ジョブの設定の「ビルド後の処理」でも HipChat Notifications を追加すれば、ジョブの実行結果を HipChat に通知してくれます。

    f:id:tunanosuke:20141117013050p:plain

これで、HipChat にジョブの実行結果を通知する設定が整いました。対象のジョブを実行すると、

f:id:tunanosuke:20141117013826p:plain

ジョブの実行結果 Success という通知がくるようになります。

HipChat から Jenkins のジョブを実行

ジョブの実行結果を通知できるようになりましたが、ここでは HipChat からの命令を Hubot でスクリプト解析し Jenkins のジョブを実行させます。Hubot と HipChat は連携されている前提で、ジョブを実行するスクリプトを用意します。

Jenkins ジョブ実行用のスクリプト

module.exports = (robot) ->
robot.respond /jenkins (.*)/i, (msg) ->
config =
url: 'http://localhost:8080'
job = msg.match[1]
msg.send "ジョブ「#{job}」を実行します。"
robot.http("#{config.url}/job/#{job}/build").get() (err, res, body) ->
## 必要な処理を記述

このスクリプトは Hubot に対して {Jenkins ジョブ名} とメッセージが送られた場合に msg.match[1] でジョブ名を変数 job につめ実行させています。ジョブ実行のメッセージを送ると以下のような応答があります。実行結果も Success と通知されています。

f:id:tunanosuke:20141117015832p:plain

 

 チーム状態に関する情報をチャット上に集約できれば、今どんな動きがあってどこに問題があるのか把握しやすくなります。CI だけでなくクラッシュの情報なども確認できれば、より改善までのサイクルも早くできると思います。