cloud9 から heroku にデプロイするまで ＋ ごにょごにょ


# はじめに
## 背景
[Ruby on Rails Tutorial](https://railstutorial.jp/) を始めた。
理解を兼ねて、また、いつでも取り出せるように理解／実施したことや調べたことなどを記録している。
誤って理解して怪しげなことを書いている箇所もあるに違いないです（笑

## 前提
cloud9 上で操作している
heroku のユーザ登録が完了している
今回のは scaffold フレームワークを使用して生成したアプリケーション


# 初期設定
## heroku コマンドラインクライアントの準備
インストールされているか確認する

``` 
$ heroku version 
```

私は cloud9 を使用しているので、インストール済だったが、インストールされていない場合は、Heroku Toolbelt をインストールする必要があるらしい
>heroku-toolbelt/3.43.16 (x86_64-linux) ruby/2.3.0
>heroku-cli/5.8.5-614a805 (linux-amd64) go1.7.5
>You have no installed plugins.


## gem を整える
### Gemfile を編集する
scaffold で作成した gem には、sqllite が含まれているが、 heroku では postgres を使うらしい。なので、gem を修正する。
（要確認：sqllite は無償では使えない、ということかな？）

production 環境に postgres を導入する

```Gemfile
group :production do
  gem 'pg', '0.18.4'
end
```

デフォルトでは sqllite は環境によらず導入する指定となっているので、 development と test 環境に導入するように変更する

```Gemfile
group :development, :test do
  gem 'sqlite3'
  gem 'byebug', platform: :mri
end
```

なお、cloud9 上にインストールする場合には、以下のように環境を指定する。（ここでは、除外する環境を指定している。）

```
$ bundle install --without production
```

## heroku に cloud9 からのアクセスを許可する
heroku にログインし、ssh キーを登録する。

```
$ heroku login
$ heroku keys:add
```

heroku からメールが届いたので、ssh キーの登録に成功したようだ。
> Key added to your Heroku account


# heroku にアプリケーションを登録する
## cloud9 から application を登録する


```
$ heroku create
```

作成された URL が表示される。※URLは適当。。
>Creating app... done, ⬢ hoge-hoge-12345
https://hoge-hoge-12345.herokuapp.com/ | https://git.heroku.com/hoge-hoge-12345.git

## heroku で確認する
heroku にログインすると、作成したアプリケーションが表示されている。
![スクリーンショット 2017-04-12 12.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/27486/cc3d54ea-1900-8d6d-d8f9-151309608393.png "スクリーンショット 2017-04-12 12.28.07.png")

# heroku にデプロイする
## cloud9 でデプロイする
heroku に リポジトリをプッシュする

```
$ git push heroku master
```

出力を眺めると、こんなことをしている様子。
1. ソースを圧縮して転送
2. コンパイル
3. bundler を使用し、依存するライブラリをインストール
4. Preparing app for Rails asset pipeline　？？
5. ローンチ
6. デプロイを検証する

## マイグレーションする
DB が必要な場合は、マイグレーションする

```
$ heroku run rails db:migrate
```

## デプロイ結果を確認する（heroku）
heroku にログインし、アプリケーションの情報を参照すると、Actibity 欄に以下のように表示されている。
ビルド、デプロイとも成功したようだ。
![スクリーンショット 2017-04-12 12.47.30.png](https://qiita-image-store.s3.amazonaws.com/0/27486/765ef08a-3832-5e59-233a-af61ddc7f718.png "スクリーンショット 2017-04-12 12.47.30.png")

## 動作確認する
heroku create 時に表示された URL をクリックするか、heroku のアプリケーションのページから Open App
 ![スクリーンショット 2017-04-12 12.53.14.png](https://qiita-image-store.s3.amazonaws.com/0/27486/063d2bff-7b6d-4629-fcdc-e3066519cfa8.png "スクリーンショット 2017-04-12 12.53.14.png")

# heroku の Tips
## アプリケーション名を変更する

```
$ heroku rename 新アプリ名
```

一意である必要があるそう。また、アプリ名に使用できる文字にも制限がある。

## アプリケーションを削除する

```
$ heroku apps:destroy --app アプリ名
```

削除の実施前に確認あり。アプリケーション名を入力する必要がある。
確認不要のコマンドもある＝＞[Herokuのアプリをターミナルで削除する](http://slowquery.hatenablog.com/entry/2014/04/06/112330)

## タイムゾーンを設定する
ご参考：[heorkuでタイムゾーン設定](http://qiita.com/haman29@github/items/773b522b92bbf806ab32)

現在の時刻を調べる

```
 $ heroku run console
Running console on ⬢ rails-hello-20170406... up, run.3959 (Free)
Loading production environment (Rails 5.0.2)
irb(main):001:0> Time.now()
=> 2017-04-12 04:30:45 +0000
```

タイムゾーンを東京(UTC+9:00)に設定

```
$ heroku config:add TZ=Asia/Tokyo
Setting TZ and restarting ⬢ hoge-hoge-12345... done, v8
TZ: Asia/Tokyo
```

heroku の Activity を確認すると、タイムゾーンが変更されたと記録されている。
![スクリーンショット 2017-04-12 14.04.16.png](https://qiita-image-store.s3.amazonaws.com/0/27486/27d12156-b41f-c5f2-1af0-1279718ff2b3.png "スクリーンショット 2017-04-12 14.04.16.png")


heroku の Settings-Config Variables を見ると、タイムゾーンは Asia/Tokyo と期待通り。
![スクリーンショット 2017-04-12 14.07.09.png](https://qiita-image-store.s3.amazonaws.com/0/27486/4cba5c2a-a711-31e6-ba57-d01d6e9f2163.png "スクリーンショット 2017-04-12 14.07.09.png")

コンソールで表示されるタイムスタンプは変わったが、heroku のログに出力される時間は変わらず。restart しても変わらず・・


# トラブルシューティング
## ビルドに失敗
### 状況を確認する
Activity にエラーと表示されている
![スクリーンショット 2017-04-12 12.57.34.png](https://qiita-image-store.s3.amazonaws.com/0/27486/180bc052-60f6-fd33-91f3-df6d232e46a2.png "スクリーンショット 2017-04-12 12.57.34.png")

### 原因を調査する
ログを見ると、 sqllite3 がサポート外だから gem のインストールに失敗したと言われている。
> !     Failed to install gems via Bundler.
> !     Detected sqlite3 gem which is not supported on Heroku:
> !     https://devcenter.heroku.com/articles/sqlite3
> !
> !     Push rejected, failed to compile Ruby app.
> !     Push failed
 
 
### 原因を取り除く
 この例だと、gem を修正する
 
### 再度デプロイする
 
```
$ git push heroku master
```

## アプリケーション実行時にエラー
### ログを確認する
アプリケーションページの右上、 More - View logs からログを参照する
![スクリーンショット 2017-04-12 13.23.46.png](https://qiita-image-store.s3.amazonaws.com/0/27486/172cda2a-301e-54d6-db2e-015d3c53334f.png "スクリーンショット 2017-04-12 13.23.46.png")

例）原因とか、エラーとなった箇所とか。
>2017-04-12T04:22:42.003666+00:00 app[web.1]: F, [2017-04-12T04:22:42.003606 #4] FATAL -- : [d2afeae8-42d0-4431-9090-1d4cfaaa2fb1] ActionView::Template::Error (undefined method `content' for nil:NilClass):
> （中略）
>2017-04-12T04:22:42.004019+00:00 app[web.1]: F, [2017-04-12T04:22:42.003955 #4] FATAL -- : [d2afeae8-42d0-4431-9090-1d4cfaaa2fb1] app/views/users/show.html.erb:15:in `_app_views_users_show_html_erb___69258317908889721_70147712573680'




以上