Heroku Javaで始め方（Getting Started on Heroku with Java）

# Heroku を初めて利用する際のメモ
* 本家の「Getting Started on Heroku with Java」を実施した際のメモ書きとなります。
    * [Getting Started on Heroku with Java](https://devcenter.heroku.com/articles/getting-started-with-java#introduction)

## 環境
* 2016/10/22(Sat) 時点
    * クラウドのサービスは仕様がよく変わるので後で参照するときは、変更点に気を付ける
* Sign upについては割愛
    * アカウントを作成してSign upした状態からスタート
* 開発PC
    * Windows 10 64bit
* 開発言語
    * 本家を参照する
    * 最低限下記が必要
        * a free Heroku account.
        * Java 8 installed locally.
        * Maven 3 installed locally.
            * Gradleじゃないのか。。。orz
        * 公式には書いていないが、前提としてgitの環境整備はされてる必要がある。

## Set up
* [本家リンク](https://devcenter.heroku.com/articles/getting-started-with-java#set-up)

* Heroku CLIのインストール
    * 本家のページからインストーラをダウンロードする。
    * インストールする。
        * はい or 進むでＯＫ
    * cmd.exeを起動する（環境変数の変更が発生しているので、ここで新規で起動すること）
    * 以下のようにコマンドを実行する。(> が入力コマンド、無いものが標準出力）
        * ! Add ～　が表示されればインストール完了

``` cmd.exe
> heroku
heroku-cli: Installing CLI... 17.56MB/17.56MB
Enter your Heroku credentials.
Email: herokuに登録したEmailを入力する
Password (typing will be hidden): パスワードを入力する
Logged in as EmailAdress
 !    Add apps to this dashboard by favoriting them with heroku apps:favorites:add
See all add-ons with heroku addons
See all apps with heroku apps --all

See other CLI commands with heroku help
``` 

##  Prepare the app
* サンプルアプリを利用したアプリ
* 以下のようにコマンドを実行する。

``` cmd.exe
> git clone https://github.com/heroku/java-getting-started.git
Cloning into 'java-getting-started'...
remote: Counting objects: 184, done.
Receiving objects:  72% (133/184)   0 (delta 0), pack-reused R184
Receiving objects: 100% (184/184), 81.08 KiB | 0 bytes/s, done.
Resolving deltas: 100% (53/53), done.
Checking connectivity... done.
> cd java-getting-started
```

## Deploy the app
### Heroku上にアプリを作成する。
* 以下のようにコマンドを実行する。
    * 99999 については、実際時コマンド実行時に任意で採番される番号となる。

``` cmd.exe
> heroku create
Creating app... done, agile-ravine-99999
https://agile-ravine-99999.herokuapp.com/ | https://git.heroku.com/agile-ravine-99999.git
```

* コマンド実行後に [https://dashboard.heroku.com/apps](https://dashboard.heroku.com/apps) に接続すると上記のアプリが作成されている。

### Herokuにデプロイ
* 次にGitのmaterをherokuにデプロイする。

``` cmd.exe
> git push heroku master
・・・ 
remote:        [INFO] ------------------------------------------------------------------------
remote:        [INFO] BUILD SUCCESS
remote:        [INFO] ------------------------------------------------------------------------
remote:        [INFO] Total time: 11.732 s
remote:        [INFO] Finished at: 2016-10-22T07:06:07+00:00
remote:        [INFO] Final Memory: 30M/194M
remote:        [INFO] ------------------------------------------------------------------------
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 50.7M
remote: -----> Launching...
remote:        Released v4
remote:        https://agile-ravine-99999.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/agile-ravine-99999.git
 * [new branch]      master -> master
```

デプロイ完了。

### インスタンスが実行されていることの確認

``` cmd.exe
>  heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free
```

1つのアプリが実行されていることが確認できた。

### デプロイされたアプリの確認
* URLを入力等々の簡略化のために、herokuからコマンドが提供されている。

``` cmd.exe
> heroku open
```

利用するブラウザが選択があり、実際の画面が表示される。

## View Logs
* ログを見てみよう

``` cmd.exe
heroku logs --tail
```

## Define a Procfile
* java-getting-started\Procfileに下記のような記述がされている。
    * web: java -jar target/helloworld.jar
* TODO とりあえずおまじないとして覚えておく

## Scale the app
* 現在、動いているアプリ情報を確認する

``` cmd.exe
> heroku ps
=== web (Free): java -jar target/helloworld.jar (1)
web.1: up 2016/10/22 16:06:19 +0900 (~ 40m ago)
```

* 動いているダイノの変更をしたい場合（この例だと動いているアプリが０となる）

``` cmd.exe
> heroku ps:scale web=0
```

* 試しに、前述の ' heroku open ' を実行すると `Application Error` 画面が表示される。


* これで元に戻る

``` cmd.exe
> heroku ps:scale web=1
```

## Declare app dependencies
* pom.xmlやsystem.properitesを変更した際に、__mvn clean install__ を実行すれば更新されます。
* 手順書どおりに行っているとローカル環境の設定はされていないで、一度は実行しておく。

``` cmd.exe
> mvn clean install
```

## Run the app locally
* ローカルでアプリを実行する。
    * __mvn clean install__ は実行済みであること

``` cmd.exe
> heroku local web
[OKAY] Loaded ENV .env File as KEY=VALUE Format
・・・
```

* Ctrl + C で止められる。
* __http://localhost:5000/__ にアクセスして画面が表示されればＯＫ

## Push local changes
### ローカルの変更

* ローカルの変更をHerokuに反映する。
* 詳細は本家参照
    * https://devcenter.heroku.com/articles/getting-started-with-java#push-local-changes
* 変更後にコマンドを実行、ローカル起動を行う。

``` cmd.exe
> mvn clean install
・・・
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.366 s
[INFO] Finished at: 2016-10-22T18:13:25+09:00
[INFO] Final Memory: 24M/204M
[INFO] ------------------------------------------------------------------------
```

``` cmd.exe
> heroku local web
[OKAY] Loaded ENV .env File as KEY=VALUE Format
・・・
```

* http://localhost:5000/hello にアクセスし、下記のように表示されれば更新は成功
    * E=mc^2: 12 GeV = (2.139194076302506E-26 ± 1.4E-42) kg

### Herokuへの反映
* 下記のコマンドを実行してHerokuへ反映する

``` cmd.exe
> git add .
・・・
> git commit -m "Demo"
・・・
> git push heroku master
・・・
> heroku open hello
```

* ローカルで確認と同様に下記のように表示されればＯＫ
    * E=mc^2: 12 GeV = (2.139194076302506E-26 ± 1.4E-42) kg

## Provision add-ons
* Freeアカウントのため、addonは使えないよとのこと、割愛

```
Creating papertrail on agile-ravine-99999... !
 !    Please verify your account to install this add-on plan (please enter a credit card) For more information, see
 !    https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify
```

## Start a one-off dyno
* one-off dynoを使って、REPLプロセスを起動する。

``` cmd.exe
> heroku run bash
Running bash on agile-ravine-99999... up, run.4576 (Free)
~ $ java --version
・・・・
```

* java -versionで動作検証しているが、dir / pwdなどで実験してもよい
* 終了時は __exit__ を入力して、確実にdynoから抜けることに注意。

## Define config vars
* config vars という設定にて、暗号化キーや外部ファイルアドレスを管理できる。
* config varsはアプリからは環境変数として取得できる。
* ソースの修正方法は[本家](https://devcenter.heroku.com/articles/getting-started-with-java#define-config-vars) 参照。
* __mvn clean install__ , __heroku local web__　と実行する。
* http://localhost:5000/hello にアクセスする。下記のように表示が変更される
    * E=mc^2: 20 GeV = (3.5653234605041761E-26 ± 2.9E-42) kg
* localについては、.envの内容が参照する。
* remoteにも反映する。

``` cmd.exe
> git add .
> git commit -m "Demo"
> git push heroku master
> heroku open hello
```

__500 Internal Error__ でエラーとなる。

* cofing varsに設定する。
* コマンドを実行するとconfig varsに登録され、そのままアプリのリスタートが行われる。
* 再度、heroku open hello と実行すると、ローカルと同等の結果が得られる。

``` cmd.exe
> heroku config:set ENERGY="20 GeV"
Setting ENERGY and restarting agile-ravine-99999... done, v7
ENERGY: 20 GeV
```

* herokuに登録してある情報を確認する場合は、下記のコマンドを実行する。

``` cmd.exe
> heroku config
```

## Use a database
* addonの状況を確認
* postgreを利用していることが確認できる。

``` cmd.exe
> heroku addons

Add-on                                           Plan       Price  State
───────────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-elliptical-xxxxx)  hobby-dev  free   created
 └─ as DATABASE

> heroku pg
===
Plan:        Hobby-dev
Status:      Available
Connections: 0/20
PG Version:  9.5.4
Created:     2016-10-22 07:06 UTC
Data Size:   7.4 MB
Tables:      0
Rows:        0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      postgresql-elliptical-xxxxx
```

* 現状のアプリでＤＢは利用する状態になっているので、下記のコマンドで画面を開く

``` cmd.exe
> heroku open db
```

__Read from DB: 2016-10-22 14:57:43.560289__ と表示されればＯＫ

* ここまで！