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


Appcelerator Continuous Builds で情報を取得することはできるけれど、毎回見に行くのはしんどい。勝手に 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

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

src/drillbit.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 へ通知されます。

$ node bin/drillbit

スケジューラの設定

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

通知きましたか?

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

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