Titanium SDK の Continuous Builds の通知を Slack で受け取る

[Appcelerator Continuous Builds](http://builds.appcelerator.com.s3.amazonaws.com/index.html) で情報を取得することはできるけれど、毎回見に行くのはしんどい。勝手に Slack へ通知して欲しいってことで、Heroku の Heroku Scheduler で毎時監視して、最新のビルドを通知させる。

どうでもよい事なんですけど、ぼくはブラウザのブックマークを使わない人間なので、今必要な情報はブラウザのタブで常に開きっぱなしなんですよね。終わったらタブを閉じて綺麗サッパリ。で、今回の Appcelerator Continuous Builds とかはいつも常に開きっぱなしで、（Chrome なので）パソコンのメモリを使い続けているから勿体ないんですね。まあ、そういうどうしようもない理由でこれを作りました。

### 準備

1. Heroku で cedar スタックを作る
2. Heroku Scheduler と Heroku Redis :: Redis アドオンをインストール
3. Slack でチャンネル作って Incoming WebHooks の URL を作っておく
4. プロジェクトフォルダを作って、```$ npm init```
5. ```$ npm install lodash node-slack redis request --save``` で必要なパッケージをインストール

### ソースコード

どこかのテストフレームワークで見たようなファイル名ですが...。テキトーに書いちゃったので、修正したい所があればご自由にどうぞ。

#### bin/drillbit

```bash
#!/usr/bin/env node
require('../src/drillbit');
```

#### src/drillbit.js

```js
var _ = require('lodash'),
	redis = require('redis'),
	request = require('request'),
	slack = require('node-slack'),
	url = require('url');

var client;

function send(latest) {
	var webhook = new slack('※※※※※ Slack の Incoming WebHooks URL ※※※※※');

	webhook.send({
		text: '*Incoming the new version <http://builds.appcelerator.com/mobile/master/mobilesdk-' + latest + '-parity.html>*\n' +
			'```$ ti sdk install --branch master ' + latest + '```',
		channel: '※※※※※ 通知を受けたい Slack のチャンネル名 ※※※※※',
		username: 'Titanium SDK'
	});
}

function fetch(latest) {
	request.get('http://builds.appcelerator.com/mobile/master/index.json', function(error, response, body){
		if (error) {
			return;
		}

		var json = JSON.parse(body),
			versions = [],
			notifies = [],
			detect = false;

		_.each(json, function(item){
			var version = item.filename.split('-')[1],
				timestamp = parseInt(version.split('.')[3].replace('v', ''), 10);

			if (_.indexOf(versions, timestamp) === -1) {
				versions.push(version);
			}
		});

		versions.sort(function(a, b){
			return parseInt(b.split('.')[3].replace('v', ''), 10) - parseInt(a.split('.')[3].replace('v', ''), 10);
		});

		if (latest) {
			if (parseInt(versions[0].split('.')[3].replace('v', ''), 10) >
				parseInt(latest.split('.')[3].replace('v', ''), 10)) {
				detect = true;
			}
		} else {
			detect = true;
		}

		if (detect) {
			if (client) {
				client.set('version', versions[0], function(error, data){
					if (error) {
						return;
					}

					send(versions[0]);
				});
			} else {
				send(versions[0]);
			}
		}
	});
}

if (process.env.REDIS_URL) {
	var parsedurl = url.parse(process.env.REDIS_URL);

	client = redis.createClient(parsedurl.port, parsedurl.hostname);
	client.auth(parsedurl.auth.split(':')[1]);

	client.get('version', function(error, latest){
		if (error) {
			return;
		}

		fetch(latest);
	});
} else {
	fetch(null);
}
```

### テストしておきましょう

ローカルでテストできます。その場合 Redis の箇所が無視されるので、常に最新のビルドが Slack へ通知されます。

```bash
$ node bin/drillbit
```

### スケジューラの設定

Heroku へプッシュしたら、Heroku Scheduler の設定をします。スケジューラのダッシュボードで、こんな感じでどうぞ。10分毎にすると無料枠突破しちゃうかもですから、毎時ですね。毎時ならスリープすることもないですし。

![スクリーンショット 2015-09-02 8.50.41.png](https://qiita-image-store.s3.amazonaws.com/0/47686/d4328c1f-d797-4369-c1b6-03d1d04f33c6.png)

### 通知きましたか？

初回は最新のビルドが Slack へ通知されます。アイコンとかいじっておくと良いですよ！

![スクリーンショット 2015-09-02 8.53.53.png](https://qiita-image-store.s3.amazonaws.com/0/47686/888e90aa-84ef-1a23-2488-8340a7bb2535.png)

ちなみに、リンク先は Titanium API の実装状況を見ることができます。このページ知っていました？