Heroku Review AppsでPRごとに動作環境を作成せよ


## はじめに

Herokuの機能であまりメジャーではないがReview Appsと言う機能がある、GithubのPull Requestごとに動作可能な環境を自動で作ってくれるすぐれものだ

これがすごいのはエンタープライズモードじゃなくても使えるし、使用するaddonによっては無料枠で使うことができる

コードレビューする際に動作を確認したい場合に簡単にチェックすることができる。わざわざ自分のローカル環境にPullして動作確認する必要が無いのだ！！

またPRをマージしたりクローズするとHerokuのアプリも連携して削除されるので削除し忘れるということもない

以下の条件をみたす場合は導入することをおすすめする

* Herokuで稼働しているWebアプリ
* 複数人のチームで開発している
* コードのホスティングはGithub



### サンプルコード
なおサンプルアプリはRailsのscaffoldで適当に作ったアプリを利用する

サンプルコードはこちら
https://github.com/konyu/reviewapp/

## Herokuの設定

### 前提条件
HerokuでAppを作成済みで、動作可能なアプリが動いていること

対象のGithubのリポジトリのオーナーか、Organizationの強い権限である必要がある(未検証)

### RewviewAppsの設定する

[Herokuのダッシュボード画面](https://dashboard.heroku.com/apps)に行き、対象のアプリのリンクをクリックしアプリケーションのトップページを開く

Deployのタブをクリックする

![スクリーンショット 2016-06-23 17.41.15.png](https://qiita-image-store.s3.amazonaws.com/0/5390/9dabbd5c-19ce-34c5-531a-22f21ebca8ab.png "スクリーンショット 2016-06-23 17.41.15.png")


New Pipelineボタンを押すと以下のようにPipeline名を求められる

<img width="500px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/385d5f5f-6369-5c61-fb6b-6db65bc0aa1d.png">


パイプライン名を求められるがデフォルトのHeroku App名のままにしておく方がわかりやすくて良いだろう

Create Pipelineボタンを押す
<img width="300px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/a555dc13-1c61-a560-87f7-340849b203b9.png">


これでPipelineが作成される


<img width="500px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/957e3b13-f321-cad7-f5ff-720eda297206.png">


Connect To Githubボタンを押す

orgaizationか自分のアカウントのリポジトリを検索して、対応するgithubリポジトリを探し、connectボタンを押して連携する

※初めてHerokuとGithubを連携する場合は、GithubとのAuth連携(FB連携機能見たいのが出る場合

Githubとの連携後、DeployのタブにREVIEW APPSの項目が表示されている 

<img width="300px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/3b7f2324-ee8b-8a39-69e9-1d87bc856e7f.png">



Enable review Apps... ボタンを押す

ダイアログが表示され
Create an App.json File... ボタンを押す

※ GithubのリポジトリにReviewApps用のapp.jsonファイルがなければこのダイアログが表示される

App.jsonの雛形となるフォームが表示される

各項目の内容は以下の様な感じ(Railsアプリの場合)

```
Scripts

Post deploy script (optional)
  bundle exec rake db:schema:load db:seed(つまりDBにテーブルを作成し、seedデータを挿入するなど、アプリが起動時に動くようにする準備)

Buildpacks
　　heroku/ruby(デフォルトのまま)
　　
Config Vars
	ReviewAppの場合に特別変更する場合以外は変更の必要はない
	Add-onの環境変数がここになくても問題ない(Postgresの環境変数DATABASE_URLなど)
```	

画面下部に、上記設定で作成されるapp.jsonファイルの例が表示される

<img width="500px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/ed4e65c3-2e85-68de-c8ef-ccf827f4ec6a.png">

	
Commit to Repoボタンを押すとGithubのリポジトリにapp.jsonが追加されコミットされている

<img width="300px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/0c4ecc87-5126-7cde-6ca3-f50eba1a83c2.png">


※ 確認したい場合はGithubのmasterリポジトリを確認する


<img width="500px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/c9e4ca3c-1331-853b-56bd-bebe67c94e39.png">



ダイアログが表示されるので、以下の二つのチェックを入れる

Create new review apps for new pull requests automatically
のチェックを入れるとPR時に新しいアプリを作ってくれる
	
Destroy stale review apps automatically
5日起動しないと消える。ほっておいても良い
	
Enableボタンを押すと設定完了


### app.jsonの内容を修正したい場合
このapp.jsonは後からも修正できるし、add-onのプランはデフォルトだと一番安いプランになり、プランの変更はadd-on名:プラン名で指定できる


https://devcenter.heroku.com/articles/app-json-schema#example-app-json


## 動作確認

### リポジトリに適当な変更を追加する

ローカル環境のリポジトリのディレクトリに移動して以下の作業をする

```
# masterにgit pullする
git checkout master
git pull

# サンプルのブランチをbranchと言う名前で作る
git checkout -b branch

# 適当なファイルを作成し追加する
touch sample.txt
git add -A
git commit -m "test revie apps"

#branchブランチをgithubuにプッシュする
git push --set-upstream origin branch
```

### GithubでPull Requestを作る

branchリポジトリをmasterに対してPull Requestをつくる

<img width="500px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/94864e84-7e19-70af-a7ff-9a47009a4c4d.png">


PRを作った後にHerokuがreview用のアプリを作る間pendingの期間を減るとView developmentボタンが表示される

View developmentを押す

Review向けのアプリのURLが開き動作確認することができる

### Herokuの画面で確認

ダッシュボードから、パイプライン名のリンクをクリックして確認するとReveiw Appsが作成されているのがわかる。


<img width="500px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/af0ec5a4-6db6-645e-4210-dd253955e61e.png">


Review Appをクリックすると、Appの詳細も把握できる

<img width="300px" src="https://qiita-image-store.s3.amazonaws.com/0/5390/893939c6-2aa5-ec88-9c5e-c33e2325eced.png">



### Review Appsの削除
PRをマージしたりクローズするとHerokuのアプリも連携して削除される
PullrequestをReOpenすれば、再度作ってくれる