---
title: HubotをCloud Foundryにデプロイする
tags: ["Cloud Foundry", "Hubot"]
categories: ["Service", "PaaS", "CloudFoundry"]
date: 2016-01-14T17:18:51Z
updated: 2016-01-15T00:42:46Z
---

[Hubot](https://hubot.github.com/)をCloud Foundryにデプロイします。
公式サンプルはHerokuを使っているけど、Herokuの無料枠で無理やり動かすハックが入っていて気持ちが悪いです。ここはCloud Foundryを使いましょう。

この記事では[Pivotal Web Services](https://run.pivotal.io/)を使いますが、他のCloud Foundryでも大体同じです。

``` console
$ cf login -a api.run.pivotal.io
```

(Cloud Foundry CLIについては[こちらの記事](https://blog.ik.am/entries/359)を参照。)

まずは雛形プロジェクト作成。今回は[Slack](https://slack.com/)と連携する例を紹介します。

``` console
$ 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`

``` diff
     "hubot-help": "^0.1.3",
-    "hubot-heroku-keepalive": "^1.0.2",
     "hubot-maps": "0.0.2",
```

* `external-scripts.json`

``` diff
   "hubot-help",
-  "hubot-heroku-keepalive",
   "hubot-google-images",
```

デプロイ後の実行コマンドは生成されている`Procfile`がそのまま使えますので、あとは`cf push`するだけです。buildpackにはNode.jsが自動で選択されます。

``` console
$ cf push demohubot -m 256m --no-start
```

ここではアプリケーション名を`demohubot`にしています。
メモリは小さければ小さいほど安く運用できますが、小さくすぎるとメモリ不足で起動しないので256MBを指定しました。もう少し削れるかもしれません。
後で環境変数を設定するのでいったん`--no-start`をつけてアプリケーションのアップロードだけ行います。

次にSlackと連携します。

チーム名をクリックして、「Apps & Custom Integratio...」を選択、

<img width="228" alt="スクリーンショット 2016-01-15 1.41.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/1852/52d62468-5578-c4b3-371b-50dc04edaf67.png">


「Configure」をクリック、

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/cd67d19a-31bb-8ea7-5225-5eaeb0d235a7.png)

「Hubot」を検索（InstallされていなかったらInstall）して、「Hubot」をクリック。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/386c6ded-ee66-e954-e940-08cc0212ce7f.png)

「Add Configuration」をクリック、

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/ae76dfe8-8b3f-e825-002e-b8caeda00a50.png)

「Username」を入力して、「Add Hubot Integration」をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/af3406ae-93ea-d901-d1c9-059b76241605.png)

APIトークンをコピーしてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/27221963-8cfe-49e8-becd-8af43508aeeb.png)

コピーしたトークンを`cf set-env`で環境変数`HUBOT_SLACK_TOKEN`に設定します。

``` console
$ cf set-env demohubot HUBOT_SLACK_TOKEN <APIトークン>
```

次に、Hubotのメッセージを保存するRedisを用意します。

Pivotal Web Servicesでは`rediscloud`というサービスの`30mb`というプランを無料で利用できます。
このプランで`hubot-redis`というサービスを作成して、`demohubot`にバインドします。

``` console
$ cf create-service rediscloud 30mb hubot-redis
$ cf bind-service demohubot hubot-redis
```

`cf env`で環境変数が追加されていることがわかります。

``` console
$ 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
`ハードコードしてしまいます・・(要改善)

``` console
$ cf set-env demohubot REDIS_URL redis://aaaaaaaaaaaaaa@pub-redis-xxxxx.us-east-a-b.c.ec2.garantiadata.com
```

以上で設定完了です。アプリを起動するのみ。

``` console
$ cf start demohubot
```

`cf logs demohubot --recent`で次のようなログが出ていればOKです。

``` console
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してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/9bb082c7-2d6d-e5b8-7d77-ec8958cb6b0b.png)

基本的なデプロイ方法は以上の通りです。Hubotをカスタマイズして再度`cf push`してください。


256MBだと無償期間(60日)後は$5.40/monthがかかります。もうちょいメモリを削れるはず・・
