Unity Cloud Buildのビルド結果をHipChatに通知するには

## はじめに
この記事は[Unity 2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity2)の24日目の記事です。
[以前の投稿](http://qiita.com/murapong/items/b0ae10cbb6be7d5b4cd4)でUnity Cloud Buildのビルド結果をSlackに通知する方法を紹介しましたが、他のチャットツールでもUnity Cloud BuildのWebhookを利用することで同様のことを実現することが可能です。（ただし、チャットツール側のWeb APIが利用可能であることが条件）
今回は[Atlassian社](https://ja.atlassian.com/)の[HipChat](https://ja.atlassian.com/software/hipchat)にUnity Cloud Buildのビルド結果を通知する方法を紹介したいと思います。

## 前提条件
* Unity Cloud Buildの基本設定が完了していること
* HipChatのアカウント/チームを作成済みであること
* PHPが動作するサーバの準備が完了していること

## 設定方法

### HipChatの設定
HipChatに通知するために通知先のroomの作成／設定をします。なお、手順はアプリ版、Web版ともほぼ変わらないため好みの方から操作してください。

HipChatの左側にある「Create a room」をクリックし、通知先のRoomの情報を入力します。今回はRoom名を「Unity Cloud Build」としておきますが、任意のRoom名でかまいません。「Room name」を入力したら「Create room」ボタンをクリックします。

![Kobito.0odzRm.png](https://qiita-image-store.s3.amazonaws.com/0/5879/44ba2570-f400-d15a-8f3a-6b7ea84acd2f.png "Kobito.0odzRm.png")

上記の手順で作成したRoomの右側にある「Add integrations」をクリックします。

![Kobito.kSO9bp.png](https://qiita-image-store.s3.amazonaws.com/0/5879/b231f736-0f0b-76ae-776c-e3f74b54679d.png "Kobito.kSO9bp.png")

Unity Cloud Build用のカスタムインテグレーションを作成するために、画面左上にある「Build your own integration」をクリックします。

![Kobito.GC4jFf.png](https://qiita-image-store.s3.amazonaws.com/0/5879/581c02b5-f901-6e96-5b0c-54047ac36721.png "Kobito.GC4jFf.png")

カスタムインテグレーション用の名前を入力し「Create」ボタンをクリックします。今回は「Unity Cloud Build」としておきますが、任意の名前でかまいません。

![Kobito.b41yfC.png](https://qiita-image-store.s3.amazonaws.com/0/5879/f520027e-0582-dacc-3452-8101bc22a015.png "Kobito.b41yfC.png")

インテグレーションが正しく設定されていることを確認するために画面中央にある「Try it!」ボタンをクリックしてみましょう。（すぐ上にあるcurlコマンドでも確認できます）

![Kobito.POHzNW.png](https://qiita-image-store.s3.amazonaws.com/0/5879/9fb51b88-e75a-0b7c-25e2-11d99b1f9314.png "Kobito.POHzNW.png")

設定が正しく完了していれば以下のようにHipChatに通知されます。

![Kobito.3QTiZh.png](https://qiita-image-store.s3.amazonaws.com/0/5879/55323e50-c0f2-425c-98df-d13a977c40e0.png "Kobito.3QTiZh.png")

ここまででHipChatの設定は完了です。<b>「Send messages to this room by posting to this URL」に表示されているURLは後の手順で使用するため控えておいてください。</b>

![Kobito.V49yeS.png](https://qiita-image-store.s3.amazonaws.com/0/5879/1cb62a44-341b-3413-0b74-a54b32470e14.png "Kobito.V49yeS.png")

### PHPスクリプトのデプロイ
[Unity Cloud Buildから送られてくるデータをHipChatに通知するためのPHPスクリプト](https://github.com/murapong/ucb2hc/blob/master/src/ucb2hc.php)を準備しておきました。PHPが動作するサーバ上にデプロイしてください。

```php
<?php
$url = 'YOUR HIPCHAT ENDPOINT';

// Get ’X-UnityCloudBuild-Event' http header
$event = $_SERVER['HTTP_X_UNITYCLOUDBUILD_EVENT'];

switch ($event) {
    case 'ProjectBuildQueued':
        $color = 'yellow';
        $title = 'Build queued';
        break;
    case 'ProjectBuildStarted':
        $color = 'yellow';
        $title = 'Build started';
        break;
    case 'ProjectBuildRestarted':
        $color = 'gray';
        $title = 'Build restarted';
        break;
    case 'ProjectBuildSuccess':
        $color = 'green';
        $title = 'Build success';
        break;
    case 'ProjectBuildFailure':
        $color = 'red';
        $title = 'Build failed';
        break;
    case 'ProjectBuildCanceled':
        $color = 'gray';
        $title = 'Build canceled';
        break;
    default:
        $color = 'red';
        $title = 'Unexpected event';
        break;
}

$json_string = file_get_contents('php://input');
$obj = json_decode($json_string);

$project_name = $obj->projectName;
$dashboard_project = $obj->links->dashboard_url->href . $obj->links->dashboard_project->href;
$build_target_name = $obj->buildTargetName;
$dashboard_log = $obj->links->dashboard_url->href . $obj->links->dashboard_log->href;
$build_number = $obj->buildNumber;
$platform = $obj->platform;
$started_by = $obj->startedBy;

// format message
$message = <<<EOM
<table>
<tr>
  <td>
    <b>$title</b><br>
    <a href="$dashboard_project">$project_name</a> - <a href="$dashboard_log">#$build_number</a><br>
  </td>
  <td>
    <b>Target</b><br>
    $build_target_name
  </td>
</tr>
<tr>
  <td>
    <b>Platform</b><br>
    $platform
  </td>
  <td>
    <b>Started By</b><br>
    $started_by
  </td>
</tr>
</table>
EOM;

$data = array(
    'color' => $color,
    "message" => $message,
    'notify' => true,
    'message_format' => 'html',
);

$content = http_build_query($data);
$options = array('http' => array(
    'method' => 'POST',
    'content' => $content
));

$contents = file_get_contents($url, false, stream_context_create($options));
```

<b>2行目の'YOUR HIPCHAT ENDPOINT'の部分はHipChatの設定の最後の手順で控えておいたURLに変更してください。</b>

```php
$url = 'YOUR HIPCHAT ENDPOINT';
```

### Unity Cloud Buildの設定
プロジェクトのCloud Buildのページにある「Notifications」タブをクリックします。

![Kobito.xkKPmb.png](https://qiita-image-store.s3.amazonaws.com/0/5879/9b5ea5b8-525b-5688-f23e-6cf8f2d60ec5.png "Kobito.xkKPmb.png")

画面右側にある「Add New」ボタンをクリックし、Webhookの設定を行います。

![Kobito.V3hOyc.png](https://qiita-image-store.s3.amazonaws.com/0/5879/85460c58-6c1e-8245-d626-a5d40263ac07.png "Kobito.V3hOyc.png")

URLにPHPスクリプトのデプロイ先を入力し「Next: Save →」をクリックします。

![Kobito.nfR4ui.png](https://qiita-image-store.s3.amazonaws.com/0/5879/e15ddb8c-d68f-0380-7e00-2842037d2c46.png "Kobito.nfR4ui.png")

なお、サポートされている通知イベントは以下の通りです。必要に応じて調整するようにしましょう。

| イベント | トリガ条件 |
|--------------------|--------------------|
| ProjectBuildQueued    | ビルドがキューに入ったとき |
| ProjectBuildStarted   | ビルドが開始されたとき |
| ProjectBuildRestarted |	 内部エラーが発生し、ジョブがリスタートされたとき |
| ProjectBuildSuccess   | ビルドが正常終了したとき |
| ProjectBuildFailure   | ビルドが異常終了したとき |
| ProjectBuildCanceled  | 実行中のビルドがキャンセルされたとき |

画面右上の「ビルド開始」ボタンをクリックするとビルドが始まります。
![Kobito.pC4ilK.png](https://qiita-image-store.s3.amazonaws.com/0/5879/a8f76b75-c378-61c9-9138-d842218b2b64.png "Kobito.pC4ilK.png")

設定が正しく完了していれば、以下のようにHipChatに通知されます。
![Kobito.N0oOiN.png](https://qiita-image-store.s3.amazonaws.com/0/5879/b43e72cf-7416-5b49-9126-83f780b2d103.png "Kobito.N0oOiN.png")

なお、通知する内容はUnity Cloud BuildのSlack通知に似せて作ってみましたが、PHPスクリプトを修正することでカスタマイズ可能です。
![Kobito.Olt8SM.png](https://qiita-image-store.s3.amazonaws.com/0/5879/1c064316-b2d2-3e11-e621-be561fba2491.png "Kobito.Olt8SM.png")

## 参考
* [WEBHOOKS AND SLACK NOTIFICATIONS IN UNITY CLOUD BUILD](https://blogs.unity3d.com/jp/2016/09/07/webhooks-and-slack-notifications-in-unity-cloud-build/)
* [Unity Cloud Buildのドキュメント](https://build-api.cloud.unity3d.com/docs/1.0.0/index.html#operation-webhooks-intro)
* [UCB2HC (GitHubのリンク)](https://github.com/murapong/ucb2hc)