GitHub社謹製! bot開発・実行フレームワーク「Hubot」

第1回Hubotとは何か

本連載では、GitHub社が開発したチャットbot開発・実行フレームワークである「Hubot」を使用して、チャットツールにオリジナルのbotを住まわせ、開発フローに組み込むことで開発を楽にする方法について解説していきます。

botとはなにか

開発の現場で、開発チーム内のコミュニケーションのためにIRCなどのチャットツールを導入することは、よく見る光景だと思います。そんなチャットツールに常駐してチャット経由でコマンドを待ち受けて実行したり、決められた条件に従ってチャットに発言してチャットの参加者に通知したりするようなプログラムのことをbotと呼びます。

Skype、HipChatやChatWorkなどコミュニケーションツールが多様化した現代においても、それぞれのチャットツールに対応したbotが開発されており、botを開発するためのフレームワークも様々な形で提供されています。botを導入することで、定型的な処理を普段使っているチャットツールを通して自動化したり、人工無能のような受け答えをさせることで仕事上のコミュニケーションにちょっとした遊び心を持ち込んだりと、毎日の開発を豊かにすることができます。

また、近年では、開発現場に留まらず、Twitterで定期的に発言するbotが多くの一般ユーザにフォローされているなど、botの裾野は以前にも増して広がっているようです。

Hubotとはなにか

Hubotの特徴

botを作り動かすことは大変便利で楽しいものですので、世の中には、開発言語やチャットツールごとにbotを作成するための様々なフレームワークが存在します。たとえば、PerlでIRCのbotを作るならikachanWebサービスでTwitterのbotを作るならtwittbotが有名なところでしょうか。

そんな中で、今回取り上げるHubotは、GitHub社が開発しMITライセンスで公開しているNode.jsでbotを作り動かすためのフレームワークです。

Hubotの大きな特徴に、様々なチャットツールに対応している点があります。たとえば、先ほど取り上げたikachanは、IRC用のbotを作るためのフレームワークであり、Twitterのbotを作る目的には使えません。一方でtwittbotはTwitter専用であり、IRC用のbotを作ることはできません。しかし、Hubotは、Hubotとチャットツールをつなぐモジュールである「Adapter」を切り替えることで様々なチャットツールに接続することができます。

たとえば、IRC用に作成したbotをそのままHipChatやChatWorkなど新しいチャットツールでも使用できるわけですから、⁠新しいチャットツールを導入することになって、これまでのbotを書き直さないといけない」といった問題から解放されることになります。また、チャットツールの垣根を越えてbotを拡張するスクリプトを共有することができるため、他の開発者との間でスクリプトの共有も容易に行えます。

Hubotは、⁠多くのチャットツールに対応させることができる」うえにNode.jsが動く環境ならnpmを使って「簡単に導入」でき、CoffeeScriptかJavaScriptで「簡単にスクリプトを書いて拡張できる」ため、これからbotを導入しようと考えている方、IRCなどから新しいチャットツールに移るために新しいbotのフレームワークを探している方など、多くの方にお勧めです。

ちなみに、Hubotの読み方ですが、公式Twitterによると⁠hue-bot⁠ということなので、カタカナで書くと「ヒュボット」あたりになるようです。

Hubotの構造

Hubotのシステムは、大きく分けてHubot自身のコアであるRobot、チャットツールと対話するためのAdapter、botの動作を規定するscriptsの3つに分けて考えることができます。Hubotのおもな構成要素を図1に示します。

図1 Hubotのおもな構成要素
図1 Hubotのおもな構成要素

Robot

Hubotを起動したときにまず実行されるのがこのRobotです。Robotは、チャットツールからメッセージを受け取り、スクリプトを実行する一連の流れを処理します。Robotには、ここまでに挙げた以外にも様々な機能が内蔵されています。たとえば、botを動かしていく中で永続化したいデータがあった場合にRedisやMongoDBといった外部ストレージに保存する⁠brain⁠や、外部からbotにhttp経由で命令を送ることができる⁠httpd⁠などです。botを作成していく中で欲しくなってくるこのような機能を最初から備えていることもHubotの魅力の1つです。これらの機能の詳細については、連載の後の回で解説します。

Adapter

Adapterは、チャットツールからRobotに誰かが入力した発言などチャットの状況を入力し、スクリプトなどによって作られた出力をチャットツールに伝える役割をします。初期状態では、シェル上でHubotと対話できるshell adapterと、Campfireというチャットツールに接続するCampfire AdapterいうAdapterが付属しています。

その他にも、様々なAdapterがサードパーティーから提供されているため、大抵の場合は自分が使っているチャットツールに対応したAdapterが見つかるのではないでしょうか。公開されているAdapterの例を次に示します。

サービス名Adapter
IRCHubot IRC Adapter
TwitterHubot Twitter Adapter
HipChathubot-hipchat
ChatWorkhubot-chatwork
Slackhubot-slack

また、Adapterの自作も容易ですので、既存のAdapterが存在しないチャットツールに対しても専用のAdapterを作成することで対応が可能です。

scripts

Hubotのbotとしての動作を規定するスクリプトは、CoffeeScriptかJavaScriptで記述し、Node.js上で動かすことになります。使用者人口の多いJavaScriptでスクリプトを書けるうえにnpmを通じて豊富なNode.jsのライブラリを活用できることは大きな利点です。また、様々な目的に応じて作成されたスクリプトがcommunity scriptsとしてGitHub上に公開されています。

スクリプトの例を次に示します。

util = require 'util'

module.exports = (robot) ->
  robot.respond /今日は何日?/i, (msg) ->
    date = new Date
    msg.send util.format(
      '%d年%d月%d日です',
      date.getFullYear(),
      date.getMonth() + 1,
      date.getDate()
    )

これは、Hubotに「今日は何日?」と尋ねると今日の日付を教えてくれるという単純なスクリプトですが、非常にシンプルに記述できることがわかると思います。スクリプトの具体的な書き方については、連載の後の回で解説します。

Hubotでできること

Hubotは、スクリプトを書くことで好きなように拡張できるため、おおよそプログラムで実行可能なあらゆることを実行できます。活用例を次に示します。

  • 発言に含まれるURLのタイトルを表示
  • TwitterのURLから発言内容を表示
  • ミーティング時間の通知
  • サーバの負荷が上がった場合に通知
  • GitHubのリポジトリにpull requestが送られた場合に通知
  • Jenkinsでのビルドの失敗時にエラーを通知
  • デプロイの実行

これらのうちのいくつかは、連載の後の回でサンプルスクリプトを掲載します。

まとめ

Hubotがどのようなものかおわかりいただけたでしょうか。Hubotは、開発元のGitHub社内でも勿論使われており、単純な自動化ツールとしてだけではなく、開発者間の共有コンソールとして活用しているそうです。Hubotは、仕組みがシンプルなだけに、導入する開発現場ごとに適した活用方法を見出だせるのではないでしょうか。

次回は、実際にHubotをインストールして動かしてみます。

参考文献
https://hubot.github.com/
https://speakerdeck.com/johndbritton/ops-for-everyone

おすすめ記事

記事・ニュース一覧