Review Apps
最終更新日 2024年05月08日(水)
Table of Contents
レビューアプリは、完全かつ廃棄可能な Heroku アプリで、いずれかの GitHub プルリクエストのコードを実行します。共有可能でユニークな URL を個々に備える Review Apps は、コードベースへの変更を提案、テスト、およびマージするための優れた手段です。
レビューアプリは、プルリクエストごとに自動的に起動するように設定することも、Heroku Dashboard でアプリの 「Pipeline」 (パイプライン) ページから手動で作成することもできます。レビューアプリを使用するには、アプリで Heroku Pipelines と GitHub 統合の両方を有効にする必要があることに注意してください。
セットアップ
前提条件
- 既存のパイプライン。パイプラインとその作成についての詳細は、こちらを参照してください。
- アプリケーションのソースコードを含む GitHub.com 上の既存リポジトリ。
はじめに
レビューアプリを初めて扱う場合、Heroku Dashboard でパイプラインの Settings
(設定) タブに移動します。このページで、対応する GitHub リポジトリにパイプラインを接続します。
以前にレビューアプリを使用したことがない場合、app.json を設定することも必要な場合があります。詳細は、設定に関するセクションおよび「app.json のスキーマ」を参照してください。機密性が高く app.json に追加することが望ましくない環境設定の値がある場合、パイプラインの設定でレビューアプリの環境設定として設定します。
app.json を設定した後、レビューアプリの初回ユーザーは、「Pipeline」 (パイプライン) タブの Settings
(設定) タブまたはパイプラインの Review Apps
列のどちらかで Enable Review Apps
(レビューアプリの有効化) オプションを選択できます。
URL パターンの選択
Review Apps を有効にしたら、パイプラインの Settings
(設定) タブにアクセスし、URL パターンをチェックして更新します。デフォルトはランダムに設定されていますが、Update URL pattern
(URL パターンの更新) をクリックすると、ランダムな名前または予測可能な名前のオプションを含むサイドパネルが開きます。
Review Apps で予測可能な URL を使用すると、アプリがサブドメインの乗っ取りにさらされる可能性があります。
アクセス許可の設定
パイプラインアクセスタブを使用して、パイプライン内のすべてのレビューアプリと CI アプリへのアクセスを管理できます。パイプラインレベルのアクセス許可についての詳細は、パイプラインの一時的なアプリのアクセス許可を参照してください。
レビューアプリの作成
レビューアプリを作成すると、関連付けられたプルリクエストのベースになっているブランチの HEAD
コミットが Heroku によってデプロイされます。ブランチが更新されるたびに、Heroku によって最新のコミットがレビューアプリにデプロイされます。
手動作成
アプリの 「Pipeline」 (パイプライン) ページには、接続中の GitHub リポジトリのプルリクエストでオープン状態のものが表示されます。リスト内のプルリクエストの横にある Create
(作成) ボタンをクリックすると、そのリクエストに対してレビューアプリを手動で作成できます。
自動作成
自動作成では、アプリが接続している GitHub リポジトリでプルリクエストがオープンされるとすぐ、Heroku によってレビューアプリが作成されます。セキュリティおよび請求上の理由から、Heroku では、パブリックリポジトリへのプルリクエストのうちフォークから送信されたものに対しては、レビューアプリを自動的に作成しません。なお、これらのプルリクエストに対してはレビューアプリを手動で作成できます。
PR が閉じられたときに自動的に破棄されるのは、自動的に作成されたレビューアプリだけです。
レビューアプリの表示
レビューアプリが作成されると、ブラウザで開くためのリンクが GitHub から (プルリクエストの Conversation
(会話) タブで) 利用可能になります。
このリンクは、Heroku Dashboard (アプリの 「Pipeline」 (パイプライン) ページの 「Review Apps」 (レビューアプリ) 列) でも利用できます。
他の Heroku アプリと同じように、レビューアプリの表示、管理、および検査ができます。View initial app setup
(アプリの初期設定を表示) および View latest build
(最新ビルドを表示) リンクをクリックすると、レビューアプリのデプロイステータスの詳細を表示できます。
設定
レビューアプリが動作するには、アプリの GitHub リポジトリのルートに app.json
ファイルが必要です。app.json
ファイルは、プルリクエストのオープン時に作成される新しいアプリの設定に使用されます。
アドオンプロバイダーが指定するデフォルトの一時的プランにより、ユーザーが行ったプラン選択が上書きされる場合があります。デフォルトの一時的プランがアドオンプロバイダーによって指定されている場合、app.json
で指定した各アドオンの新しいインスタンスは、そのプランを使用してプロビジョニングされます。これにより、プルリクエストをテストするための高速で低コストな依存関係のセットが提供される一方、アドオンパートナーはプロビジョニングコストを抑制できます。
一部のアドオンでは、レビューアプリと CI アプリをサポートしていません。レビューアプリと CI アプリをサポートしていないアドオンを使用しようとすると、<add-on service slug> has opted out of supporting Review and CI apps
のようなエラーメッセージが表示されます。
すべての設定が、app.json
またはパイプラインの Settings
(設定) タブに存在している必要があります。
機密性の高い環境設定
機密性の高い環境設定は、パイプラインの設定の Review app config vars
(レビューアプリの環境設定) セクションで設定します。レビューアプリの環境設定のうち、パイプラインの設定に含まれているものはすべて、app.json に含まれているかどうかに関係なく、レビューアプリの作成時にアプリに挿入されます。
app.json
内の環境
Heroku CI での動作と同じように、Review Apps では “環境” キーがサポートされます。レビューアプリに固有の設定については、environments.review
キーを使用できます。たとえば、異なるデータベースプランをレビューアプリに使用したい場合、次のような設定を使用できます。environments.review
キー内でネストされている情報はすべて、基本設定にマージされます。
{
"addons": ["heroku-postgresql:standard-0"],
"environments": {
"review": {
"addons": ["heroku-postgresql:essential-0"]
}
}
}
レビューアプリ名
Review Apps では、何らかのランダム性を使用して名前の競合を防ぎます。HEROKU_APP_NAME
と正規表現を使用してアプリの詳細を推測する代わりに、自動的に挿入された環境変数を使用することをお勧めします。
postdeploy
スクリプト
app.json
ファイルには、postdeploy
コマンドを指定できる scripts
セクションがあります。これを使用して 1 回限りの設定タスクを実行し、アプリとデータベースをテストの準備ができていてテストに便利な状態にします。postdeploy は、以下のような 1 回限りのタスクに便利です。
- OAuth クライアントと DNS の設定
- レビューアプリのテストデータベースへのシード/テストデータのロード
Ruby-on-Rails アプリの場合、postdeploy
コマンドは次のようになります。
bundle exec rake db:schema:load db:seed
この場合、さらに設定しなくてもレビューアプリをテストに使用できるよう、db/seeds.rb
ファイルによって包括的なデータがデータベースにシードされます。
コマンドが実行される dyno のサイズは、command
および size
キーでオブジェクトを指定することによって設定できます。
postdeploy はアプリの作成後に一度だけ実行される
postdeploy
は、アプリが初めて作成およびデプロイされた後に一度だけ実行されることに注意してください。それ以降に変更がデプロイされても実行されません。レビューアプリの postdeploy
スクリプトを再実行するには、プルリクエストをクローズして再度オープンする必要があります。そうすると、Heroku によってレビューアプリが破棄され、再作成されます。
デプロイ後スクリプトが失敗した場合、次回のプッシュ時にアプリを再作成し、デプロイ後スクリプトをもう一度実行します。
リリースフェーズを使用してプルリクエストの変更のたびにコマンドを実行する
プルリクエストの変更のたびにコマンドを実行するには、リリースフェーズを使用します。リリースフェーズは、CDN へのアセットのアップロード、キャッシュストアの無効化または準備、データベーススキーマの設定と移行の実行などのタスクに役立ちます。リリースフェーズは postdeploy スクリプトよりも先に実行されます。
データベースの内容全体をレビューアプリにコピーする操作は、現在サポートされていません。本番データをテストアプリにコピーすると、最近の顧客データを操作するときにデータ漏洩やその他のプログラミング上のミスのリスクがあります。代わりに、postdeploy
コマンドで実行されるシードスクリプトを使用して、非本番データでデータベースを包括的にシードすることをお勧めします。
pr-predestroy
スクリプト
app.json
ファイルで、必要に応じて pr-predestroy
スクリプトを指定できます。このスクリプトは、関連付けられたプルリクエストがマージまたはクローズされた後にレビューアプリが破棄されると実行されます。
{
"name":"Node.js Sample",
"scripts": {
"postdeploy": "bin/bootstrap",
"pr-predestroy": "bin/teardown"
}
}
postdeploy
の間にプロビジョニングされたすべてのリソースを破棄したり、その他のクリーンアップを実行したりするには、pr-predestroy
スクリプトを使用します。
このコマンドはプルリクエスト (PR) アプリフローの中でのみ実行されるため “pr-” という接頭辞が付いています。
このスクリプトの出力はログドレインに送信されません。
Docker イメージを使用しているアプリは pr-predestroy
スクリプトを使用できません。これらのスクリプトは、app.json
ファイルに含まれていると無視されます。
コマンドが実行される dyno のサイズは、command
および size
キーでオブジェクトを指定することによって設定できます。
挿入された環境変数
個々のレビューアプリの作成時に、以下の環境変数がアプリに追加されます。
HEROKU_APP_NAME
: レビューアプリの名前HEROKU_BRANCH
: レビューアプリで追跡しているリモートブランチの名前HEROKU_PR_NUMBER
: レビューアプリが自動的に作成された場合の GitHub プルリクエスト番号
スクリプト処理に役立つ、2 つの特別な環境設定がレビューアプリで利用できます。これらはすべてのレビューアプリで使用可能であり、app.json ファイルで指定する必要はありません。
HEROKU_APP_NAME
、HEROKU_BRANCH
、および HEROKU_PR_NUMBER
は変更される可能性があります。レビューアプリの作成フローでしか利用できず、アプリの名前が変更された場合は更新されません。
レビューアプリの無効化
レビューアプリはいつでも無効化できます。無効化すると、新しいレビューアプリが作成されなくなります。
レビューアプリを無効化すると、既存の関連付けられているレビューアプリも削除されます。
Heroku Postgres 拡張機能
2023 年 7 月 10 日以降、Essential 層データベースなどの Heroku Postgres データベースをプロビジョニングする新しいレビューアプリで、拡張機能はデフォルトで public
スキーマにインストールされます。拡張機能が heroku_ext
スキーマにあることをアプリケーションで想定している場合、エラーが発生する可能性があります。
CREATE EXTENSION…WITH SCHEMA…
を使用して拡張機能のスキーマを定義できます。たとえば、レビューアプリで拡張機能を heroku_ext
スキーマにインストールするには、データベースセットアップスクリプトで次のようにします。
CREATE EXTENSION extension_name WITH SCHEMA heroku_ext
レビューアプリと CI
パイプラインで Heroku CI を有効化している場合、プルリクエストへのすべての後続のコミットで、レビューアプリの更新されたビルドに対してテストが実行されることに注意してください。テスト結果は通常どおり、パイプラインの Tests
(テスト) タブで確認できます。テストが失敗した場合でも、更新されたコードがビルドおよびデプロイされます (プルリクエストはもともと実験的なものであるため、Heroku ではレビューアプリへのデプロイはブロックされません)。
以上の規則は、Heroku Pipelines と統合する他の CI システムにも当てはまります。
アプリへのコミットのたびに Heroku CI または別の CI サービスのいずれかが実行される場合は、レビューアプリの設定で 「Wait for CI to pass」 (CI の合格を待機する) にチェックを付けてください。そうしないと、CI が設定されていない場合に、テストに合格するまでレビューアプリがいつまでも待機する可能性があります。
レビューアプリと Heroku Private Spaces
Private Space は、dyno や特定の種類のアドオンを、分離されたネットワーク内に閉じ込めた形で実行するための専用環境です。Private Space 内のアプリは、パイプラインのどのステージも占有する可能性があります。
レビューアプリは、app.json
ファイルでアプリの設定の一部としてリージョンまたは Space が指定されている限り、どの Private Space 内でも生成および実行できます。次に例を示します。
{
"app": { "region": "us" }
}
{
"app": { "space": "1234-abcd" }
}
レビューアプリと Docker
Dockerfile
を使用してビルドを定義する場合、heroku.yml
ファイルをプロジェクトにインクルードする必要があります。heroku.yml
がある場合、Heroku は指定された Docker イメージをビルドし、レビューアプリで使用します (app.json
ファイルはまだ必要です)。
レビューアプリの管理と費用
レビューアプリによって使用される dyno とアドオンは、通常のアプリとまったく同じように課金されます。費用は秒単位で課金され、レビューアプリが存在している時間のみが請求対象になります。
ほとんどの場合、Heroku はデフォルトで、お客様のプランでレビューアプリに利用可能な dyno のうち最も安価なものを使用します。ただし、Private Space 内のアプリはデフォルトで private-m
dyno を使用します。app.json
ファイルで、デフォルト以外の dyno サイズを指定できます。
レビューアプリが存在するのは、関連付けられたプルリクエストの存続期間中だけであり、アクティブでない状態で 1 日、2 日、5 日、14 日、または 30 日が経過したら自動的に破棄されるように設定できます。
アプリを実行およびテストするために、無料または低費用のアドオンプランでも十分な場合は、app.json
でそれらのプランを指定することもできます。レビューアプリは通常は短命であり、存在している時間分しか請求されないため、月額料金は少額に収まるのが普通です。
自動的に作成されるレビューアプリの費用はすべて、アプリを GitHub に接続したユーザーが請求先になります。レビューアプリを手動で作成する場合、レビューアプリを作成したユーザーが費用の請求先になります。
詳細は、「使用と請求」の記事を参照してください。
レビューアプリ API
Review Apps API は、Heroku の Platform API の拡張機能です。この API を使用して、レビューアプリを有効化、無効化、作成、および削除できます。詳細は、API ドキュメントを参照してください。特に、レビューアプリ、レビューアプリの設定、および環境設定に関するセクションを参照してください。
アクセス許可の変更
パイプラインのアクセス許可と機能に加えて、レビューアプリには以下のアクセス許可モデルの変更があります。
- “管理者” ロールを持つすべての Heroku Team および Enterprise Team ユーザーに、チーム内のすべてのレビューアプリと CI アプリへのフルアクセスが与えられます。
- “メンバー” ロールを持つすべての Heroku Team および Enterprise Team ユーザーに、チーム内のすべてのレビューアプリと CI アプリに対する “表示"、"デプロイ"、および "操作” アクセス許可が与えられます。ただし、これらの権限では、ユーザーはアプリケーションをプロモートできません。Enterprise Team の管理者は、ユーザーごとに権限を調整したり、自動参加の権限設定を変更したりできます。
- ユーザーが GitHub でプルリクエストを作成すると、ユーザーの Heroku アカウントがアプリケーションにアクセスできる場合に限り、ユーザーはそのプルリクエストに対して生成されたレビューアプリを Heroku で表示できます。GitHub リポジトリでプルリクエストを作成するアクセス許可があっても、レビューアプリへのアクセスは保証されません。
- 変更と GitHub へのコミットを行うユーザーが Heroku アプリにアクセスできない場合でも、新しいコミットに対してレビューアプリがビルドされます。
- レビューアプリの作成には、パイプラインを GitHub にリンクするユーザーのトークンが使用されます。
- パイプライン内のアプリに対する “共同作業者” アクセス許可を持つユーザーは、レビューアプリに自動的にはアクセスできません。レビューアプリと CI アプリへの共同作業者のアクセス権を与えるには、パイプラインのアクセスタブでそのユーザーを新しいアクセス許可の表に追加してください。
よくある質問
Git サブモジュールは機能しますか?
いいえ。サブモジュールを使用する GitHub リポジトリは一般的に Heroku に正常にデプロイされません。これは、repo-content の tarball が生成される場合は、GitHub にサブモジュールのコンテンツがないためです。
Fourchette とレビューアプリ
GitHub で作成されるプルリクエストに対して Heroku アプリを作成するというアイデアの先駆けは、Rainforest と Fourchette です。