はじめに
チーム開発しているとPRごとにプレビュー環境で動くものが常に見れるようになっているととても便利ですよね!
現在チームでExpress.jsとNext.jsを用いたOSSを開発しており、GitHub上でコードを管理しています。
GitHubと連携してPRごとにプレビュー環境を自動作成してくれるサービスには次のようなサービスがあります。
今回はどこまで無料で使えるかという観点でこれらのサービスを比較してみたいと思います。
TR; DR
- サーバーレスでないアプリを実行する場合 → Heroku
- Node.jsの10.xなど新し目のバージョンを使いたい場合 → Heroku
- 静的ファイルのみのホスティングの場合 → Netlify
- サーバーレスに対応したアプリの場合 → Netlify / Now.sh
- Node 8.x系でも問題ない場合 → Netlify / Now.sh
Netlify
メリット
- 静的ファイルのホスティングはPRに制限がありません。 これはかなり大きいのではないでしょうか。
- バックエンドはサーバーレスアプリをAWS lambdaにデプロイでき、フリープランの上限も125kリクエスト/月、実行時間100時間/月といい感じ。
デメリット
- チームで使う場合は有料。とはいってもダッシュボードや設定をチームでする場合は有料というだけなので、チームでプレビュー環境を見たいだけであれば、個人アカウントで連携など全部設定すればいいので、デメリットにはならないと思います。
- サポートされているNode.jsのバージョンが6.xと8.xのみ 1 これは、裏ではAWS Lambdaを使っているためです。
Now.sh
現状ではv1とv2の二種類があります。v2でユースケースをカバーできるようになったらv1はサポートを終了するらしいので、v2を使うのが推奨っぽいです。
- v1: Dockerfileにより任意の環境でサーバーを実行できる
- v2: サーバーレスのみに対応している
メリット
- v1の場合Dockerfileにより任意の環境でサーバーを実行できます。
- v2の場合、単位がサーバーレスアプリの実行回数になったのでプレビュー環境の個数に上限はない。実行回数に上限 (1000回/日)が設けられています。画像やCSSなどの静的ファイルの取得もカウントされてしまうので、結構きつい制限なのかもしれませんね。
デメリット
- v1ではフリープランでは3インスタンスまで(要するに3PR)しか作れず、チームで開発するにはもの足りないです。
- v2ではサポートされているNode.jsのバージョンが8.xのみ 2 私のチームでは開発用にオンメモリの MongoDBであるmongodb-memory-serverを使っているのですが、内部的にNode 8.xではサポートされていないasync generatorをつかっていることがわかり、Now.shを断念しました
Heroku
Review Appsを設定することでプレビュー機能が使えるようになります。
メリット
- Dockerが使えるでどんな環境でも動かせます。
- Dockerを使わない場合でもNode.js 11.xまでサポートされているのでNode.jsのバージョンで困らないかと思います。3
- 無料だと550 dyno hoursが使え、アイドル状態になると自動的にsleep状態になる(sleep状態のインスタンスはdyno hoursにカウントされない)ので、小さなチームでは十分なのではないでしょうか。
デメリット
- チームで使う場合はfree dynoが使えないので無料で使うことができません。これに気づかずにチームプランで使ってしまっていたのですが、ある日Herokuから請求メールが来ていて焦りました $1ちょっとだったので大したことはなかったですが。ただ、これもNetlifyと同じで設定は個人アカウントで行えばよいので、チームで設定を管理しなくてもいいというのであれば、大きな問題にはならないかと思います。
まとめ
どのサービスが最適かどうかは用途によって変わってくるとは思いますが、まとめると以下のようになります。最近GoogleがCloud Runというサーバーレスアプリ用のサービスを公開しましたが、KnativeベースなのでGitHubと連携ができるようになるとCloud Runだけで十分になるかもしれませんね!
- サーバーレスではないアプリを実行する場合 → Heroku
- Node.jsの10.xなど新し目のバージョンを使いたい場合 → Heroku
- 静的ファイルのみのホスティングの場合 → Netlify
- サーバーレスに対応したアプリの場合 → Netlify / Now.sh
- Node 8.x系でも問題ない場合 → Netlify / Now.sh