今さらな感じはするけど Hubot を導入してみた
社内の HipChat に Hubot を導入してみた
弊社では社内のコミュニケーションツールとして、HipChat を使用している。
仕様の確認とか業務上で必要なことやどうでもいい雑談など、頻繁に HipChat 上でやり取りがあり、Github とか Bitbucket とか PivotalTracker とかいろいろ連携をしていて、通知が飛んで来たりもするので、非常に重要なツールとなっている。
その HipChat からオペレーションが出来るといいなぁ、と思っていて、前から導入してみたかった Hubot を導入してみた。
Hubot とは
![hubot](/images/hubot_hipchat/hubot.jpg =300x300)
Hubot とは、Github 社が作っている、チャットのボットのフレームワーク。オープンソースで、Node.js と CoffeeScript が使われている。
Hubot を使うことで、チャットツールから様々なオペレーションが出来るようになる。ChatOps というやつである。
何となく響きがかっこいいね…。
今回は導入方法など、簡単ではあるがまとめてみた。
導入の方法
今回の導入環境
- Amazon Linux AMI release 2014.09
Node.js をインストール
今回は、nvm(node version manager) を利用して、Node.js をインストールした。
インストール方法は、下記のとおり。nvm で Node.js の stable バージョンをインストール。
$ curl https://raw.githubusercontent.com/creationix/nvm/v0.23.3/install.sh | bash
$ nvm install stable
Redis をインストール
また、データの永続化に Redis を使用しているので、Redis もインストール。
# EPEL リポジトリを有効に
$ sudo yum -y install redis --enablerepo=epel
# Redis 起動
$ sudo service redis start
# Redis 自動起動設定
$ sudo chkconfig redis on
CoffeeScript をインストール
各種スクリプトなど CoffeeScript で書かれているので、CoffeeScript もインストールが必要。
$ npm install -g coffee-script
yo と generator-hubot インストール
$ npm install -g yo generator-hubot
yo hubot
で必要なファイルのひな形やディレクトリ等を作成する
$ mkdir myhubot
$ cd myhubot
$ yo hubot
HipChat 連携に必要な環境変数を記述する
HUBOT_HIPCHAT_JID、HUBOT_HIPCHAT_PASSWORD、HUBOT_HIPCHAT_ROOMS、HUBOT_LOG_LEVEL などの環境変数を bin/hubot
に下記のような感じで記述する。
$ vi bin/hubot
#!/bin/sh
set -e
npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
export HUBOT_HIPCHAT_JID="12345_6789@chat.hipchat.com"
export HUBOT_HIPCHAT_PASSWORD="HipChatのパスワード"
export HUBOT_HIPCHAT_ROOMS="12345_XXXプロジェクト@conf.hipchat.com"
export HUBOT_LOG_LEVEL="debug"
exec node_modules/.bin/hubot "$@"
HUBOT_HIPCHAT_JID は、下記画像のようにXMPP/Jabber account settingsの Jabber ID を、HUBOT_HIPCHAT_ROOMS には、ルーム JID を記述する。
libicu-devel インストール
起動したらエラーが出たので(no icu-config
ってエラーだったはず。メモするの忘れてしまった...)、libicu-devel
をインストール。
$ sudo yum install -y libicu-devel
HipChat 用のアダプタをインストール
$ npm install --save hubot-hipchat
起動
下記コマンドで起動する。
$ bin/hubot -a hipchat
ローカル環境で起動するには、-a hipchat
なしで起動すればOK。動作確認は、hubot ping
と打つ。すると、PONG
と返してくれる。
$ bin/hubot
Hubot> hubot ping
PONG
ファイル、ディレクトリ構造について
yo hubot
を実行すると下記のようなファイル、ディレクトリが生成される。
$ ls -l
合計 36
-rw-rw-r-- 1 mmm mmm 35 2月 2 10:16 Procfile
-rw-rw-r-- 1 mmm mmm 5848 2月 2 10:16 README.md
drwxrwxr-x 2 mmm mmm 4096 2月 4 07:38 bin
-rw-rw-r-- 1 mmm mmm 232 2月 2 10:16 external-scripts.json
-rw-rw-r-- 1 mmm mmm 25 2月 3 08:24 hubot-scripts.json
drwxrwxr-x 18 mmm mmm 4096 2月 2 10:31 node_modules
-rw-rw-r-- 1 mmm mmm 641 2月 2 10:31 package.json
drwxrwxr-x 2 mmm mmm 4096 2月 3 08:34 scripts
scripts ディレクトリ
scripts
ディレクトリ配下に、ファイルを置くとそれが実行できる。example.coffee
があるので、それを参考に独自にスクリプトを書くとよい。
hubot-scripts.json
hubot-scripts.json
には、node_modules/hubot-scripts/src/scripts/
配下のファイル名を記述すると、使えるようになる。詳細については、こちらのリポジトリを参考。
https://github.com/github/hubot-scripts
例えば下記のように、github-status.coffee
を書くと、github の status が確認できるコマンドが使えるようになる。
$ vi hubot-scripts.json
["github-status.coffee"]
external-scripts.json
external-scripts.json
も基本的にはhubot-scripts.json
と同じ。ここには、package.json
に記述した、npm で公開されている外部のパッケージを記述する。そうすることで、npm パッケージのスクリプトも利用できるようになる。
デフォルトのスクリプトで使えそうなもの
パグの画像を表示する
HipChat で、hubot へ下記のようにメンションを送ると、パグの画像をランダムで表示してくれる。
@bot pug me
仕事に疲れたときに癒される…かもしれない。
画像検索してランダムで表示する
画像検索をして、結果をランダムで返してくれる。
@bot img <検索するキーワード>
日本語での検索もOK。(ラーメン食べたくなってきた...)
YouTube検索
YouTub から検索した結果を返してくれる。
@bot youtube <曲名など検索ワード>
- 上記の曲は、去年の夏の開発合宿の思い出の曲。
Github Status
前述の hubot-scripts.json
に、["github-status.coffee"]
を記述することで、Github の Status を確認できる。
@bot github status
「あれ?もしかして、Github 落ちてる?」っていうときに、サクッと確認できて便利。
カスタムスクリプトを書いてみた
せっかくなので、自分でスクリプトを書いてみようかと思う。
ドキュメント
こちらのドキュメントを参考にした。
https://github.com/github/hubot/blob/master/docs/scripting.md
スクリプトの構造としては下記のとおり。
module.exports = (robot) ->
robot.hear /badger/i, (msg) ->
# your code here
robot.respond /open the pod bay doors/i, (msg) ->
# your code here
hear
と respond
Hubot のメソッドとして、hear
と respond
がある。
どちらも、正規表現で一致した場合にいろいろな動作をさせることができる。
hear
hear
はそのルーム内の発言を見て、その単語があれば反応するようにするもの。
上記の例で行くと、下記のようなメッセージに反応する。
- Stop badgering the witness
- badger me
- what exactly is a badger anyways
respond
respond
は hubot に対してメッセージを送信した場合に、反応するようにするもの。
上記の例で行くと、下記のようなメッセージに反応する。
(HAL
が Hubot の名前。/
が alias となっている場合)
- hal open the pod bay doors
- HAL: open the pod bay doors
- @HAL open the pod bay doors
- /open the pod bay doors
send
と reply
レスポンスとしては、何種類かあるが、その中でも send
と reply
の使用頻度が高そう。
send
send
はルームで通常の発言をするもの。
reply
reply
は、正規表現で一致する発言をした人に対して、メンションを付けて発言をするもの。
サンプルスクリプトを書いてみる
試しにまったく需要がないと思われるスクリプトを書いてみた。
module.exports = (robot) ->
robot.hear /unk/i, (msg) ->
msg.reply "(poo)"
HipChat のルーム内で、unk
という文字列があったら、発言した人に対して HipChat の絵文字の (poo)
で返してくれるスクリプト。
試してみた。
ちゃんと動いた! ╭( ・ㅂ・)و ̑̑ グッ !
random
ランダムでレスポンスを返したいときには、msg.random
というメソッドもある。
ans = ['グー', 'チョキ', 'パー']
module.exports = (robot) ->
robot.respond /janken/i, (msg) ->
msg.reply msg.random ans
janken という文字列を見て、グー、チョキ、パーをランダムで返してくれるスクリプト。じゃんけんの勝ち負けの判別までは入れてない。
ま、負けた。やるな、Hubot。レスポンスに若干時間がかかるので、後出しっぽく見えるけど(笑)
環境変数
環境変数を使いたい場合は、process.env
を使う。prefix として、HUBOT_
を使うのが慣習みたいだ。
hello = process.env.HUBOT_HELLO
module.exports = (robot) ->
robot.hear /hello/i, (msg) ->
msg.send "#{hello}, #{msg.message.user.name}"
hello
という文字列をみて、環境変数 HUBOT_HELLO
で設定した値を返してくれる。今回は、環境変数 HUBOT_HELLO
に Hey YO
を設定している。
もうちょっとだけ実用的なスクリプトを書いてみた
もっとちょっとマシなスクリプトを書いてみないと、Hubot を導入するメリットとか分かりづらいので、stock <証券コード>
で Hubot にメッセージを送ると、Yahoo!ファイナンスから株価を取得するスクリプトを書いてみた。
request = require 'request'
cheerio = require 'cheerio'
module.exports = (robot) ->
robot.respond /stock (.*)/i, (msg) ->
code = msg.match[1]
options =
url: 'http://stocks.finance.yahoo.co.jp/stocks/detail/?code=' + code
timeout: 2000
request options, (err, res, body) ->
$ = cheerio.load body
company_name = $('th.symbol h1').text()
current_price = $('td.stoksPrice').eq(1).text()
msg.send "#{company_name}: #{current_price}円"
ちゃんと取得できた。サクッと株価が確認できていい感じ。
request と cheerio を使ってみた。(実際に動かす場合は、request
と cheerio
のインストールが必要なので注意)
今回はサンプルスクリプトなので、エラーハンドルとか実装はしていない。
今後の取り組みとして
Hubot を触ってみて、デフォルトでもいろいろなことが出来るが、独自でスクリプトも書いて使えるので、うまく利用できればかなり業務の効率もアップしそうな印象を受けた。
いちいちブラウザで確認しないといけない定形作業とか、HipChat 上でサッとできれば良さそう。
Hubot の使い方について、もっと調べて業務効率化を進めたい。
また、他の企業がどのような使い方をしているのか参考にさせていただいて、良さそうな使い方があればどんどん使っていきたいと思っている。
「うちはこんな風に使っている」「このスクリプトが便利」等の情報があれば、教えていただけると助かります。
情報お待ちしておりますm(_ _)m