この記事では、ゼロから Hubot を Heroku にデプロイして Slack と連携します。
BotKitをHerokuでSlackに繋げるまで こっちでは BotKit を扱いました。
Node.js の準備と設定
Hubot を動かすには Node.js が必要になります。
各種モジュールを取得するために npm を使います。
nodenv のインストールと設定
// nodenv のクローン
$ git clone https://github.com/nodenv/nodenv.git ~/.nodenv
$ git clone https://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build
// 各種設定
$ echo 'export NODENV_ROOT=~/.nodenv' >> ~/.bashrc
$ echo 'export PATH=$NODENV_ROOT/bin:$PATH' >> ~/.bashrc
$ echo 'export "eval "$(nodenv init -)"' >> ~/.bashrc
// 反映
$ source ~/.bashrc
// インストール確認
$ nodenv --version
nodenv 1.1.0-3-g27f0d7b
$ nodenv versions
Warning: no Node detected on the system
node のインストール
$ nodenv install 6.9.5
$ nodenv global 6.9.5
$ nodenv versions
* 6.9.5 (set by /home/chibi/.nodenv/version)
$ node --version
v6.9.5
$ npm --version
3.10.10
Hubot の準備と設定
Hubot の準備には npm でモジュールをインストールして、
Yoeman を使って雛形を作成します。
各種モジュールのインストール
$npm install -g yo generator-hubot
Hubot の雛形作成
$ mkdir dragonbotz
$ cd dragonbotz
$ yo hubot
yo: コマンドが見つかりません
$ nodenv rehash
$ yo hubot
_____________________________
/ \
//\ | Extracting input for |
////\ _____ | self-replication process |
//////\ /_____\ \ /
======= |[^_/\_]| /----------------------------
| | _|___@@__|__
+===+/ /// \_\
| |_\ /// HUBOT/\\
|___/\// / \\
\ / +---+
\____/ | |
| //| +===+
\// |xx|
? Owner chibi929
? Bot name dragonbotz
? 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
_____________________________
_____ / \
\ \ | Self-replication process |
| | _____ | complete... |
|__\\| /_____\ \ Good luck with that. /
|//+ |[^_/\_]| /----------------------------
| | _|___@@__|__
+===+/ /// \_\
| |_\ /// HUBOT/\\
|___/\// / \\
\ / +---+
\____/ | |
| //| +===+
\// |xx|
動作確認
$ ./bin/hubot
dragonbotz> [Fri Mar 17 2017 23:42:01 GMT+0900 (JST)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.
Your hubot-scripts.json is empty, so you just need to remove it.
[Fri Mar 17 2017 23:42:01 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web-url | cut -d= -f2)`
[Fri Mar 17 2017 23:42:01 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Fri Mar 17 2017 23:42:01 GMT+0900 (JST)] INFO hubot-redis-brain: Data for hubot brain retrieved from Redis
dragonbotz> dragonbotz ping
dragonbotz> PONG
Slack との連携
Hubot と Slack を連携するには Configure Apps
の Hubot
を追加してトークンを取得します。
取得したトークンを使って、上記で準備した Hubot と連携させます。
Slack 側の準備
https://my.slack.com/services/new/hubot
ここから Hubot
を登録できます。
Bot の名前を決める
Bot の設定画面でアイコンなどを設定する
最後に保存をする。
赤枠で囲ったトークンは後で使いますのでコピーしておきます。
Hubot 側の準備
先ほどのトークンを設定しつつ、Hubotを起動します。
$ export HUBOT_SLACK_TOKEN=xoxb-*********************************
$ ./bin/hubot --adapter slack
[Sat Mar 18 2017 00:17:42 GMT+0900 (JST)] INFO Logged in as dragonbotz of z-enjoy-it
[Sat Mar 18 2017 00:17:43 GMT+0900 (JST)] INFO Slack client now connected
[Sat Mar 18 2017 00:17:43 GMT+0900 (JST)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.
Your hubot-scripts.json is empty, so you just need to remove it.
[Sat Mar 18 2017 00:17:44 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web-url | cut -d= -f2)`
[Sat Mar 18 2017 00:17:44 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Sat Mar 18 2017 00:17:44 GMT+0900 (JST)] INFO hubot-redis-brain: Data for hubot brain retrieved from Redis
動作確認
Heroku との連携
Heroku のアカウント登録は終わっているものとします。
上記のローカル上で試した Slack との連携
を Heroku 上で行います。
Heroku のプロジェクトの作成
新しい Heroku App を作成する
アプリ名を決める
- アプリ名は空っぽの場合は適当に決まるようです
- そのまま Create App ボタンを押下します
"heroku CLI" の導入
$ sudo apt-get install software-properties-common # debian only
$ sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"
$ curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install heroku
$ heroku --version
heroku-cli/5.7.0-713be60 (linux-amd64) go1.7.5
"heroku CLI" でログイン
$ heroku login
Enter your Heroku credentials:
Email: hoge@example.com
Password: **************
Two-factor code: ******
Logged in as hoge@example.com
Heroku へデプロイ
$ cd dragonbotz
$ git init
$ heroku git:remote -a {HEROKU_APP_NAME}
$ git add .
$ git commit -m "First commit."
$ git push heroku master
Heroku への設定
$ heroku config:add HUBOT_SLACK_TOKEN=xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ heroku config
HUBOT_SLACK_TOKEN: xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
さっき使ったトークンを heroku の環境変数に登録します。
動作確認
- ローカル上の Hubot は落ちていることを確認します
- Heroku 上の Hubot を動かします
Bot のスクリプトを書く
scripts/
の下に example.coffee
というものがありますが、
ここに dragonbotz.coffee
を作成します。
dragonbotz.coffee
module.exports = (robot) ->
robot.hear /タッカラプトポッポルンガプピリットパロ/, (msg) ->
msg.send ":polunga:"
Heroku へデプロイ
git add scripts/dragonbotz.coffee
git commit -m "Add dragonbotz"
git push heroku master
動作確認
※適当に拾ってきた画像を使わせて頂きました。
作業中のトラブルシュート
yo
でエラーが発生した件
$ yo doctor
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== (Y/n)
/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/rx-lite/rx.lite.js:75
throw e;
^
SyntaxError: Invalid regular expression: /.{1,0}/: numbers out of order in {} quantifier
at RegExp (native)
at breakLines (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/utils/screen-manager.js:108:15)
at ScreenManager.render (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/utils/screen-manager.js:55:22)
at Prompt.render (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/prompts/confirm.js:85:15)
at Prompt._run (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/prompts/confirm.js:65:8)
at Prompt.run (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/prompts/base.js:57:8)
at Object.<anonymous> (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/ui/prompt.js:84:12)
at module.exports (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/run-async/index.js:15:21)
at AnonymousObservable.__subscribe (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/insight/node_modules/inquirer/lib/utils/utils.js:16:7)
at AnonymousObservable.tryCatcher (/home/chibi/.nodenv/versions/6.9.5/lib/node_modules/yo/node_modules/rx-lite/rx.lite.js:63:31)
とりあえずターミナルを再起動だったか、OS再起動したら直った。
npm でインストールしたモジュール関連がちゃんとロードされていなかったのだろうか。