修正
最新のhubot-slackで十分とのご指摘をいただいたので書き直しました。
制約等
- 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を有効化してもらう
- hubot integrationの場合と違い、bot用ユーザーが必要なので作成する
- 作成したユーザーでbotログインしてXMPP用パスワードを確認しておく
Dockerfile
試行錯誤の結果以下のようになっている。
- 変更の影響範囲を最小限にする意図で、node関連の作業はnon-rootユーザーのディレクトリで、
npm install
はグローバルインストールなしで行うようにしている。 - hubotの作成はinteraction無視で自動にしている。
yes | yo hubot --defaults
- 目的通り、
HUBOT_XMPP_ROOMS
にはprivate groupを含めることができる。
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
する。
時計がずれているのはcontainer側でまだntpとか設定していないため。
HUBOT_LOG_LEVEL
をdebug
にしていると、docker logs CONTAINERID
などでdebug logが見られる。単純ではあるが、adapterが受け取った文字列がscriptに渡されて正規表現マッチさせている様子がわかる。
[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のエラーが出ているので、使わなくするか、エラーが出ないようにする