Hubotとchatworkを連携させてみる

kotohが2015/08/05 19:04:31に投稿

Hubot

Hubot とは?

GitHubが提供するBotフレームワークです。

Hubot is your company's robot. Install him in your company to dramatically improve and reduce employee efficiency.
GitHubのサイト より。

Hubotは、コマンドを受け付け、指定されたコマンドに応じた処理を実行し、結果を表示する機能を提供するフレームワークです。
入出力先として、コマンドラインのみではなくHubotが対応するチャットツールを選ぶことができるのが特徴です。

Hubotは、デプロイをはじめとした開発タスクの自動化などを可能にします、これらを独自のスクリプトを書くことで追加できます。
また、HubotはWebのインターフェイスも持っているので、Redmineのようなウェブフック可能なサービスとも連携できます。

何がうれしいの?

運用におけるコマンドラインでの操作は、個人で閉じたものになることがよくあります。
その結果、いつも作業する人しかやり方を知らない、その人がいないと作業がストップしてしまう。といったことが起こってしまいがちです。
Hubotを使い、その操作をチャットという場所で行なうことで、操作を共有することができます。

GutHubでは実際の開発プロセスにHubotを導入しているそうです、こうした手法をChatOps(Operations・運用)と呼んでいます。

技術情報

Hubotは、CoffeeScript で書かれていて、Node.jsで動きます。
HubotにはAdapterとScriptsという概念が存在します。
また、データの永続化にはredisを利用しています。

Adapter

チャットツールからのメッセージをHubotに伝え、Hubotからの応答をチャットツールに伝える役割をします。
チャットツールからHubotを利用するためには、対応するAdapterが必要になります。

こちらにアダプタの一覧が掲載されています。

Scripts

チャットツールからのメッセージに応じて、Hubotの動作をScriptで定義することができます。
Scriptはjavascriptまたは、CoffeeScriptで書くことができます。

インストール

Ubuntu Server 14.04 にHubotをインストールしてみます。

node.js

nodebrew を使ってnode.jsをインストールします。

$ wget git.io/nodebrew
$ perl nodebrew setup
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> .bashrc
$ source ~/.bashrc
$ nodebrew install latest  # <- 時間がかかります
$ nodebrew use latest
$ node -v
v0.12.7

Hubot

$ npm install -g hubot coffeescript

redis-server

$ sudo apt-get install redis-server

yeoman

$ npm install -g yo generator-hubot

hubot作成

$ mkdir -p myhubot
$ cd myhubot
$ yo hubot

対話的にユーザー情報を聞いてくるが、全て空でEnter。

hubot起動

$ bin/hubot

で、起動します。

トラブルシューティング

起動時にエラーが出たのでその対応方法を書いておきます。

ERROR Error loading scripts from npm package - Error: Cannot find module 'hubot-diagnostics'
必要なモジュールにPATHが通っていない模様。

$ echo 'export NODE_PATH=$NODE_PATH:./node_modules' >> ~/.bashrc
$ source ~/.bashrc

で、対応。

ERROR Error: listen EADDRINUSE
既にポートが使われている、デフォルトでは8080。

$ export PORT=9999

で、ポートを変更。

$ bin/hubot
Hubot> hubot ping
PONG

起動できた。

chatworkと連携

弊社では、社内でのチャットツールにchatworkを利用しています。
Hubotをchatworkを連携してみます。

chatwork API の申請

Hubot用のchatworkアカウントを新しく作成します。(このアカウントがBOTとして機能することになります。)
また、作成したHubot用アカウントでchatworkのAPI利用申請を行う必要があります。

こちら から申請します。

しばらくするとメールでAPIの利用開始が通知されます。
Hubotアカウントでchatworkにログインし、右上 -> 動作設定 から API発行を選択して、キーを取得します。

Hubotを参加させたいグループチャットにHubotアカウントを招待し、承認しておいて下さい。

取得したAPI_KEYを環境変数に登録します。

export HUBOT_CHATWORK_TOKEN="API_KEY"
export HUBOT_CHATWORK_ROOMS="roomId"  
export HUBOT_CHATWORK_API_RATE="500"

これらの環境変数はbin/hubot に書いておいた方が楽かもしれません。

roomIdはグループチャットのIDです、URLの #!rid の後ろの数字がroomIdとなります。
複数のグループチャットにBOTを参加させたい場合はroomIdをカンマ区切リで並べればOKです。

HUBOT_CHATWORK_API_RATE

はHubotがchatworkのグループチャットを1時間あたりにポーリングする回数です。
ドキュメントには最大1200回までとあります。

Hubotにchatwork用アダプタをインストール

先程作成した、myhubotにchatworkアダプタをインストールしてみます。

$ cd path/to/myhubot
$ npm i hubot-chatwork --save

起動と動作確認

Hubotを起動します。

$ bin/hubot -a chatwork -n botname

botnameは好きに設定して下さい。

chatworkから
botname ping
と投稿すると。

BOTユーザーが
PONG
を返せば、成功です。

chatworkにHubotから定時連絡する

弊社では、毎週水曜日の18:00から社内勉強会を開催しています。
先程のmyhubotに開始20分前にchatworkで通知する機能を追加します。

cronモジュールをインストールします。

$ cd path/to/myhubot
$ npm install cron --save

scripts/notify-study-meeting.coffee を以下の内容で作成

# Description:
#   Notification of the study meeting.

cronJob = require('cron').CronJob
module.exports = (robot) ->
  new cronJob('0 40 17 * * 3', () =>
    envelope = room: process.env.HUBOT_CHATWORK_ROOMS
    robot.send envelope, "もうすぐ社内勉強会の時間です。"
  ).start()

hubotを再起動すればOKです。
無事、17:40に勉強会の通知をすることができました。

まとめ

Hubotとchatworkを連携する方法を紹介しました。
様々な操作のアプトプットをチャットに集約できるだけでなく、コマンドの実行までチャットからできるというのはとても便利だと思います。
まずは、社内で利用しているツールのアウトプットをchatworkにまとめるところから始めてみようと思います。