Heroku Flow の強化、Review Apps (New)の強化点とその効用

Heroku Advent Calendar 2019 初日の[usk](https://developers.tam-bourine.co.jp/entry/2019/12/01/100000)さんに振られてビックリしちゃいましたが、Review Apps (New)ネタです。

# 11月7日に更新された Review Apps
2016年に最初のリリースが行われた Heroku Flow の Review Apps ですが、2019年10月17日に New Review Apps のパブリックベータが開始されており、11月7日にめでたく GA となりました。

10月17日 [New Review Apps now in Public Beta](https://devcenter.heroku.com/changelog-items/1695)
11月7日 [New Review Apps now generally available](https://devcenter.heroku.com/changelog-items/1706)

新しい Review Apps では、以下の様な機能追加・変更が行われています。

>The new Review Apps includes a public-facing API, the ability to enable review apps in multiple pipelines for the same repository, the option to create Review Apps manually without a PR, and improvements to the Heroku Dashboard.

超訳

> 新しい Review Apps には、公開API、単一のリポジトリを複数のパイプラインで利用する機能、プルリクエストなしで Review Apps を手動で作成するオプション、および、Heroku ダッシュボードの改善が含まれています。

最も大きな変更は、**プルリクエストなしで、ブランチから Review Apps を手動で作成できること**だと思います(少なくとも個人的には、これが1番の変更点だと思っています)。ということで、この Review Apps の手動作成について、掘り下げてみたいと思います。
# Heroku ダッシュボード上での変更点
大きく変更になったのは以下の点です。
1. Pipeline の最初のページで、Review Apps を Enable にするパネルが派手になったw
<img width="401" alt="ReviewAppsPane.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/9163d76f-ed59-8ebd-5645-600feac7cef2.png">
2. Review Apps を Enable にした際、Settings ページに、Review Apps 向けの設定が追加された
<img width="855" alt="スクリーンショット 2019-12-03 19.30.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/5bd2ecaf-bceb-8b88-3a25-fabda1be4268.png">
特に、環境変数を Heroku ダッシュボードから追加できるようになったのは大きな変更です。従来は、app.json に記述する必要があった Review Apps の環境変数を、Heroku ダッシュボード設定できるようになったことで、セキュアに扱う必要のある環境変数をコード (app.json) に埋め込む必要がなくなり、よりセキュアな、Pipelines 運用ができるようになりました。
#手動で Review Apps を作成できる意味
仕様を大きく変更して、手動で Review Apps を作成できるようになったのは何故でしょうか？従来、Review Apps の説明をする際には、
> Review Apps は、Github のプルリクエストに合わせて動作し、プルリクエストが作成されると、自動的に、一時的な Dyno が起動し、実際のアプリケーションの動作を、(ローカルよりも)より運用環境に近い環境でレビューができます。

と説明してきました。確かに、プルリクエストと連携することにより、レビュー環境の作成・削除を自動化できるというメリットはありましたし、実際にかなり便利な機能だと思っていました（いうまでもなく、今でも便利です)。

しかし、実際の開発現場で、プルリクエストを作成する前の状況、つまり（ほとんどの場合)ローカルの環境を考えてみると、Heroku 上の運用環境とは、結構異なった状況で開発していることが少なくないと思います。普通に考えれば、プログラミングをする環境は、Mac だったり、Windows だったりする場合も多く、その状況というのは、[The Twelve-Factor App X. 開発/本番一致](https://12factor.net/ja/dev-prod-parity)で解説されている**「継続的デプロイしやすいよう開発環境と本番環境のギャップを小さく保つ」**とは、大きく状況が異なっているともいえるわけです。

**「じゃあ、実際に Heroku で動かしてみるために、頻繁にプルリクあげればいいじゃん」**って感じもするのですが、頻繁にプルリクエストを作成してたら、リポジトリの運用に悪影響があるのは当然ですし、シャイなwいち開発者としては、やっぱり**こっそり**、Heroku 上で動かしてみたくなるのは当然です。

今回、手動で Review Apps を作成できるようになったことで、いち開発者としては、プルリクエスト無しに、アプリケーションの動作を Heroku 上で確認できるようになり、ローカルではちゃんと動作してたのに、Heroku 上にデプロイしたら、動かなくなってしまった！的な状況のママ、プルリクエストを飛ばしてしまうという恥ずかしい事をしなくてよくなります。
# 手動で Review Apps を作成する場合の注意点とその対策
少なくとも1点、十分気をつけなければならないことがあります。プルリクエストに応じて、Review Apps が作成・削除されていた旧バージョンの Review Apps では、プルリクエストの管理＝Review Appsの管理だったのが、手動で作成した Review Apps の場合、当然ですが、手動で削除する必要があります。不要になったのに放置すれば、その分、課金は進みます。

ということで、**不要になった Review Apps の削除は忘れずにね！**ということになりますが、削除を忘れてしまった場合でも、課金がすすまないようにする対策として、Heroku ダッシュボードでは、一定期間経過後、強制的に削除するための設定が Review Apps の設定に追加されています。
<img width="355" alt="スクリーンショット 2019-12-03 20.01.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/530b7fc5-03a6-0627-999d-7df6b3260f94.png">
この設定では、デプロイ後、該当ブランチの更新が無ければ、指定した日数後に、自動的にその Review Apps が削除されます。標準では、この設定は**オフ**になっているので、Review Apps の手動デプロイを設定した場合は、忘れずに、削除の設定も合わせておこなっておくのが良いでしょう。

# 従来通りの Review Apps の使い方を踏襲したい場合は
なお、従来通り、プルリクエストベースで、Review Apps を作成・削除するという場合においては、Review Apps の設定で、「reate new review apps for new pull requests automatically」をチェックしておくことで対応可能です。
<img width="650" alt="スクリーンショット 2019-12-03 20.47.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816/61194666-4da2-7d46-20cb-b97a2ffa064b.png">