インフラ

今さらな感じはするけど Hubot を導入してみた

gene

社内の HipChatHubot を導入してみた

弊社では社内のコミュニケーションツールとして、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 を記述する。
hubot_hipchat

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

hubot_pug
仕事に疲れたときに癒される…かもしれない。

画像検索してランダムで表示する

画像検索をして、結果をランダムで返してくれる。

@bot img <検索するキーワード>

hubot_ramen
日本語での検索もOK。(ラーメン食べたくなってきた...)

YouTube検索

YouTub から検索した結果を返してくれる。

@bot youtube <曲名など検索ワード>

hubot_youtube

  • 上記の曲は、去年の夏の開発合宿の思い出の曲。
Github Status

前述の hubot-scripts.json に、["github-status.coffee"] を記述することで、Github の Status を確認できる。

@bot github status

hubot_github
「あれ?もしかして、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
hearrespond

Hubot のメソッドとして、hearrespond がある。
どちらも、正規表現で一致した場合にいろいろな動作をさせることができる。

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
sendreply

レスポンスとしては、何種類かあるが、その中でも sendreply の使用頻度が高そう。

send

send はルームで通常の発言をするもの。

reply

reply は、正規表現で一致する発言をした人に対して、メンションを付けて発言をするもの。

サンプルスクリプトを書いてみる

試しにまったく需要がないと思われるスクリプトを書いてみた。

module.exports = (robot) ->
  robot.hear /unk/i, (msg) ->
    msg.reply "(poo)"

HipChat のルーム内で、unk という文字列があったら、発言した人に対して HipChat の絵文字の (poo) で返してくれるスクリプト。

試してみた。
hubot_unk
ちゃんと動いた! ╭( ・ㅂ・)و ̑̑ グッ !

random

ランダムでレスポンスを返したいときには、msg.random というメソッドもある。

ans = ['グー', 'チョキ', 'パー']

module.exports = (robot) ->
  robot.respond /janken/i, (msg) ->
    msg.reply msg.random ans

janken という文字列を見て、グー、チョキ、パーをランダムで返してくれるスクリプト。じゃんけんの勝ち負けの判別までは入れてない。
hubot_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_HELLOHey YO を設定している。
hubot_hello

もうちょっとだけ実用的なスクリプトを書いてみた

もっとちょっとマシなスクリプトを書いてみないと、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}円"

hubot_stock
ちゃんと取得できた。サクッと株価が確認できていい感じ。
requestcheerio を使ってみた。(実際に動かす場合は、requestcheerio のインストールが必要なので注意)
今回はサンプルスクリプトなので、エラーハンドルとか実装はしていない。


今後の取り組みとして

Hubot を触ってみて、デフォルトでもいろいろなことが出来るが、独自でスクリプトも書いて使えるので、うまく利用できればかなり業務の効率もアップしそうな印象を受けた。
いちいちブラウザで確認しないといけない定形作業とか、HipChat 上でサッとできれば良さそう。
Hubot の使い方について、もっと調べて業務効率化を進めたい。
また、他の企業がどのような使い方をしているのか参考にさせていただいて、良さそうな使い方があればどんどん使っていきたいと思っている。

「うちはこんな風に使っている」「このスクリプトが便利」等の情報があれば、教えていただけると助かります。
情報お待ちしておりますm(_ _)m

AUTHOR
gene
gene
記事URLをコピーしました