Docker + Yeoman + Hubot + Slack で簡単bot作成

ご存知、Hubotをわりとモダンなやり方で作ってみたのでご紹介します。コピペで作れます。Dockerでいれるので環境が汚れません。

satoshun00

2 minute read

satoshun00です。 ご存知、Hubotを、ちょっとモダンなやり方で作ってみたのでご紹介します。

実際にFennecLabチームで使用しているfennecbotはこの手順で作りました。

Githubにリポジトリを公開しています。

https://github.com/fenneclab/fennecbot

pros

  • コピー&ペーストで作れます
  • Dockerでいれるので環境が汚れません

cons

  • SlackとHubotがURLで連携するため、リモートの置き場所が必要です
    • 今回はさくらVPSで運用

今回はMac OS X(ローカル)とCentOS6(さくらVPS, 実運用)に入れました。

Installation

Docker

Docker Documentationを参考にインストールします。

Mac OS X(ローカル)

# インストーラーにてboot2dockerパッケージをインストール後
> boot2docker init
> boot2docker start
> $(boot2docker shellinit)

CentOS6(さくらVPS, 実運用)

> sudo yum install docker-io
Yeoman

YeomanはNode.jsアプリケーションの雛形ジェネレータです。

雛形を作るだけなのでローカルのマシンに入れるだけでよいでしょう。

Mac OS X(ローカル)

> brew install node # nodeがインストールされていなければ…
> npm install -g yo

Hubotアプリケーションを作成

Hubotアプリケーションを作成します。

ローカルマシンにて以下のコマンドを実行します。

> npm install -g generator-hubot # Yeoman用、Hubotジェネレーター
> mkdir test-hubot && cd test-hubot
> yo hubot

対話モードでいろいろ訪ねられるので適当に答えます。

Bot adapterslackにして下さい。

yo hubot

デフォルトでHubotスクリプトがいくつか入っていますね。

scripts

HubotDockerコンテナーの作成

HubotアプリケーションをDockerのコンテナーとして立ち上げます。

test-hubotディレクトリに以下のDockerfileを作成します。

FROM node:latest

# コンテナにHubotアプリケーションを持っていく
RUN mkdir /bot && cd /bot
ADD . /bot

EXPOSE 9999

WORKDIR /bot

# docker runした時の実行コマンド
CMD ["bin/hubot", "--adapter", "slack"]

Dockerイメージをビルドします。

> docker build -t test-hubot .

Dockerコンテナーを起動します。

# ローカルマシンではSlackとの連携が出来ないため`CMD`をオーバーライド
> docker run -v "$(pwd)":/bot \
    -it -p 9999:9999 \ # インタラクティブモードでコンテナーを起動
    test-hubot \
    bin/hubot # --adapterを指定せずデフォルト(Shellモード)にしておく

docker runのオプションに-itを指定したので、対話的にHubotが動けば成功です。(Ctrl + CでHubotを終了すると、コンテナーもstopします)

Hubot> hubot ping
Hubot> PONG

作成したtest-hubotをGitHubにpushしておきましょう。

Hubot - Slack連携

Slackの設定

SlackのIntegration設定にて、Hubot Integrationを追加し、項目を埋めます。

  • Hubot URL: リモートのURL(今回だとさくらVPSのIP) + Hubotの待ち受けポート
    • ex) 10.0.0.3:9999
  • Token: 後で使うのでどっかにコピーしておきましょう
  • Descriptive Label: 空欄
  • Customize Icon: 愛着のわく何かにしておくといいでしょう
Hubotをリモートで起動

さくらVPSで用意した、CentOSにて作業します。

# 先ほどpushしたHubotリポジトリをclone
> git clone git@github.com:your-org/test-hubot.git
> cd test-hubot
# 先ほどと同じ要領でDockerイメージをビルド
> docker build -t test-hubot .

Hubotの入ったDockerコンテナーを起動します。 (DockerfileCMDで指定したデフォルトの起動コマンドでdocker runされます)

> docker run -e HUBOT_SLACK_TOKEN="[先ほど設定したToken]" \ 
  -e HUBOT_SLACK_TEAM="[Slackのチーム名]" \
  -e HUBOT_SLACK_BOTNAME="[botの名前]" \
  -e PORT=9999 \
  -d -p 9999:9999 \ # -d でdaemon起動
  -v "$(pwd)":/bot \
  test-hubot

Slackにて指定したbotに呼びかけてみましょう。

反応が返ってくれば成功です!

cat me

+α(& やり残したこと)

  • docker runしたHubotへの変更の反映、再起動は?
  • 運用するリモートサーバーがない
  • git pull -> docker restart CONTAINERIDが面倒くさい」
    • ローカルで作成したHubotのDockerイメージをDocker Hubpushし、運用するためのリモートサーバーにてdocker pullするのもイケると思います
  • 「会社のSlackだから勝手にIntegrationを追加できない」
    • SlackはIRCサーバーとしても使えます
    • HubotのIRCAdapterを利用するとよいでしょう
  • Hubotの立ち位置
    • 個人が趣味プロではじめたHubotに、いつのまにか業務が依存しだしたら、Jenkinsとかチームが運用できる手段を真剣に考えた方がいいと思います
    • Githubみたいな使い方を目指すなら運用チームがいないときついと思います
    • 私個人としては、Hubotはちょっとした業務補助ツール兼、おもちゃくらいです

参考