HubotをHipchatやIdobataなどのチャットと連携して利用すると、GithubやTravis、New Relicなどのサービスからの通知をチャットで受け取れて便利です。
その際のデプロイ先としてHerokuが非常に便利なのですが、放置しているとアイドリングしてしまいます。
それでは困るので定期的にリクエストを飛ばすスクリプトを書いて対応していたのですが、もっと簡単な方法があったので紹介します。
Herokuの環境変数HEROKU_URL
にHubotのデプロイ先のURLを設定するだけです。
heroku config:set HEROKU_URL=http://yourapp.herokuapp.com/
処理はHubotのrobot.coffeeに書いてあり、HEROKU_URL
が設定してあれば20分に1回 http://yourapp.herokuapp.com/hubot/ping
にPOSTするようになっています。
https://github.com/github/hubot/blob/master/src/robot.coffee
対象コミット: https://github.com/github/hubot/commit/5e738f634bf5c88b0520a97dd9566abedfaa7f3f
これでアイドリングすることが無くなるはずです。
ってよく読んだら https://github.com/github/hubot/blob/master/docs/deploying/heroku.md に書いてありますね…。
ググると全然違う情報が引っかかったりするので、備忘録ってことで残しておきます。
追記
最新のHubot(2.9.3で確認)では、hubot-scripts/hubot-heroku-keepaliveを使ってアイドリングさせないようにpingを送ります。
今まで通りHEROKU_URL
を設定しても動くようですが、互換性維持のために残しているような感じなので、新しく作ったのであればHUBOT_HEROKU_KEEPALIVE_URL
を設定した方が良さそうです。
Herokuの環境変数の設定は以下の通り。
heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=PASTE_WEB_URL_HERE
ワンライナーでも設定できるみたいです。
heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web_url | cut -d= -f2)
hubot-heroku-keepaliveでは、デフォルトで5分間隔でpingする設定になっており、HUBOT_HEROKU_KEEPALIVE_INTERVAL
に値を設定することで変更できるようです。
おまけ
上記対応前はこんなコードで対応してました。
cron = require('cron').CronJob
module.exports = (robot) ->
url = process.env.HUBOT_URL
robot.enter ->
new cron
cronTime: "*/10 * * * *"
start: true
onTick: ->
robot.http(url + "/hubot/version")
.get() (err, res, body) ->
return