Herokuの15分ルール
YesodアプリをHerokuにデプロイするというトピックを書きましたが、難関があります。
Herokuは、ビルドが15分経っても終わらないとデプロイを失敗させてしまうのです。
そして、Yesodで作ったアプリケーションは、ビルドに15分以上かかるのは珍しいことではありません・・・
ビルドサーバ「Anvil」
15分ルールに対抗するには、Anvilというビルドサーバが使えます。
heroku-buildpack-ghcのページに書いていました。
ビルドサーバはHerokuでのビルドとは関係ないので、15分ルールに縛られないようです。
ビルドサーバでのビルド〜デプロイの流れ
概ね次のような流れになります。
- ビルドサーバにプロジェクトをアップロード
- ビルドサーバ上でビルド
- 2で生成されたslug(Heroku用語で、アプリ実行に必要なファイル群のこと)をビルドサーバ上に保存
- ビルドサーバ上のslugをHerokuにリリース
ビルド〜デプロイ手順
前提
-
Heroku Toolbelt
が導入されていること
準備
ビルドサーバでのビルドには、Heroku Toolbelt
をプラグインで拡張する必要があります。
heroku plugins:install https://github.com/ddollar/heroku-anvil
これでheroku build
コマンドとheroku release
コマンドが使えるようになります。
これらのコマンドの使い方の詳細はこちら。
ビルド〜デプロイを一発で行う
Herokuにデプロイするプロジェクトのディレクトリで、次のコマンドを実行します。
Yesodアプリをデプロイする想定なので、buildpackを指定します。
heroku build -r -b https://github.com/begriffs/heroku-buildpack-ghc.git
運が良ければ(時間こそかかりますが)これ一発でデプロイは完了です!
なんという便利さ!
ビルドに失敗した場合
ビルドに失敗することは、よくあります。Yesodアプリのデプロイは安定しないのです。
あきらめずに何度もビルドしましょう。
ビルドには成功したがデプロイに失敗した場合
slugは作成されたがデプロイに失敗することも、よくあります。Yesodアプリのデプロイは安定しないのです。
この場合はビルドをスキップしてslugのリリースだけを次のコマンドで行います。
heroku release <slugのURL>
なお「ビルドに成功している!」というのは次の出力を見て判断出来ます。
Putting cache... done
Creating slug... done
Uploading slug... done
Success, slug is https://api.anvilworks.org/slugs/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.tgz
Releasing to metshop... ...................................
Success, slug is https://…
で始まる行が出力されていれば、ビルドには成功しています。
2回目以降のビルド
2回目のデプロイは、平常どおりGitを通して行えるそうです。
git push heroku
前回デプロイのslugがキャッシュされているため、ビルド時間が短縮され15分かからなくなる・・・とheroku-buildpack-ghcのページには書かれています。
が、実感としてはあまり変わらない気がしています。
課題
ビルドサーバ上のGHCのバージョンを指定する方法が見付かっていません。
まとめ
ビルドサーバでのビルドとデプロイは、Yesodアプリをローカルでビルドしてのデプロイを試みていた時に比べると、まさに比べ物にならない簡単さです。
不安定なところがあり長時間待たされたあげく失敗に終わってがっかりすることも多いのですが、Yesod導入の困難を乗り越えた開発者の方であれば、これくらいのことは蚊に刺されたほどにも感じないのではないでしょうか。