[iOS 8/Xcode 6] BotsでCIしよう(4) – 新機能として追加されたTriggersで成功/失敗をチャットツールに通知する

はじめに

Xcode 6からBotsを設定する際にTriggersという項目が追加されました。
Jenkinsなどでは既によく使われていますが、Integrationの前後にスクリプトを挟み込む事ができるようになりました。例えば、ビルド前にパッケージ管理ツールで依存ファイルをダウンロードしたり、いつも使っているチャットツール(APIが用意されていれば)に通知したりTestFligtでβ版のアプリを自動的に配布することができます。

スクリプト内で使える環境変数

一番知りたい情報はどのIntegrationが成功/失敗したかですよね。それとそれに付随したエラーのカウントなどの情報が環境変数として取得できます。(WWDCのビデオから拾ったので、他にもあるかもしれません。どこかに書いてあるんでしょうか。)

  • XCS_BOT_NAME:ボット名
  • XCS_INTEGRATION_NUMBER:Integration毎にインクリメントされる固有の番号
  • XCS_INTEGRATION_RESULT:Integrationの結果
  • XCS_TEST_FAILURE_COUNT:UnitTestがFailureになった個数
  • XCS_ERROR_COUNT:Build Errorの個数
  • XCS_WARNING_COUNT:Warningの個数
  • XCS_ANALYZER_WARNING_COUNT:AnalyzerでWarningになった個数

設定

Botの作成時又は編集時に設定可能です。 
Report NavigatorのBotのコンテキストメニューか設定ボタンからCreate Bots又はEdit Botsを選択します。
edit_bots
設定のウィザード画面を最後のページまで進むとConfigure bot triggers:画面にたどり着きます。
bots_settings
そこでBefore Integration又はAfter IntegrationのAdd Trigger -> Run Scriptを選択します。するとテキストエリアが出現するので、そこに思いの丈をおもいっきりぶちまけます。いや、スクリプトを書きます。

 

今回書いたのはChatWork向けのRubyスクリプトです。

#!/usr/bin/env ruby
require 'json'
require 'net/http'
require 'uri'
 
uri = URI.parse("https://api.chatwork.com/v1/rooms/<ルームID>}/messages")
body = "[info][title]#{ENV['XCS_BOT_NAME']}より[/title] ##{ENV['XCS_INTEGRATION_NUMBER']}の結果 : #{ENV['XCS_INTEGRATION_RESULT']}[/info]"
request = Net::HTTP::Post.new(uri.request_uri, initheader = {'X-ChatWorkToken' => "<APIトークン>"})
query_hash = {"body" => body}
request.set_form_data(query_hash)
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') {|http|
  http.request(request) 
}

結果の表示

Botの名前、Integration番号、結果の3つが表示されています。これにエラー時のカウントや箇所、バージョン管理システムのコミットコメントが取得出来れば、必要な情報が足りそうです。
chatwork

まとめ

スクリプトを書けるようになったことでCIツールとしての価値と自由度が大きく向上した結果になりした。さすがにAndroidやサーバーサイドのアプリまで面倒は見てくれませんが、iOSやMacアプリのビルド時にAppleの外の世界との連携が可能になり、より使えるツールに成長しました。
iOSやMac OSを専門でやっている生粋のApple信者な人は導入してみてはいかがでしょうか。