コーヒーこぼした。

プログラミングとちょこっとハード

slackにhubotを住まわせた話

俺氏、ブログはじめるってよ。

先日slackにhubotを導入したのでその話をしようと思う。

slackってのはエンジニアの間で数年前から盛り上がってるIRCライクなチャットツールだ。
なんといっても1番の特徴は様々な外部サービスとの連携機能だろう。

日常会話程度ならLINEで事足りるのだが、やはり技術的な議論となると何かと連携があったほうが便利だと思う。

しかし、slackは無料プランのままでは連携できるサービスの数に上限がある。
有料プランはスタンダードプランで1人あたり月額6.67ドル(820円くらい)。
これを研究室の人数分払うとなると、ざっと年間30万くらいになってしまう。
良いMac買えるやないか。

この金銭的問題を解決してくれる救世主がhubotだ。hubotはGitHubが開発し、社内で運用しているDevOpsのためのbotフレームワークである。hubot自体はNode.jsで実装されていて、ユーザはcoffeescriptスクリプトを書けば独自の振る舞いを追加できる。slack以外にもいろいろなチャットツール向けにアダプタが提供されているので、IRCやhipchatやchatworkにも導入できるし、twitter botとして機能させることも可能だ。

この記事は上記のhubotを使って連携枠の消費1つで有料プランとほぼ同等のことをしようという趣旨のもと書いている。

要は月額820円払いたくないのである。
切実に死活問題なのである。

何はともあれ、まずはhubotを手に入れることから始めよう。雛形ジェネレータのyeomanを使えば動作する状態のディレクトリツリーがあっという間に出来上がる。

いい時代だ。

パッケージyoとgenerator-hubotは予めインストールしておこう。

# 必要なパッケージをインストール
% npm -g install yo
% npm -g install generator-hubot
#雛形生成
% mkdir myhubot && cd myhubot
% yo hubot

yeomanにいくつか質問されるが、今回はアダプターのところだけ"slack"に変えればよい。
これでhubotの雛形が完成する。シェル上で動作確認してみよう。

% ./bin/hubot
[Wed May 27 2015 19:32:40 GMT+0900 (JST)] INFO Using default redis on localhost:6379
[Wed May 27 2015 19:32:40 GMT+0900 (JST)] INFO Data for hubot brain retrieved from Redis
myhubot> myhubot ping
PONG

生まれたてのhubot。ああ、かわいい。

ここからスクリプトを追加していく。
coffeescriptに馴染みが無い人にはちょっと辛いかもしれないが、お金を払ってないことを思い返してほしい。

さて、ここでディレクトリの構成を確認。次のような感じになっているはずだ。(node_modulesの中身は割愛)

  • myhubot/
    • bin/
      • hubot
    • scripts/
      • example.coffee
    • node_modules/
    • Procfile
    • README.md
    • external-scripts.json
    • hubot-scripts.json
    • package.json

何か追加したい機能があるときは、まずはnpmやGitHubリポジトリに既にないか探してみよう。APIを公開しているようなサービスであればだいたい誰かが既に作っている。

追加の仕方はとても簡単だ。
npmでパッケージをインストールしてexternal-scripts.jsonに1行書き足すだけ。

今回はhubot-githubを追加した。

# hubot-githubをインストール
% npm install hubot-github --save
diff --git a/package.json b/package.json
index 8a7795d..06b67a7 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
     "hubot-redis-brain": "0.0.2",
     "hubot-scripts": "~2.5.16",
     "hubot-slack": "~3.3.0",
-    "hubot": "~2.12.0"
+    "hubot": "~2.12.0",
+    "hubot-github": "~0.2.0"
   },
   "engines": {
     "node": "0.10.x"
diff --git a/external-scripts.json b/external-scripts.json
index a2d8106..891bead 100644
--- a/external-scripts.json
+++ b/external-scripts.json
@@ -9,5 +9,6 @@
   "hubot-redis-brain",
   "hubot-rules",
   "hubot-shipit",
-  "hubot-youtube"
-]
\ No newline at end of file
+  "hubot-youtube",
+  "hubot-github"
+]

GitHubの設定ページでpersonal access tokensを発行し、環境変数に次のものを加える。

HUBOT_GITHUB_KEY - Github Application Key (personal access token)
HUBOT_GITHUB_ORG  - Github Organization Name (the one in the url)
HUBOT_SLACK_ADMIN - Slack Admins who can use certain admin commands

さあ、ここまで来ると本番環境で動かしてもいいだろう。
無料がモットーなのでherokuの無料枠インスタンスを使ってデプロイする。

準備は整った。

slackではhubotも1ユーザとして扱われるので動作テストはhubotとの個別チャットでやるとよいだろう。当然だがエラーや設定ミスでhubotが死んでいるとあなたの発言は虚空の彼方に消えていく。

#generalのようなpublicなチャンネルでこれをやるとbotに無視された恥ずかしいヤツになるので注意しよう。

herokuで動かす場合、一定時間アクセスがないとインスタンスが自動で停止してしまう。一般的にはインスタンス時間の節約になっていいのだが、hubotの場合は常にイベントを待ち構えていなければいけないのでこれは困る。

hubot-heroku-keepaliveパッケージは一定時間ごとに自分に対してリクエストを行うことでこの問題を回避するためのパッケージだが、少し前から機能しなくなった。環境変数名が変わったのかもしれないが、確認はしていない。他にUptime Robotというサービスを使うという解決方法があるのでこちらを使うと良いだろう。
設定に関してはここが参考になる。bouzuya.hatenablog.com


このブログがいつまで続くかはわからない。
僕の性格からしてそう長くは続かないだろう。
しかし、もし続くとしたら次回以降は僕が導入したhubotスクリプトをいくつか紹介していこうと思う。

スポンサーリンク