HubotをCloud Foundryにデプロイします。 公式サンプルはHerokuを使っているけど、Herokuの無料枠で無理やり動かすハックが入っていて気持ちが悪いです。ここはCloud Foundryを使いましょう。
この記事ではPivotal Web Servicesを使いますが、他のCloud Foundryでも大体同じです。
$ cf login -a api.run.pivotal.io
(Cloud Foundry CLIについてはこちらの記事を参照。)
まずは雛形プロジェクト作成。今回はSlackと連携する例を紹介します。
$ npm install -g yo generator-hubot
$ mkdir demohubot
$ cd demohubot/
$ yo hubot --adapter slack --defaults
デフォルト値を使いたくない場合は--defaultsを外して対話的に値を入力してください
デフォルトではHeroku用ハックが入っているため、それを削除します。package.json
とexternal-scripts.json
から"hubot-heroku-keepalive"
の行を削除してください。
package.json
"hubot-help": "^0.1.3",
- "hubot-heroku-keepalive": "^1.0.2",
"hubot-maps": "0.0.2",
external-scripts.json
"hubot-help",
- "hubot-heroku-keepalive",
"hubot-google-images",
デプロイ後の実行コマンドは生成されているProcfile
がそのまま使えますので、あとはcf push
するだけです。buildpackにはNode.jsが自動で選択されます。
$ cf push demohubot -m 256m --no-start
ここではアプリケーション名をdemohubot
にしています。
メモリは小さければ小さいほど安く運用できますが、小さくすぎるとメモリ不足で起動しないので256MBを指定しました。もう少し削れるかもしれません。
後で環境変数を設定するのでいったん--no-start
をつけてアプリケーションのアップロードだけ行います。
次にSlackと連携します。
チーム名をクリックして、「Apps & Custom Integratio...」を選択、
「Configure」をクリック、
「Hubot」を検索(InstallされていなかったらInstall)して、「Hubot」をクリック。
「Add Configuration」をクリック、
「Username」を入力して、「Add Hubot Integration」をクリック
APIトークンをコピーしてください。
コピーしたトークンをcf set-env
で環境変数HUBOT_SLACK_TOKEN
に設定します。
$ cf set-env demohubot HUBOT_SLACK_TOKEN <APIトークン>
次に、Hubotのメッセージを保存するRedisを用意します。
Pivotal Web Servicesではrediscloud
というサービスの30mb
というプランを無料で利用できます。
このプランでhubot-redis
というサービスを作成して、demohubot
にバインドします。
$ cf create-service rediscloud 30mb hubot-redis
$ cf bind-service demohubot hubot-redis
cf env
で環境変数が追加されていることがわかります。
$ cf env demohubot
System-Provided:
{
"VCAP_SERVICES": {
"rediscloud": [
{
"credentials": {
"hostname": "pub-redis-xxxxx.us-east-a-b.c.ec2.garantiadata.com",
"password": "aaaaaaaaaaaaaa",
"port": "17510"
},
"label": "rediscloud",
"name": "hubot-redis",
"plan": "30mb",
"tags": [
"Data Stores",
"Data Store",
"Caching",
"Messaging and Queuing",
"key-value",
"caching",
"redis"
]
}
]
}
}
HubotにRedisのURLを知らせるためにREDIS_URL
をいう環境変数を設定する必要があります。本当はバインドされた環境変数を(JSON加工などして)直接使うのが良いのですが、ここでは設定されたRedisのホスト名とパスワードを見てREDIS_URLni
ハードコードしてしまいます・・(要改善)
$ cf set-env demohubot REDIS_URL redis://aaaaaaaaaaaaaa@pub-redis-xxxxx.us-east-a-b.c.ec2.garantiadata.com
以上で設定完了です。アプリを起動するのみ。
$ cf start demohubot
cf logs demohubot --recent
で次のようなログが出ていればOKです。
2016-01-14T16:34:24.000+00:00 [APP] OUT [Thu Jan 14 2016 16:34:24 GMT+0000 (UTC)] INFO Slack client now connected
2016-01-14T16:34:24.000+00:00 [APP] OUT [Thu Jan 14 2016 16:34:24 GMT+0000 (UTC)] INFO hubot-redis-brain: Discovered redis from REDIS_URL environment variable
あとはSlackでHubotをチャネルにinviteしてください。
基本的なデプロイ方法は以上の通りです。Hubotをカスタマイズして再度cf push
してください。
256MBだと無償期間(60日)後は$5.40/monthがかかります。もうちょいメモリを削れるはず・・