slackにチームで使うHubotを導入してみた
この記事は社内Advent Calendarの裏記事です。
本記事(社内閲覧限定)はあまりにも・・・な内容だったので最近のアウトプットも兼ねて裏記事を作成しました。
こちらの方がAdvent Calendarっぽい記事になっています。
背景
先日GitHubのOrganizationメンバーで構成されるslack上で
Hubot待望の投稿がいくつかあったので、slackにHubotを立ち上げることにしました。
既にできていたこと
slackを始めた直後に個人的にHubot遊びをしていたので、少しだけノウハウがありました。
・herokuを使ってHubotを立ち上げて、slackに住まわせること
・コピペでいくつかのスクリプトを実行できていた
・ソース管理はheroku上のgit
・全てのHubot-scriptはHubot本体と同じ場所の1ファイル内にあった
なお初回の勉強には@bouzuyaさんのHubot連載にお世話になりました。
ありがとうございます。
qiita.com
今回やりたいこと
チームで使うHubotという観点で必要なことをしていきます
- 30分放置でherokuがシャットダウンしてしまうのでその対応
- 24h稼働
- HubotのソースをGitHubに移行、かつHubot-scriptを機能ごとに分割
- 楽しいHubot-scriptの追加
1. 30分放置でherokuがシャットダウンしてしまうのでその対応
これはHubotで標準に仕込まれているhubot-heroku-keepalive
を使用すれば可能です。
以下の環境変数を設定することで動いてくれます
HUBOT_HEROKU_KEEPALIVE_URL:herokuアプリのURL
2. 24h稼働
slack上の人々は、昼夜問わず会話したり、ソースを触っているイメージがあるので、できれば24h稼働したいところ。
ですが、herokuの無料プランは最近24時間稼働できなくなりました。 blog-ja.sideci.com
それでは、2-Hubot体制で24h稼働を実現しようと考えたのですが、
結果的には、1-Hubotで8-24時という状態で甘んじています。
理由
- herokuのProcess Schedulerを使えば、2つのHubotを時間で区切れるが、使うにはクレジットカードの登録が必要だったので中止。お金を払うつもりがない場所にカード情報を登録するのはいかがなものかと。
- 後述の作成した
hubot-hello-bye
の中で、指定時間のherokuアプリの強制シャットダウンにチャレンジしたが失敗。これができないと2つのHubotが同時に反応する時間ができてしまい、少々うざい。
結果
まずは稼働優先で1-Hubotでいくことにしました。
指定時間内の稼働はhubot-heroku-keepalive
用の起動、終了時間が使えるので、環境変数に設定します。
HUBOT_HEROKU_WAKEUP_TIME:8:00
HUBOT_HEROKU_SLEEP_TIME:26:00
※実際はWAKEUP~SLEEPの時間で起動維持のポーリングを行ってる模様。
テスト運用で分かったこと①
これで26時までは行けるだろうと思ってテスト運用してみたところ、毎回なぜか24:30過ぎにHubotから終了通知が。
どうやらHUBOT_HEROKU_SLEEP_TIME
の設定で24時以降が効いていない結果、以下のような動きをしまうみたい。
ポーリングが24時に切れる
→30分は起動していられる
→24:30過ぎにシャットダウンされてしまう
調査してダメそうだったら、hubot-heroku-keepalive
にpullrequestを送ってみるのもアリかと。
テスト運用で分かったこと②
hubot-heroku-keepalive
は前述したとおり、指定した時間内に内部でポーリングをやってくれるだけで、HUBOT_HEROKU_WAKEUP_TIME
にアプリケーションは起動してくれません。
herokuのアプリはアクセスすると立ち上がるので、Azure Scheduler
を使って指定した時間に、herokuアプリにアクセスするようにしました。
Azure Schedulerは簡単に設定できますが、一つだけ気を付けるべき点があります。 URIの設定をする場所がありますが、ここに単純にherokuアプリのURLを設定すると、Azure Schedulerがエラーを吐き続けます。
理由は、herokuアプリのURL(https://○○○.herokuapp.com/)にアクセスすると404で返ってくるためです。
(この状態でもherokuアプリは起動を開始します)
少しハマった後、hubot-heroku-keepalive
のポーリングはどうやっているのかチェックしてみました。
どうやら、URLの後ろにheroku/keepalive
をつけた場所にアクセスしているようなので、変更してみるとエラーなしで動くようになりました。
3.HubotのソースをGitHubに移行、かつHubot-scriptを機能ごとに分割
チームのメンバーでHubotに機能を追加できるようにGitHubに移行しました。 herokuもGitHubのcommitに対して、自動デプロイをやってくれるので使い勝手がいいです。
またHubot-scriptについては、再利用性を高めるために、機能ごとにリポジトリを作っています。
npm install githubのユーザ名/リポジトリ名
--saveexternal-scripts.json
に追加
で簡単にHubotに機能を追加できるます。
こういった運用が簡単にできる点が素晴らしいですね。
4.チームが楽しめるようなHubot-scriptの追加
以下に、私が作ったHubot-scriptをあげています。
少しばかりですが、チームが楽しめるようなものも追加しました。
Hubotが起動終了時に何も通知してくれないが不便だったので作成 github.com
Slackでのリクエストに応えて、新チャンネルの追加を通知してくれる github.com
こちらもSlackでの会話から、LGTM文化を醸成するために github.com
みんな大好きどようびを通知してくれる github.com
まとめ
今回学べたこと
・npm周りの一般的な挙動
・Azure Schedulerの動かし方
・CoffeeScriptのド基礎
・スペースがないだけで動かない曲者
・Visual Studioにプラグインをいれて、CoffeeScriptのコンパイル結果を見ながら、構文があってるか確認して開発した
www.forest.impress.co.jp
気づいたこと
個人だけに収まらない、他人が触れるようなモノを作るって楽しい!
今後やりたいこと
・コンシェルジュ的なHubot-scriptを増やす
・Hubot-scriptの綺麗な作り方の研究
・slackの他のIntegrationで遊ぶ
追記
この記事を書いている途中でherokuアプリを強制シャットダウンできそうな方法を見つけました。 www.macminiosx.com
今度試してみようと思います。