Hubotをインストール、hipchatと連携し、foreverでデーモン化(CentOS6.4)
hubotとは
GitHub社が開発しMITライセンスで公開しているNode.jsでbotを作り動かすためのフレームワークです。 Hubotの大きな特徴に,様々なチャットツールに対応している点があります。たとえば,先ほど取り上げたikachanは,IRC用のbotを作るためのフレームワークであり,Twitterのbotを作る目的には使えません。一方でtwittbotはTwitter専用であり,IRC用のbotを作ることはできません。しかし,Hubotは,Hubotとチャットツールをつなぐモジュールである「Adapter」を切り替えることで様々なチャットツールに接続することができます。
refshttp://gihyo.jp/dev/serial/01/hubot/0001
本体のコードはここhttps://hubot.github.com/
node.jsで動くボットで、hipchatやchatworks,slackなどと連携できるツールなのだ。 大体はそのチャットツールでhubotに命令を投げ、タスクを実行してもらい結果を返してもらうのだ。
どんな使い方をするか言うとJenkinsを回したり、デプロイしたりするのに使ったりする。 hubotのボットを記述する言語はCofeeScriptで記載するのだ。
今回の目的
hipchatを使って、hubotから本番環境へCacpistranoを使ってデプロイするのを目的とし、以下の項目で記載する
- hubotをインストール
- hubotとhipchatと連携
- foreverを使ってhubotをデーモン化
- 目的用のCoffeeScriptを記載する
今回のサーバ環境
AWS EC2 のCentOS6.4
Hubotのインストール
Hubotを本体をインストールするには、node.jsとNoSQLのRedisが必要、それらをインストールする
refs http://kray.jp/blog/hubot/
epelのリポジトリを追加
$ sudo rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
node.jsとRedisをインストール
$ sudo yum install npm redis # y/n を途中で聞かれるので、yを入力してEnter
Redis起動
$ sudo /etc/init.d/redis start #Redis 自動起動設定 $ sudo chkconfig redis on
coffeeScriptとhubotをインストール
$ sudo npm install -g coffee-script hubot # warning が出たりするが、とりあえず大丈夫
Hubotのひな形を作成
# mybotというhubotを作成する $ hubot --create mybot $ cd mybot $ npm install
Hubotの動作確認
$ cd mybot # hubot起動 $ ./bin/hubot Hubot> hubot ping Hubot> PONG #ってエコーが返ってくる Hubot> hubot pug me # パグの画像のURLが表示される Hubot> http://24.media.tumblr.com/tumblr_lhowz2fAnC1qaa50yo1_500.jpg # 終了 Hubot> exit
こんなかんじで パグの画像のURLが表示される
Hipchatの準備
アカウントを作る
テスト用に自分のアカウントでhubotを使って自分に対して @self pingとか送っても レスポンスがないんので、ちゃんとhubot用にアカウントをつくる必要がある
hipchatのadmin権限があれば作れるので、管理者じゃない人は管理者に作ってもらいましょう
Jabber IDを取得する
hipchatをhubotで使うには、アカウントのパスワードとJabber ID というものが必要 Jabber IDはhipchatのPCサイトにログインして https://username.hipchat.com/account/xmpp で確認する。
HubotにHipchat用プラグインをインストールする
# 依存するライブラリをインストールする $ sudo yum install libicu-devel # HipChatで使えるようにするのにhubot-hipchatをインストールする $ npm install hubot-hipchat --save
hipchat用の環境変数を設定する
先ほど取得した、hubotのhipchatアカウントのJabber IDとパスワードをそれぞれ HUBOT_HIPCHAT_JID、HUBOT_HIPCHAT_PASSWORDとして環境変数を設定する
$ export HUBOT_HIPCHAT_JID="12345_12345678@chat.hipchat.com" $ export HUBOT_HIPCHAT_PASSWORD="xxxxxxxxxx"
Hipchatを起動する
Hipchatと連携してHubotを起動するには、-a でアダプタの設定をする
$ bin/hubot -a hipchat
こうするとこんな感じで、hipchatからhubotのアカウントに対して、メンションを送ると先ほど黒い画面で実行した内容と同じものを返してくれる。
hipchatでmisawaとかしょうもない機能を入れる
地獄のミサワの画像をランダムに表示する機能と、LTTMを表示する機能を追加する。
# botが実行するCoffeeScriptのあるディレクトリに行き、対象のScriptをDLする $ cd mybot/scripts # misawa $ wget https://raw.githubusercontent.com/mosaz/hubot/master/scripts/misawa.coffee --no-check-certificate # lgtm $ wget https://raw.githubusercontent.com/bizground/hubot-bizground-co-jp/master/scripts/lgtm.coffee --no-check-certificate
hubotを再起動することで、Scriptを実行できるようになる
")
foreverでhubotをデーモン化する
refs <http://blog.manaten.net/entry/617 http://onlineconsultant.jp/pukiwiki/?node.js%20node.js%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92forever%E3%81%A7%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B>
# foreverをインストール $ sudo npm install forever -g
foremanで、起動するスクリプトを作成する
run.shを実行ファイルを作り、以下の内容を記載する
#!/bin/bash # 環境変数の設定 export HUBOT_HIPCHAT_JID="1234561234@chat.hipchat.com" export HUBOT_HIPCHAT_PASSWORD="xxxxxxxxxx" # foreverでhubotをデーモンで起動 forever start -c coffee node_modules/.bin/hubot -a hipchat
シェルの実行
$ ./run.sh
これでHubotがデーモン化される
追加のHubot実行スクリプトを作成する
scriptsの下にmyscript.cofeeというhubot用のCoffeeScriptを作成する
# Commands: # hubot myscript module.exports = (robot) -> #単純なエコーを返すだけ。@hubot hi ==> hiと返してくれる robot.respond /hi/i, (msg) -> msg.send 'hi' #ビールを飲むの最適な時間を教えてくれる。@hubot ビール飲むのはいつ? ==> いつ飲めばいいか教えてくれる画像を返す robot.respond /ビール飲むのはいつ?/i, (msg) -> msg.send 'http://up.gc-img.net/post_img/2013/11/GB4KRx3cBCc77MN_9pDVt_29.jpeg' #Webアプリケーションをデプロイする。Capistaranoのコマンドをたたいてデプロイ @hubot release production ==> production, stage, test などパラメタを指定しでデプロイする robot.respond /release (.*)$/i, (msg) -> # hipchatからの文字から引数を取得 env = msg.match[1] # OSコマンドを実行する準備 @exec = require('child_process').exec command = "cd /xxx/xxx/xxx/app && cap TARGET=#{env} deploy prams" msg.send "This is the command #{command}." # OSコマンドを実行する @exec command, (error, stdout, stderr) -> msg.send error msg.send stdout msg.send stderr