技術と趣味の亜空間

主にゲームプログラミングとその周辺に関する記事を不定期で上げていきます

BotKitでRedmineの本日期日のチケットを毎日Slackに流す

概要

今回はSlack のボットを作るためのフレームワークBotkit」を利用してRedmineの本日期日のチケットを毎日Slackに流してみようと思います。 このBotはサーバーで稼働させるため、herokuの無料プランで動かします。

github.com

jp.heroku.com

準備

  1. RedmineAPIアクセスキーを取得しておく
    管理者(チームではなくRedmine自体の)が設定しないとAPIが使えませんのでご注意を。

  2. Redmineでカスタムクエリを作っておく
    例)

    • 期日が本日
    • ステータスが未完了
    • グループ条件が担当者
  3. カスタムクエリを作ったら、URLを以下のように変換してJSONが取得できることを確認する。
    URL中の yourgroup, hogehoge, fugafuga は適宜環境に合わせて修正して下さい
    from: http://redmine.yourgroup.jp/projects/hogehoge/issues?query_id=fugafuga
    to: http://redmine.yourgroup.jp/projects/hogehoge/issues.json?query_id=fugafuga&key=【①で取得したキー】

  4. RedmineのユーザーIDとSlackのユーザー名の対応表を作っておく
    ここは気合で頑張る

  5. SlackのAPIを登録しておく

Bot作成〜heroku上で動かせるようにするまで

BotKit は Node.js のアプリケーションとして動作するので、そのパッケージマネージャである npm が導入されている必要があります。予め npm コマンドが使える状態を作っておいてください。

その後は下記の記事を読めば読めば容易に実装できます。
[Slack]Botkitをherokuの無料プランで動かす方法 - Qiita

上記事の最後にあるHeroku Schedulerですが、今回は下記の設定にしました。

(seq 0 15;) | grep -qw $((10#`date -u "+%H"`)) && curl http://bot-qururihime-dy9wwbp2qv.herokuapp.com > /dev/null 2>&1

GMT表記で指定するので、時差を考慮して 0 ~ 15(日本時間で9時〜24時)でセット。
FrequencyはEvery 10 minutes にして10分ごとに叩くようにします。

補足:herokuは基本毎月550時間まで無料ですが、クレジットカードを登録するとプラスで450時間、合計1000時間まで稼働無料となります。つまり24h * 31day 動かすと 744h なので、クレジットカードさえ登録すれば1アプリならフル稼働できます(220.6.11時点)。

また、保守管理しやすいようにBotkiのコードは機能ごとにファイルを切り分けました。
切り分け方は下記の記事を参考にしました。
BotkitでHubotみたいにscriptsを読み込む - Qiita

具体的な実装方法は最後のコード全文を見て頂ければと。

Redmineの本日期日チケットを取得する

コーディングに入る前にまずnode.jsでRedmineREST APIを扱うnode-redmineをインストールします。

$ npm install node-redmine --save

インストール後、コード中で以下の通りに宣言することでRedmineの情報を取得できる準備が整います。

const Redmine = require('node-redmine');

var config = {
    apiKey: '******* your API Key *******'
};
var redmine = new Redmine('http://redmine.yourgroup.jp', config);

次にRedmineのユーザーIDとSlackのアカウント名を紐付けます。
とりあえずハードコーティングにしましたが、もっと良い方法をご存知の方はコメントしていただけると幸いです。

次に本日期日をセットしたカスタムクエリに紐づくチケットを取得するのですが、Rest APIを読むと、チケット取得APIに特定のカスタムクエリIDを指定できるオプション引数は存在しないため、自前で実装します。
リクエストを送る書き方はnode-redmineのコードを見て真似します。

// カスタムクエリのIDからそれに該当するチケットを取得する
 Redmine.prototype.issues_by_query = function(queryId, params, callback) {
   this.request('GET', '/issues.json?query_id=' + queryId, params, callback);
 };

これで該当のカスタムクエリのチケットを全て取得できるので、あとは上のメソッドをインスタンス化した変数から呼び出し、カスタムクエリIDとプロジェクトID(付属のサンプルコードを参考にして取得する)を渡してBotに喋らせるだけです。

平日の毎朝Botに投稿させる

このBotのつぶやきは平日の毎朝10時に投稿させます。
node-cron を入れるとその辺の処理が簡単に作れるのでインストールします。

$ npm install cron --save

Bot起動時のコードで CronJob() を呼んでサブスクライブしてあげます。
(下記コード全文参照)

これで終わりです。問題なければ指定した時間帯に投稿されると思います。

コード全文

redmineController.js

main.js