コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

Hubotをインストール、hipchatと連携し、foreverでデーモン化(CentOS6.4)

hubot

hubotとは

GitHub社が開発しMITライセンスで公開しているNode.jsでbotを作り動かすためのフレームワークです。 Hubotの大きな特徴に,様々なチャットツールに対応している点があります。たとえば,先ほど取り上げたikachanは,IRC用のbotを作るためのフレームワークであり,Twitterbotを作る目的には使えません。一方で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が表示される pug

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を実行できるようになる

f:id:kon_yu:20140513213459p:plain

")

f:id:kon_yu:20140513213649p:plain

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