Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

foreverでslackと連携するhubotをデーモン化する

はじめに

お久しぶりです。viatminです。
以前にも、hubot関連のブログを書きました。
hubot-slackで `INFO Slack client closed, waiting for reconnect` がSlack連携が切断される問題への対処法 - Aqutras Members' Blog
今回は、順序が逆な気もしますが、slackと連携するhubotをデーモン化して動作する方法について書きたいと思います。

foreverによるデーモン化

通常、slackと連携したhubotを起動すると、コンソール上に以下の様なhubotのログが出力され、そこで操作ができなくなります。

[Wed Jul 20 2016 15:15:32 GMT+0900 (JST)] INFO Connecting...
[Wed Jul 20 2016 15:15:33 GMT+0900 (JST)] INFO Logged in as myHubot of myTeam, but not yet connected
[Wed Jul 20 2016 15:15:34 GMT+0900 (JST)] INFO Slack client now connected

この状態では、hubotは動作していますが、ターミナルを終了させると、hubotも停止してしまいます。
永続化するには、デーモン化して、バックグラウンドで動いてほしいところです。

そこで、forever というライブラリを利用します。
foreverは、node.js用のデーモンマネージャです。
これを利用すると、簡単にnode.jsのデーモン化を行うことが出来ます。

構築

ライブラリのインストール

まず、必要最低限なpackage.jsonを作成します。
以下のように記述し、npm install を実行します。hubotは、実行にcoffee-scriptを必須としているため、これも導入します。

{
  "dependencies": {
    "coffee-script": "^1.10.0",
    "forever": "^0.15.2",
    "hubot": "^2.19.0",
    "hubot-slack": "^4.0.1"
   }
}

起動スクリプトの作成

以下の様な起動スクリプトを作成し、hubotのディレクトリの下の /bin ディレクトリに配置します。

export HUBOT_SLACK_TOKEN=xoxb-123456789abcdefg
export HUBOT_SLACK_TEAM=myTeam
export HUBOT_SLACK_BOTNAME=myHubot

export HUBOT_DIR=/path/to/dir
export PATH=${HUBOT_DIR}/node_modules/.bin:$PATH

if [ ! -d ${HUBOT_DIR}/log ]; then
  mkdir ${HUBOT_DIR}/log
fi

forever start -l ${HUBOT_DIR}/log/myHubot.log -c coffee -a hubot --adapter slack -r ${HUBOT_DIR}/scripts

スクリプトの各項目の説明

  • export HUBOT_SLACK_TOKEN=xoxb-123456789abcdefg
    slackのhubotのtokenを設定します。ココの説明がわかりやすいです。

  • export HUBOT_SLACK_TEAM=myTeam
    slackのチーム名を設定します 。

  • export HUBOT_SLACK_BOTNAME=myHubot
    botの名前を設定します。

  • export HUBOT_DIR=/path/to/dir
    hubotのディレクトリへのパスを設定しておきます。

  • export PATH=${HUBOT_DIR}/node_modules/.bin:$PATH
    npmでインストールしたライブラリへpathを通しておきます。

  • if [ ! -d ${HUBOT_DIR}/log ]; then ~
    ログディレクトリがなければ作成をします。

foreverコマンドのオプションの説明

  • -l ${HUBOT_DIR}/log/myHubot.log
    ログの出力先ファイルを指定します。

  • -c coffee スクリプトを実行するコマンドを指定します。今回は、coffee-scriptで書かれているため、coffeeを指定します。

  • -a ログに追加書き込みを行います。指定がなければ、毎回新規作成を行います。

hubotコマンドのオプションの説明

  • --adapter slack
    hubotの連携として、slackを指定します。

  • -r ${HUBOT_DIR}/scripts
    hubotの動作が記述されているスクリプトのディレクトリを指定します。

実行後、/path/to/dir/log/myHubot.log に、以下のようにログが書き込まれていれば完了です。

[Wed Jul 20 2016 15:15:32 GMT+0900 (JST)] INFO Connecting...
[Wed Jul 20 2016 15:15:33 GMT+0900 (JST)] INFO Logged in as myHubot of MyTeam, but not yet connected
[Wed Jul 20 2016 15:15:34 GMT+0900 (JST)] INFO Slack client now connected

おわりに

Aqutrasのhubotは、githubやesaと連携し、社内の開発をサポートしてくれています。
また、 cheerio-httpcli などのスクレイピングライブラリを利用することで、apiやライブラリを提供していないWebサービスなどの連携も行ってくれます。
まだ導入されていない方は、この記事を参考に、ぜひ自分のteamにhubotを構築してみてください!
合わせて以下の記事もお願いします!!(w hubot-slackで `INFO Slack client closed, waiting for reconnect` がSlack連携が切断される問題への対処法 - Aqutras Members' Blog