DockerでSlack hubotコンテナを作成するまでメモ

### 修正
[最新のhubot-slackで十分とのご指摘をいただいたので書き直しました。](http://qiita.com/satzz@github/items/50589588b376e910deaf)

### 制約等
* herokuの代わりにローカルのCentOS 6.5で動かす
* Slackのprivate groupでも使えるようにするため、adapterとして`hubot-slack`の代わりに`hubot-xmpp`を使う

### バージョン
以下で行っているが、バージョンの制約については未検証
* `Docker` 1.3.2
* `nodebrew` 0.7.5
* `node` 0.10.35
* `npm` 1.4.28
* `yo` 1.3.3
* `coffee` 1.8.0
* `hubot` 2.11.0
* `hubot-xmpp` 0.1.12

### 準備

- team管理者にお願いしてXMPP gatewayを有効化してもらう
	- https://TEAM.slack.com/admin/settings#permissions
- hubot integrationの場合と違い、bot用ユーザーが必要なので作成する
- 作成したユーザーでbotログインしてXMPP用パスワードを確認しておく
 - https://TEAM.slack.com/account/gateways


### Dockerfile
試行錯誤の結果以下のようになっている。

- 変更の影響範囲を最小限にする意図で、node関連の作業はnon-rootユーザーのディレクトリで、`npm install`はグローバルインストールなしで行うようにしている。
- hubotの作成はinteraction無視で自動にしている。`yes | yo hubot --defaults`
- 目的通り、`HUBOT_XMPP_ROOMS`にはprivate groupを含めることができる。



```Dockerfile:
FROM centos:centos6
RUN sed -i 's/mirrorlist=http/#mirrorlist=http/g'                                    /etc/yum.repos.d/CentOS-Base.repo
RUN sed -i 's!#baseurl=http://mirror.centos.org!baseurl=http://ftp.riken.jp/Linux!g' /etc/yum.repos.d/CentOS-Base.repo
RUN yum -y install which
RUN yum -y install perl
RUN yum -y install tar
RUN yum -y install gcc-c++
RUN yum -y install libicu-devel.x86_64
RUN useradd hubot


USER hubot
RUN mkdir /home/hubot/myslackbot
WORKDIR /home/hubot/myslackbot

RUN curl -k -L git.io/nodebrew | perl - setup
ENV PATH /home/hubot/.nodebrew/current/bin:$PATH
RUN nodebrew install v0.10.35
RUN nodebrew use 0.10.35
ENV PATH /home/hubot/myslackbot/node_modules/.bin:$PATH

RUN npm install  generator-hubot
RUN npm install  yo
RUN npm install  coffee-script
RUN npm install  hubot
RUN npm install  hubot-xmpp

RUN yes | yo hubot --defaults

ENV HUBOT_LOG_LEVEL     debug

# https://TEAM.slack.com/account/gateways
ENV HUBOT_XMPP_HOST     conference.TEAM.xmpp.slack.com
ENV HUBOT_XMPP_USERNAME BOTNAME@conference.TEAM.xmpp.slack.com
ENV HUBOT_XMPP_PASSWORD TEAM.PASSWORD
ENV HUBOT_XMPP_ROOMS    CHANNEL1@conference.TEAM.xmpp.slack.com,GROUP2@conference.TEAM.xmpp.slack.com
ENV HUBOT_XMPP_PORT     5222

RUN hubot -a xmpp
```
これを`docker build .`する。


### 対話
botが起動したのを確かめたら`/invite`する。
![スクリーンショット 2014-12-28 15.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/281/05349aff-b07b-9ec7-a2e1-99b684e2defa.png "スクリーンショット 2014-12-28 15.54.25.png")
時計がずれているのはcontainer側でまだntpとか設定していないため。


`HUBOT_LOG_LEVEL`を`debug`にしていると、`docker logs CONTAINERID`などでdebug logが見られる。単純ではあるが、adapterが受け取った文字列がscriptに渡されて正規表現マッチさせている様子がわかる。

```console:
[Tue Dec 23 2014 13:45:23 GMT+0000 (GMT)] DEBUG Received message: hubot time in room: gt@conference.conference.TEAM.xmpp.slack.com, from: satoda. Private chat JID is satoda@conference.TEAM.xmpp.slack.com
[Tue Dec 23 2014 13:45:23 GMT+0000 (GMT)] DEBUG Message 'hubot time' matched regex //^\s*[@]?Hubot[:,]?\s*(?:TIME$)/i/
[Tue Dec 23 2014 13:45:23 GMT+0000 (GMT)] DEBUG Sending to gt@conference.conference.TEAM.xmpp.slack.com: Server time is: Tue Dec 23 2014 13:45:23 GMT+0000 (GMT)
[Tue Dec 23 2014 13:45:24 GMT+0000 (GMT)] DEBUG Received message: Server time is: Tue Dec 23 2014 13:45:23 GMT+0000 (GMT) in room: gt@conference.conference.TEAM.xmpp.slack.com, from: xmppsatoda. Private chat JID is undefined
```


### 検証パスした事項
- `HUBOT_XMPP_PORT`の指定は不要かも
- `package.json`を外から`ADD`するようにしてもいいかもしれないが、うまくできなかった(いずれにしても`yo hubot`が必要?)
- node 0.11のときにうまくできなかった
- (hubot関係ないけど)`yum`のrepository指定は外してもよいかも

### 宿題
- botを`/invite`したタイミングがhubotが起動・接続する前であった場合は、いったん`/remove`してから`/invite`する必要がある？これ何とかしたい。
- 接続・プロセス管理、デーモン化
- hubot logにredisとかherokuのエラーが出ているので、使わなくするか、エラーが出ないようにする