HerokuにデプロイしたHobotをIdlingさせない方法

  • 90
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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