概要
Raspberry PiにSlack Bot(hubot)を住ませて、Slackから呼び出せるようにする。
使用するハードウェア
- Raspberry Pi 2 Model B (OS:Raspbian Jessie)
使用するソフトウェア
- Node.js
- npm
- yo
- generator-hubot
- coffee-script
使用するWebサービス
- Slack
構築手順
1.Node.jsインストール
Raspberry Piのターミナルでインストールを行う。
apt-getのupdate
apt-getをupdateしておく。
sudo apt-get update
node.jsインストール
sudo apt-get install -y nodejs
node.jsのバージョンを確認
nodejs -v
node.jsのバージョンが表示されることを確認。
2.hubotインストール
npmインストール
sudo apt-get install -y npm
npmのバージョンを確認
npm -v
npmのバージョンが表示されることを確認。
npm nインストール
sudo npm cache clean
sudo npm install npm n -g
sudo n stable
yoインストール
sudo npm install yo -g
generator-hubotインストール
sudo npm install generator-hubot -g
coffee-scriptインストール
sudo npm install coffee-script -g
3.hubot設定
hubotを格納するディレクトリを作成
mkdir hubot
cd hubot
mkdir pibot
cd pibot
yo hubot
今回はルートディレクトリにhubotというディレクトリを作成し、その中にpibotという名前のディレクトリを作成してみた。
pibotディレクトリ内で yo hubot を実行するとhubotの作成が始まる。
hubotの設定
対話形式でhubotの設定を進める。
設定内容は以下を参考にする。
[HUBOT DOCUMENTATION] (https://hubot.github.com/docs/)
設定内容は以下のとおり。
- Owner
- hubotの所有者をメールアドレスで設定。
- Bot name
- hubotの名前。今回はpibotとする。
- Description
- hubotの概要。適当な値でよい。
- Bot adapter
- hubotのアダプタを指定する。必ずslackを指定。
hubot単体の動作確認
以下のコマンドでhubotを起動する。
bin/hubot
このとき、Heroku関連のERRORが出るが無視してよい。 1
以下のコマンドを実行してhubotからPONGと返ってくれば動作確認はOK!
(pingの前にhubotの名前を指定すること)
pibot ping
4.Slack設定
Slackへのhubot追加とAPIトークン取得
Slack Appディレクトリにアクセスし、hubotを追加。
https://slack.com/apps
hubotの追加が完了するとhubotアダプターで使用するAPIトークンが表示されるのでコピーしておく。
その他、アイコンや氏名は好みのものに変えておいてOK。
Raspberry piのhubotにAPIトークンを設定
Raspberry Piのターミナル画面に戻り、取得したSlackのAPIトークンをhubotに設定する。
以下のコマンドでhubotの設定ファイルを開く。
nano bin/hubot
以下の定数を設定して保存。
export HUBOT_SLACK_TOKEN=Slackで取得したAPIトークン
最下部に追加するとダメなようなので、既存の定数PATHの上あたりに追加する。
hubotを起動してSlack側でオンラインになるか確認
以下のコマンドを実行してhubotを起動。
bin/hubot -a slack
5.Slackからhubotの動作確認
Slack上でRaspberry Piのhubotに対してメンションを付けてpingと発言し、hubotがPONGと返してくれることを確認できれば動作確認はOK!
6.Raspberry pi起動時にhubotを自動で起動
現状ではターミナルでbin/hubotを実行しないとhubotが起動しないが、これをRaspberry Piの電源を入れたら(Raspbianが起動したら)自動でhubotが起動するようにする。
init.d or systemd
同じようなことを試みている記事はたくさんあり、その中でinit.dを利用する方法を最初に試してみたが、最新のRaspbian jessieではinit.dでのhubot起動は上手くいかなかった。
最新のRaspbian jessieからはsystemdというのを利用するのがベターらしい。
[Pythonコードをデーモン化する(Systemdとinit.dの違い)] (http://dreamerdream.hateblo.jp/entry/2016/01/08/000000)
init.dはWheezy以前の比較的古いシステム、systemdはJessie以降の比較的新しいで採用されている。
hubot起動スクリプトを作成
systemdで自動起動する対象はシェルファイルにするので、bin/hubotを実行するシェルスクリプトを用意しておく。
今回はbin/hubotと同じディレクトリにrun_hubot.shというシェルスクリプトを作成した。
cd /home/pi/hubot/pibot/bin
sudo nano run_hubot.sh
シェルスクリプトの内容は、bin/hubotを実行する内容にしておく。
#!/bin/sh
cd /home/pi/hubot/pibot
sudo -u pi bin/hubot --adapter slack
systemdの設定ファイルを作成
systemd/systemフォルダにサービス起動用の設定ファイルを追加する。
(xxxはhubotの名前にしておくと判別しやすい)
cd /etc/systemd/system
sudo nano xxx.service
xxx.serviceの書き方は以下のような感じ。
DescriptionとExecStartを各自のhubot用に書き換えればいいと思う。
(ExecStartには上で作成したhubot起動用のシェルファイルを指定する)
[Unit]
Description=pibot service
[Service]
ExecStart=/home/pi/hubot/pibot/bin/run_hubot.sh
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
systemdの設定反映とステータス確認
設定ファイルを有効にするには以下のsystemctlコマンドを実行する
sudo systemctl daemon-reload
以下のsystemctlコマンドを実行し、systemdに登録したサービスがactiveになっていることを確認。
activeになっていない場合は作成したファイルに何かしら問題がある。
(systemdに作成した設定ファイルや起動用のシェルスクリプトが間違っているとか)
systemctl status xxx
Raspberry Piを再起動し、hubotが自動起動するか確認する。
(SlackでオンラインになればOK。Raspbian起動後、hubotの起動に1~2分かかる)
sudo reboot
-
"hubot-heroku-keepalive"は、Heroku上でhubotが寝ないようにするためのプラグイン。このプラグインを利用するときは"HUBOT_HEROKU_KEEPALIVE_URL"という定数を定義するのだが、その定数が存在しないということでエラーになっている。 ↩