app.jsonによるHeroku環境構築

 
## app.jsonとは...?

app.jsonは Heroku 環境構成ファイルとして機能します。

今の所用途としては以下のケースが考えられます。

- Heroku Button 
- Docker で環境構築
- PR でアレする。

app.jsonをベースにDockerファイルを作成するのは若干挙動がおかしかったりすることもあり、
自分でcomposeファイル書くほうが良さそう。

https://devcenter.heroku.com/articles/app-json-schema
にサンプルの`app.json`が掲載されています。

結構オプションの項目が多いので、最小構成でも全然動く。

### name, description, keyword, website, repository, logo

Heroku Buttonでアプリを作成する際に表示されるオプション情報。

基本的にoptionalで省略可能。

logo は外部にホスティングされた画像のURLを指定し、SVG,PNG,JPGが使える。

### success_url  

アプリがデプロイされた際に表示するURL

`/`スタートで、アプリ自体のURLを指定する事が可能

````
{
  "success_url": "/welcome"
}
````

### script 

デプロイに併せて実行されるスクリプト。現在`postdeploy` エントリのみサポート

````
{
  "scripts": {
    "postdeploy": "bundle exec rake bootstrap"
  }
}
```` 

### env

アプリに設定する環境変数。`"generator": "secret"`でrandomな値を自動生成させることが出来る。

````
{
  "env": {
    "SECRET_TOKEN": {
      "description": "A secret key for verifying the integrity of signed cookies.",
      "generator": "secret"
    },
    "WEB_CONCURRENCY": {
      "description": "The number of processes to run.",
      "value": "5"
    }
  }
}
````

### formation

dynoの種類を定義する。Procfileの代わりになるものではない。

````
{
  "formation": {
    "web": {
      "quantity": 2,
      "size": "Performance-M"
    }
  }
}
````

### image

Dockerで使用するイメージ名。Dockerで使用しないなら不要。

### addons

使用するAddons

### buildpacks

複数指定可能で、最後に記述したものがアプリケーションのタイプを規定する。

## Heroku Button

Heroku App のリポジトリに`app.json`を置いておくとHeroku Buttonの機能が使える。

~~プライベートリポジトリとかはNGっぽい(Heroku がデプロイ用にtarを取りに行くので)~~

Github 連携済みのアカウントを利用して、プライベートリポジトリにも対応可能なようです。
http://qiita.com/ryu22e/items/4d3b2e73efa1459725c1

一番簡単な設置方法は、Githubの公開リポジトリのReadmeに以下の記述を入れておくやり方。

````
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
````

リポジトリの情報を入れなくても、リファラからリポジトリのURLを認識して勝手に特定してくれる。

## Review App

1. パイプラインを作成して、Github連携を追加する。
2. review app 設定を有効化する。
3. PullRequest を作成

こちらはgithub連携機能を作成するので、Private リポジトリでも有効っぽい。

`{appName}-pr-x`という名前で自動的にアプリが立ち上がる。

Github側 PRの画面でもdeployの結果が表示されるあたり便利。

設定で変更可能だが、PR閉じた際に自動的にアプリを削除する事も可能。

## Docker 

下記の記事は2016年 01月の記事だけどもう内容が古くて実行できない。
https://devcenter.heroku.com/articles/docker

heroku-docker プラグインが herokuk-container-toolsに置き換わった模様

こちらのREADME.mdを参考にするのが良さそう
https://github.com/heroku/heroku-container-tools

### コンテナの作成

````
$ heroku plugins:install heroku-docker
$ heroku docker:init
````

このコマンドでDocker fileとdocker-compose.ymlが作成される。

後はdocker daemon が起動している状態で、コンテナを立ち上げればOK

````
$ docker-compose up web
```` 

worker 用のコンテナも起動する場合には、workerの名前を指定してやれば良い。

なお、app.json更新の際には`--force`オプションを付けてdocker ファイルなどを更新できる。

````
$ heroku docker:init --force
````

### 気になった点など

上手いこと利用するには、docker-composer.yml をかなり触らないと行けない。

Local HDDのマウントは デフォルトで作成されるshellの方にしか設定されていないので、

リアルタイムにWebの更新を進めようと思うとvolume設定をweb側にも追加する。

addons で設定したdatabaseなどもコンテナ設定等が追記されるものの、depends等まで上手いこと設定してくれるわけでもないので何とかしてweb側からつなぐよう設定を記述する必要あり。

あと当然全てのaddonsが対応しているわけではない。

カスタムビルドパックの設定などもapp.jsonで設定可能だが反映はされない模様？

app.json でenvの設定を空にしておくと、docker-compose.ymlに空の`environments:` エントリが作成されて、パースエラーになる(手動で [] を追加すれば治る)。

### 気になった点など(PHP)

Heroku環境構築では、Buildpack 設定さえすれば`composer require heroku/heroku-buildpack-php`不要だったが、

docker側ではエラーが出るっぽい。

ので、dockerで環境構築する際にはdev dependency にビルドパックを追加する必要あり。

phpプロジェクトではdocker buildの際にcomposerの post-install-cmdを叩くよう。からでも良いのでエントリに追加しておく。
(composer run ではなくて、composer.jsonをpythonでパースしてシェルで叩いている。)