Heroku + Hubotでslackbot作成したときに生じたエラーまとめ

ふと褒めまくっていれるbotがあったら良いなと思い、hubotでオリジナルbotを作成してみた。作り方は色んな記事で書かれているので、つまづいたところをまとめてみる。

#環境
- windows10 Home 64bit
- hubot 3.3.0
- heroku 
- git v2.19.1
- node v10.15.1

#ERROR一覧
##①git push heroku masterが失敗する
<details><summary>ERROR内容を展開する</summary><div>

```
$git push heroku master
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 8 threads
Compressing objects: 100% (11/11), done.
Writing objects: 100% (15/15), 12.40 KiB | 1.03 MiB/s, done.
Total 15 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Node.js app detected
remote:
remote: -----> Creating runtime environment
remote:
remote:        NPM_CONFIG_LOGLEVEL=error
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote:        NODE_VERBOSE=false
remote:
remote: -----> Installing binaries
remote:        engines.node (package.json):  0.10.x
remote:        engines.npm (package.json):   unspecified (use default)
remote:
remote:        Resolving node version 0.10.x...
remote:        Downloading and installing node 0.10.48...
remote:        Detected package-lock.json: defaulting npm to version 5.x.x
remote:        Bootstrapping npm 5.x.x (replacing 2.15.1)...
remote:        npm 5.x.x installed
remote:
remote: /tmp/build_7c07fe93e841fdd958ff06c7f01b4d2e/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote:       var notifier = require('update-notifier')({pkg})
remote:                                                     ^
remote: SyntaxError: Unexpected token }
remote:     at Module._compile (module.js:439:25)
remote:     at Object.Module._extensions..js (module.js:474:10)
remote:     at Module.load (module.js:356:32)
remote:     at Function.Module._load (module.js:312:12)
remote:     at Function.Module.runMain (module.js:497:10)
remote:     at startup (node.js:119:16)
remote:     at node.js:945:3
remote:
remote: /tmp/build_7c07fe93e841fdd958ff06c7f01b4d2e/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote:       var notifier = require('update-notifier')({pkg})
remote:                                                     ^
remote: SyntaxError: Unexpected token }
remote:     at Module._compile (module.js:439:25)
remote:     at Object.Module._extensions..js (module.js:474:10)
remote:     at Module.load (module.js:356:32)
remote:     at Function.Module._load (module.js:312:12)
remote:     at Function.Module.runMain (module.js:497:10)
remote:     at startup (node.js:119:16)
remote:     at node.js:945:3
remote:
remote: /tmp/build_7c07fe93e841fdd958ff06c7f01b4d2e/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote:       var notifier = require('update-notifier')({pkg})
remote:                                                     ^
remote: SyntaxError: Unexpected token }
remote:     at Module._compile (module.js:439:25)
remote:     at Object.Module._extensions..js (module.js:474:10)
remote:     at Module.load (module.js:356:32)
remote:     at Function.Module._load (module.js:312:12)
remote:     at Function.Module.runMain (module.js:497:10)
remote:     at startup (node.js:119:16)
remote:     at node.js:945:3
remote:
remote: -----> Build failed
remote:
remote:        We're sorry this build is failing! You can troubleshoot common issues here:
remote:        https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:
remote:        If you're stuck, please submit a ticket so we can help:
remote:        https://help.heroku.com/
remote:
remote:        Love,
remote:        Heroku
remote:
remote:  !     Push rejected, failed to compile Node.js app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !       Push rejected to xxx-xxx-xxx.
remote:
To https://git.heroku.com/xxx-xxx-xxx.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/xxx-xxx-xxx.git'
```
</div>

エラー内容見てみると[トラブルシュートのURL](https://devcenter.heroku.com/articles/troubleshooting-node-deploys)にトラブルが記載されていたので、それに従ってみた。
原因は、package.jsonに書かれたnodeのバージョンとローカルにインストールしたnodeのバージョンが異なっていたことだった。
下記のように書き換えることで解決。

```package.json
"engines": {
    "node": "10.15.1"
  }
```
書き換えたら、```git add .```と```git commit```を忘れずに実行する。

##②heroku openを実行するとアプリケーションエラーが生じる
```heroku logs```でログを見てみると``` !    Couldn't find that app.```との記載があった。とりあえず、再起動してみたが治らず。
ログをより詳細に見ていくと、Procfileにslackアダプタに設定しておらずデフォルトのまま(bin/hubot -a campfire)であったことが判明したので、Procfileを修正した。

```Procfile.
web: bin/hubot -a slack
```

hubotで使用するアダプタを変更するために、再度```yo hubot```を実行しアダプタをslackに指定することで解決した。

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

? Owner YOUR_EMAIL_ADRESS
? Bot name your_bot_name
? Description A simple helpful robot for your Company
? Bot adapter slack #slackを指定すること
   create bin/hubot
   create bin/hubot.cmd
   create Procfile
   create README.md
   create external-scripts.json
   create hubot-scripts.json
   create .gitignore
   create package.json
   create scripts/example.coffee
   create .editorconfig
```

##③作成したbotがすぐスリープする
###1. Heroku設定画面からKeepaliveを設定する
下記のConfigを設定した。

```
HUBOT_HEROKU_KEEPALIVE_INTERVAL=5 #5分おきにPingで疎通確認
HUBOT_HEROKU_KEEPALIVE_URL=[your_app_URL] #keepaliveを設定するapp
HUBOT_HEROKU_SLEEP_TIME=23:59 #Botがスリープする時間
HUBOT_HEROKU_WAKEUP_TIME=6:00 #Botが起床する時間
```

しかし、botは相変わらずidle時間が30分過ぎるとスリープしてしまう。

###2. Heroku schedulerを追加する
HerokuのアドオンであるHeroku schedulerをインストールし、Botのサーバーを寝かせないような設定を行った。このアドオンを追加するには、クレジットカード情報を登録する必要があるが、無料枠で使用している限り、請求は発生しない。
![pic](https://drive.google.com/uc?export=view&id=1vwuaANjO6WZcBMg1Rxe1FptZP1-fKdM8)
"$"欄に下記スクリプトを追加する。

```
seq 1 13 | grep -qw $((10#`date -u "+%H"`)) && curl https://<your-app-name>.herokuapp.com > /dev/null 2>&1
```
次のスクリプトも試してみたが、こちらだとスリープしてしまった。

```
curl ${HUBOT_HEROKU_KEEPALIVE_URL}heroku/keepalive
```
#結果
かわいいbotができた。
![pic2](https://drive.google.com/uc?export=view&id=1Y9CsMCShedmV2ZWEgbQMj4hU45kDry7P)

#参考文献
- http://kakts-tec.hatenablog.com/entry/hubot-heroku-keepalive%E3%81%AE%E5%B0%8E%E5%85%A5
- http://tak-dev.hateblo.jp/entry/slack-botkit-cron-bot
- https://dackdive.hateblo.jp/entry/2016/07/13/210000
- https://devcenter.heroku.com/articles/troubleshooting-node-deploys
- https://blog.y-yuki.net/entry/2018/11/11/113000
- http://tooooomin.hatenablog.com/entry/2016/01/03/132937