Raspberry PiにhubotをインストールしてSlackから呼び出すまでの手順

# 概要
Raspberry PiにSlack Bot(hubot)を住ませて、Slackから呼び出せるようにする。

# 使用するハードウェア
* Raspberry Pi 2 Model B (OS:Raspbian Jessie)

# 使用するソフトウェア
* Node.js
* npm
* yo
* generator-hubot
* coffee-script

# 使用するWebサービス
* Slack

# 構築手順
## １．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のバージョンが表示されることを確認。

## ２．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
```

## ３．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/)

![WS000050.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/54f5323e-741c-71c2-05e9-4b0e779e1d27.jpeg)

設定内容は以下のとおり。

<dl>
  <dt>Owner</dt>
  <dd>hubotの所有者をメールアドレスで設定。</dd>
  <dt>Bot name</dt>
  <dd>hubotの名前。今回はpibotとする。</dd>
  <dt>Description</dt>
  <dd>hubotの概要。適当な値でよい。</dd>
  <dt>Bot adapter</dt>
  <dd>hubotのアダプタを指定する。必ずslackを指定。</dd>
</dl>

hubotの作成が完了したことを確認。
![WS000052.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/6e2028b0-ad35-02ae-8509-7feb633ee8aa.jpeg)

### hubot単体の動作確認
以下のコマンドでhubotを起動する。

```
bin/hubot
```

このとき、Heroku関連のERRORが出るが無視してよい。 [^1]
[^1]: "hubot-heroku-keepalive"は、Heroku上でhubotが寝ないようにするためのプラグイン。このプラグインを利用するときは"HUBOT_HEROKU_KEEPALIVE_URL"という定数を定義するのだが、その定数が存在しないということでエラーになっている。

以下のコマンドを実行してhubotからPONGと返ってくれば動作確認はOK!
（pingの前にhubotの名前を指定すること）

```
pibot ping
```

![WS000053.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/4756e703-24d5-a2ba-3c13-3bc40c4b2438.jpeg)

## ４．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の上あたりに追加する。
![WS000057.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/a643056e-48cf-f854-1480-d54bafd1537c.jpeg)

### hubotを起動してSlack側でオンラインになるか確認
以下のコマンドを実行してhubotを起動。

```
bin/hubot -a slack
```

Slack上で作成したhubotがオンラインになればOK!
![WS000056.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/d404549b-0f99-8ecd-7c16-ca39b5acb846.jpeg)

## ５．Slackからhubotの動作確認
Slack上でRaspberry Piのhubotに対してメンションを付けてpingと発言し、hubotがPONGと返してくれることを確認できれば動作確認はOK!
![WS000058.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/bff8052f-b424-fc6a-4e9b-eeef0d661073.jpeg)

## ６．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を実行する内容にしておく。

```run_hubot.sh
#!/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起動用のシェルファイルを指定する）

```pibot.service
[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
```