ちぐログ

メモ書きです

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という観点で必要なことをしていきます

  1. 30分放置でherokuがシャットダウンしてしまうのでその対応
  2. 24h稼働
  3. HubotのソースをGitHubに移行、かつHubot-scriptを機能ごとに分割
  4. 楽しい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から終了通知が。

f:id:chiguniiita:20151211074712p:plain

どうやらHUBOT_HEROKU_SLEEP_TIMEの設定で24時以降が効いていない結果、以下のような動きをしまうみたい。

ポーリングが24時に切れる
→30分は起動していられる
→24:30過ぎにシャットダウンされてしまう

調査してダメそうだったら、hubot-heroku-keepaliveにpullrequestを送ってみるのもアリかと。

github.com

テスト運用で分かったこと②

hubot-heroku-keepaliveは前述したとおり、指定した時間内に内部でポーリングをやってくれるだけで、HUBOT_HEROKU_WAKEUP_TIMEにアプリケーションは起動してくれません。 herokuのアプリはアクセスすると立ち上がるので、Azure Schedulerを使って指定した時間に、herokuアプリにアクセスするようにしました。

azure.microsoft.com

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のユーザ名/リポジトリ名 --save
  • external-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

今度試してみようと思います。