1日1%成長するブログ

毎日成長するために仕事/プライベートで得た学びをアウトプットするブログです

HubotでSlackに毎日目標を通知するbotを作る (環境構築編)

Hubotとは

Hubotの構成

f:id:masaru_furuya:20171021080753p:plain

なぜbotにHubotを使うのか?

  • Hubotを使えばメッセージの受信・送信やチャットツールとの連携などbot実装に必要な最低限の機能を自分で実装せずで済む
  • CoffeeScriptJavaScriptで書けるので、学習コストも低い
  • Herokuで運用すれば無料で使えるので、サーバー代もかからず手軽
  • npmも使うこともできる

Hubotでできること

  • スクリプトも書けてAPIサーバーとの連携もできるので、プログラムでできることはなんでも出来る

  • 実装例

    • シフト表の投稿
    • デプロイの実行
    • GithubのPRブランチの作成
    • Githubのレビュワーのランダムアサイ

データの永続化

  • Hubotはデフォルトだとメモリ上に情報を保持するのでHerokuの再起動が走ると消えてしまう
  • 永続化のためにはbrainという仕組みを使う。FileやRedisに保存したりする。あとは外部のAPIサーバーヲ使うとか。
  • ここら辺は模索する

モジュールインストール

  • npm install -g yo generator-hubot

Hubotの雛形作成

$ mkdir hogehoge
$ cd hogehoge
$ yo hubot

? Owner masaru
? Bot name daily-goal-reminder
? Description A simple helpful robot for your Company
? Bot adapter slack
   create bin/hubot
   create bin/hubot.cmd
   create Procfile
   create README.md
   create external-scripts.json
   create hubot-scripts.json
   create .gitignore
   create package.json
   create scripts/example.coffee
   create .editorconfig

動作確認

$ ./bin/hubot

daily-goal-reminder> daily-goal-reminder ping
daily-goal-reminder> PONG
daily-goal-reminder>

Slack側の準備

  • 以下のURLからHubotを登録します
  • HubotはSlackと連携できるアプリの1つです

https://my.slack.com/services/new/hubot

アイコンを設定する

  • 好きなアイコンを設定したりできます

f:id:masaru_furuya:20171020231722p:plain

Hubot側の準備

$ export HUBOT_SLACK_TOKEN=[設定画面に記述されたAPIトークン]
$ ./bin/hubot --adapter slack

動作確認

  • ローカルのPCでhubotを起動した状態でSlackにボットを招待して話しかけると返信してくれる

f:id:masaru_furuya:20171020232421p:plain

Herokuとの連携

  • Herokuでbot用のアプリを作る

Heroku用のCLIをインストール

$ brew install heroku/brew/heroku

Herokuにログイン

$ heroku login

Herokuにプッシュ

$ git init
$ git add .
$ git commit -m 'first commit'
$ heroku git:remote -a [アプリ名]
$ git push heroku master

console.error(`a bug known to break npm. Please update to at leastエラーがでる

  • package-lock.jsonが依存関係で悪さをしているぽい
  • 名前を変更してプッシュしたら通った

Herokuの環境変数にSlackトークンを登録

$ heroku config:add HUBOT_SLACK_TOKEN=[APIトークン]

ここまででHeroku上でHubotが動くようになっている

Herokuの起動設定を行う

定期的にpingしてsleep防止

Herokuのfreeプランは30分以上アクセスがないとスリープするので、 NewRelicのアドオンを入れて定期的にpingします。

qiita.com

Process Schedulerのインストール

さらにfreeプランでは1日6時間は必ずスリープさせないといけません。 そのため使わない時間帯はスリープさせるようにします。FreeプランでOKです。

f:id:masaru_furuya:20171021071010p:plain

Overviewからアドオンをクリックします。

f:id:masaru_furuya:20171021071219p:plain

APIキーを求められるのでManage Accountからコピーします。

スリープさせても良い時間のwebのdyno数を0に設定します。 選択したい範囲をドラッグすると一括で設定ができます。

f:id:masaru_furuya:20171021072418p:plain

Herokuのタイムゾーンを東京にする

Herokuのデフォルトタイムゾーン協定世界時(UTC)です。

heroku run bash
$ date
Fri Oct 20 XXXX UTC 2017

アドオンを使う時にタイムゾーンがずれていると困るので、東京に設定します。 環境変数にTZを追加すると上書きされます。

今日の1%

毎日通知する系のBotはHubotで作るのが楽。 でも毎回設定するたびに手順を調べ直していたので今回手順をまとめました。