【Windows版】Yeoman(generator-hubot)でSlack用ボットを作成しHerokuにデプロイする方法

## 概説
Qiitaで「slack heroku」といったキーワードで検索すると既に同じような投稿がたくさんあり、特にまとめる必要もないかとは思いましたが、「Windows環境」にフォーカスしたものは無かったようなのでザッとまとめました。
（ま、環境が整えば全てコマンドラインでの操作となるため、Macの場合とほぼ同じなんですけどね。。。）

ここでは、[Yeoman(generator-hubot)](https://github.com/github/generator-hubot)で作成した[Hubot](https://hubot.github.com)を[Heroku](https://www.heroku.com)にデプロイし、[Slack](https://slack.com)と連携するまでを示します。

@udzuraさんの「[Hubot + CoffeeScript ではじめるやわらかプログラミング入門](https://gist.github.com/udzura/0cb2447c305c51670414)」を読んで、「Windowsの方へ...」というメッセージに抗ってみようと思ったのは秘密です。

## 前提
これより説明する手順は、以下の環境で検証しています。

 - Windows 8.1 (64ビット)
 - Git for Windowsがインストール済み

## 事前準備
### Node.jsのインストール
- [Node.js](http://nodejs.org/)の公式サイトより環境に応じたパッケージ（例:node-v0.10.33-x64.msi）をダウンロードしインストールします。（2014/11/02時点ではv0.10.33が最新です）

![nodejs.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/e96bdb96-31a5-2228-a770-2c0f39d8ba30.png)

- インストールが完了したら、スタートメニューより「Node.js command prompt」を起動後、以下のコマンドを実行し、バージョンを確認しておきます。

![nodejscommandprompt.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/e81ee51a-9c08-5140-2d35-5d64ed08bbba.png)

```コマンド:コマンド
C:\Users\hoge>node -v
v0.10.33

C:\Users\hoge>npm -v
1.4.28
```

### Herokuアカウントの作成
- [Heroku](https://www.heroku.com/)アカウントを「[Sign up](https://signup.heroku.com/www-header)」から作成します。

![heroku_signup.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/8450c4c3-12f2-4cf0-8bc3-ad7486e17ecd.png)

- アドオンを無料枠で利用する場合でも、クレジットカードの登録をしておかないとアドオンのインストールに失敗するため、ログイン後、DashboardよりManage Account → Billingと遷移し、クレジットカード登録を済ませておきます。（**はまりポイント**）

![manageaccount.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/6e5b227f-1c64-a76b-58a9-905c1b5ae41a.png)

![billing.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/631163b2-e71e-550c-3967-a46476dac5c5.png)

### Heroku Toolbeltのインストール
- [Heroku Toolbelt](https://toolbelt.heroku.com/)のWindows版である[Heroku Toolbelt for Windows](https://toolbelt.heroku.com/download/windows)をダウンロードしインストールします。

![heroku_toolbelt.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/1fd35499-385a-4cf8-4d54-b5a81883827f.png)

- Heroku Toolbelt for Windowsのインストールの際、[Git for Windows](http://msysgit.github.io/)が既にインストール済みの場合は、「Select Components」の画面で「Custom Installation」を選択し「Git and SSH」のチェックを外します。未インストールの場合はデフォルトの「Full Installation」で構いません。

![heroku_toolbelt_select_component.png](https://qiita-image-store.s3.amazonaws.com/0/23093/741345ff-133a-a6f9-bca8-15f4936b25b5.png)

![heroku_toolbelt_select_component2.png](https://qiita-image-store.s3.amazonaws.com/0/23093/9ff56113-26c3-f7d0-263f-900e544623fb.png)


- インストールが完了したら、コマンドプロンプトより以下のコマンドを実行し、バージョンを確認しておきます。

```コマンド:コマンド
C:\Users\hoge>heroku version
heroku/toolbelt/3.12.1 (i386-mingw32) ruby/1.9.3
```

### 秘密鍵と公開鍵の作成
- Windowsの場合は[PuTTYgenを利用する](http://webkaru.net/linux/putty-ssh-login-public-key/)ことが一般的ですが、Git for Windowsに付属している[Git GUIを利用する](http://blog.infinity-dimensions.com/2012/01/git-gui-create-public-key.html)と簡単に作成できます。

![puttygen.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/464f6395-c880-1573-fc51-b347c231587e.png)

![gitgui.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/b96309ca-61b2-4812-22e0-ab12c426a8c0.png)

## Hubotアプリケーションを作成
準備が整ったので、スタートメニューよりGit Bashを起動し、以下のコマンドでHubotのインストールを行います。

![gitbash.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/2107bc06-539e-db35-336d-10b8d8ceb554.png)

```GitBash:GitBash
$ npm install -g hubot coffee-script
```

Slack、Heroku、Hubotなどのキーワードで検索してヒットするHubotアプリの作成例は以下の手順がほとんどですが、実行してみると「depreated（恐らくdeprecatedのタイポ）：非推奨」と表示され、代わりに「generator-hubot」を使ってくださいと記載されています。

```GitBash:GitBash
$ hubot --create test-slack-hubot
'hubot --create' is depreated. Use the yeoman generator instead:
    npm install -g yo generator-hubot
    mkdir -p test-slack-hubot
    yo hubot
See https://github.com/github/hubot/blob/master/docs/README.md for more details on getting started.
```

上記のメッセージの指示に従い、[Yeoman](http://yeoman.io/)と[generator-hubot](https://github.com/github/generator-hubot)をインストールします。

```GitBash:GitBash
$ npm install -g yo generator-hubot
```

Yeomanを使って、Hubotアプリケーションを作成します。

```GitBash:GitBash
$ mkdir -p test-slack-hubot
$ cd test-slack-hubot
$ yo hubot
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner: YourName <example@example.com>
? Bot name: test-slack-hubot
? Description: A simple helpful robot for your Company
? Bot adapter: (campfire) slack
```

先ほど作成した「test-slack-hubot」ディレクトリ内のHubotアプリケーションをGitリポジトリにコミットします。

```GitBash:GitBash
$ pwd
/c/Users/hoge/test-slack-hubot
$ git init
$ git add .
$ git commit -m "Initial commit"
```

## Herokuへのデプロイ
Hubotアプリケーションが作成できたので、Herokuへデプロイします。

まず、Herokuへログインします。

```GitBash:GitBash
$ heroku login
Enter your Heroku credentials.
Email: example@example.com
Password (typing will be hidden):
Authentication successful.
```

次にHerokuにアプリを作成します。

```GitBash:GitBash
$ heroku create test-slack-hubot
Creating test-slack-hubot... done, stack is cedar
https://test-slack-hubot.herokuapp.com/ | git@heroku.com:test-slack-hubot.git
Git remote heroku added
```

Hubotの動作にはRedisが必要となるため、無料版のRedis To Goをインストールします。（**はまりポイント**）

```GitBash:GitBash
$ heroku addons:add redistogo:nano
```

次に[SlackのIntegrationsの画面](http://my.slack.com/services/new/hubot)で、Hubot用の設定を作成します。

![hubot_integration.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/23bd0b26-c130-197d-d09e-a19630d926e6.png)

作成後、Integrationsの画面で「HUBOT_SLACK_TOKEN」、「HUBOT_SLACK_TEAM」、「HUBOT_SLACK_BOTNAME」の値を控えておきます。

![slack_integrations.png](https://qiita-image-store.s3.amazonaws.com/0/23093/7ae05ac4-023a-0a12-469a-b0466127d6e4.png)


控えておいた値を設定します。

```GitBash:GitBash
コマンド1回で設定するか、
$ heroku config:set HUBOT_SLACK_TOKEN=XXXXXXXXXXXXXXXXXXXX HUBOT_SLACK_TEAM=XXXXXXXXXX HUBOT_SLACK_BOTNAME=XXXXXXXXXX

もしくは、それぞれ個別に設定します。
$ heroku config:set HUBOT_SLACK_TOKEN=XXXXXXXXXXXXXXXXXXXX
$ heroku config:set HUBOT_SLACK_TEAM=XXXXXXXXXX
$ heroku config:set HUBOT_SLACK_BOTNAME=XXXXXXXXXX
```

Herokuの画面で設定内容が反映されているか確認します。

![heroku_settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/1eb8a63e-d490-e038-8858-b189d1739fc1.png)


Git Bashでも設定内容を確認します。

```GitBash:GitBash
$ heroku apps:info
=== test-slack-hubot
Git URL:       git@heroku.com:test-slack-hubot.git
Owner Email:   example@example.com
Region:        us
Stack:         cedar
Web URL:       https://test-slack-hubot.herokuapp.com/
```

「Web URL」として表示されている値を、以下のコマンドで設定します。
[このまとめ](http://qiita.com/misopeso/items/1f418dd02e89234499b3)によると、「HEROKU_URL」は非推奨とのことですが、一応両方とも設定しておきます。

```GitBash:GitBash
$ heroku config:set HEROKU_URL=https://test-slack-hubot.herokuapp.com/
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=https://test-slack-hubot.herokuapp.com/
```

SlackのIntegrationsの画面で、「Web URL」と同じ値を忘れずに設定しておきます。（**はまりポイント**）

![slack_integrations2.png](https://qiita-image-store.s3.amazonaws.com/0/23093/f995f2cd-6790-45bd-f81f-5c2ba156ed35.png)


全ての準備が整ったので、Herokuにデプロイします。

```GitBash:GitBash
$ git push heroku master
The authenticity of host 'heroku.com (50.19.85.154)' can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'heroku.com,50.19.85.154' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/hoge/.ssh/id_rsa':パスワードを入力
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

もし上記のように「Permission denied (publickey).」が発生したら、以下のコマンドで公開鍵の送信を行い、もう一度実行してみましょう。（**はまりポイント**）

```GitBash:GitBash
$ heroku keys:add
Found an SSH public key at C:/Users/hoge/.ssh/id_rsa.pub
Would you like to upload it to Heroku? [Yn] Y
Uploading SSH public key C:/Users/hoge/.ssh/id_rsa.pub... done

$ git push heroku master
Warning: Permanently added the RSA host key for IP address '50.19.85.156' to the list of known hosts.
Enter passphrase for key '/c/Users/hoge/.ssh/id_rsa':
Initializing repository, done.
Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (14/14), 4.96 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)

-----> Node.js app detected
-----> Requested node range:  0.10.x
-----> Resolved node version: 0.10.33
-----> Downloading and installing node
-----> Exporting config vars to environment
-----> Installing dependencies

・
・
省略
・
・

-----> Compressing... done, 6.8MB
-----> Launching... done, v10
       https://test-slack-hubot.herokuapp.com/ deployed to Heroku

To git@heroku.com:test-slack-hubot.git
 * [new branch]      master -> master
```

## Slackで動作確認

Slackのチャンネルで「@[HUBOT_SLACK_BOTNAMEで設定した値] ping」と入力し、以下のようにPONGとメッセージが帰ってくることを確認します。

![pingpong.png](https://qiita-image-store.s3.amazonaws.com/0/23093/e0921431-d008-8c69-cf22-82cbfa0c7840.png)

ついでに「good」と入力すると、ダービーが「グッド！」と答えてくれるボットを作ってみました。非常にグッド！です。

```coffeescript:derby.coffee
module.exports = (robot) ->
    robot.hear /good/i, (msg) ->
        msg.send "http://mangadget.net/img/comic_image/182/14622aabd8d7b8bfe37217fee929af91.jpg?" + (new Date().getTime())
```

![derby.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/7245b5de-a171-3f89-5d5d-1b109e8a51c6.png)

## 補足

去年の12月上旬に、HubotのIntegrations設定に仕様変更があったみたいで、その時に自分が慌てていた様子を貼っておきます。

![仕様変更1.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/4a408298-f940-8fb2-edc3-dab5473984bc.png)
![仕様変更2.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/67e368fe-093a-410e-357b-ac27d10ef743.png)
![仕様変更3.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/8594c319-8c7c-8d48-b8da-7da2f346f9ee.png)
![仕様変更4.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/7fe1c6fc-88f7-2738-cc17-7e33e4fe0d6e.png)
![仕様変更5.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/190decfb-f7fe-da70-fb55-034e613e48e7.png)
![仕様変更6.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/ceb3c02a-0091-cd83-6ca6-5ca0f333af0f.png)

結論としては、「heroku config:set」で設定していた「HUBOT_SLACK_TEAM」と「HUBOT_SLACK_BOTNAME」が不要になったようです。

この件については、投稿内容を修正しようかと思ってたんですが、しっかりまとめてくれている方がいたので、説明はそちらに任せます。（丸投げ。。。）

 - [SlackのHubot Integrationが知らぬ間にアップデートされてた](http://qiita.com/KeitaMoromizato/items/0ee11d795d18a49538d8)

## 参考URL

 - [Slack で Hubot を使えるようにする](http://qiita.com/misopeso/items/1f418dd02e89234499b3)
 - [Yoeman で Hubot を作成して Heroku へデプロイし Slack と連携する](http://qiita.com/hkusu/items/1dc7db9607ab8cb35150)
 - [Heroku上でHubotを動かす](http://qiita.com/mattuso/items/641aac71412bdce64182)
 - [hubotをherokuで動かす](http://qiita.com/yaotti/items/b51cad7e93459aa54bca)
 - [herokuに入れたSlack用のhubotの簡易運用手引き](http://qiita.com/kiyotaman/items/0e23c8a80793bbfad05f)
 - [Hubotを導入してSlackで使えるようにする](http://qiita.com/icb54615/items/15520294f249aa3c8158)
 - [slackにHubotを導入(Heroku経由)](http://qiita.com/Katsumata_RYO/items/dc4543aa5827d4c3211c)
 - [SlackのHubotを導入する際にはまったところ（Heroku経由）](http://qiita.com/sota0805/items/a843c42dfa3243e4d353)
 - [slackと連携するhubotをherokuで動かす](http://qiita.com/sue738/items/3d0d4d96e584ece670b3)
 - [Hubot + CoffeeScript ではじめるやわらかプログラミング入門](https://gist.github.com/udzura/0cb2447c305c51670414)
 - [WindowsでHerokuをセットアップする手順](https://gist.github.com/weed/4192953)
 - [初心者でも15分で公開できるHerokuのはじめかた](http://developers.mobage.jp/blog/how-to-use-for-beginners-heroku)
 - [知っておきたい！Herokuを使う上では当たり前？の16の常識](http://blog.mah-lab.com/2013/05/16/heroku-commons-16/)
 - [PuTTYgenで公開鍵/秘密鍵を作成する](http://sourceforge.jp/projects/winscp/wiki/ui_puttygen)
 - [Git GUIで公開鍵(public key)を生成する方法](http://blog.infinity-dimensions.com/2012/01/git-gui-create-public-key.html)
 - [GitをWindows7(64bit)にインストールしてGitLabからリポジトリをCloneする手順](http://qiita.com/yusukaaay/items/7f63b3881112ce63c271)
 - [HerokuでSSH公開鍵(public key)を登録する方法(と削除して再登録する方法)](http://blog.infinity-dimensions.com/2012/02/heroku-public-key-add.html)