Herokuにpushしたらprecompile assets faild.が。pushできたと思ったらApplication Errorが。解決するまで。

Railsで作ったアプリをHerokuにデプロイするときにはまったので、解決するまでを記録します。
##...のまえに結論

$ heroku push origin master で precompile assets faild. エラーがでたら...

- 目立つエラーメッセージに惑わされずにログをじっくりたどる
- 必要なキーの設定をHeroku側にしてるか確認する
- API使ってる時はコールバック先確認

HerokuにpushできたけどApplication Errorが表示されちゃったら...

- db:migrateしたか確認
- Gemfileでgemのグループを確認

-----------------
**ローカル環境**
MacOS 10.14.3
Rails 5.2.2
Ruby 2.4.1p111
MySQL 5.7.24

Herokuにアカウント作り、ログインし、git initも済んでる状態。

`$ git push heroku master`
で

```terminal:ターミナル
：
：
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
：
：
```
コンパイルエラーが出てしまった。
ググると、cssをsccsに変えると良い。とか、cssでエラー出てるはず。とかがヒットするのでまずscss周りを見直す。
W3Cの警告が出てるものの、それが原因ではなさそう。

あとは以下を加えると良いというアドバイスが多かったので、production.rbに以下一文を追加してみる。

```config/environments/production.rb
config.assets.initialize_on_precompile = false
```
相変わらず

Precompiling assets failed. 

bashに色つけてるので赤い...

エラーログを遡ると、赤字のずっと前に

```terminal:ターミナル
：
：
remote:        Running: rake assets:precompile
remote:        rake aborted!
remote:        KeyError: key not found: "TWITTER_KEY"
：
：
```
Twitterの認証キーがないエラーが出ていた。気がつかなかった。
（アプリにTwitter認証つけてます）

Heroku側に設定するために、.envファイルを確認します。

```ruby:.env
TWITTER_KEY="XXXXXXXX"
TWITTER_SECRET="XXXXXXXXXXX"
```
確認できたキーをHerokuのDashboard＞アプリ名＞Settingsの「Reveal Config Vars」に保存します。

HerokuのDashboard →　https://dashboard.heroku.com/

ついでに、Twitter Developerページのダッシュボードで指定していたWebsite URL（いったん適当なURLにしていた）とCallback URL（localhost:3000/auth/twitter/callbackにしていた）をHerokuで生成されたURLに変更しておきます。
コールバックURLの方はlocalhost:3000の部分を書き換える。

（Herokuで生成されたURLはHerokuダッシュボードのアプリ名＞SettingsのDomains and certificatesで確認できる。）

Twiiter Dev → https://developer.twitter.com/

そうしたら

Precompiling assets failed.

のエラーは消えました。（やった）

しかし

```terminal:ターミナル
$ heroku open
```
でアプリケーションエラーが出てしまう。

<img width="585" alt="heroku_app_error.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/265562/d2fa5c14-30a6-7b9b-f86c-4df412dc6c2c.jpeg">


言われたとおりターミナルでログ見ます。

```terminal:ターミナル
$ heroku logs --tail
:
:
2019-03-16T06:10:52.352205+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=xxxxxxxx.herokuapp.com request_id=63647cae-55a1-469e-9de7-c2ac1baa9f44 fwd="xxx.xxx.xxx.xxx" dyno= connect= service= status=503 bytes= protocol=https
2019-03-16T06:10:53.066646+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=xxxxxxxx.herokuapp.com request_id=427cafc7-33b7-4381-a271-8e114b305d0e fwd="xxx.xxx.xxx.xxx" dyno= connect= service= status=503 bytes= protocol=https
```
「H10 heroku error」で調べてみる。うーん。

db:migrateしてなかったことに気がつきここで

```terminal:ターミナル
$ heroku run rake db:migrate
```
します。

状況変わらず "App crashed" 壊れてる...

Herokuでrails consoleしてみる

```terminal:ターミナル
$ heroku run rails console
```

すると...

```terminal:ターミナル
You don't have bcrypt installed in your application. Please add it to your Gemfile and run bundle install
```

Gemないって言われた...
Gemfile確認

```ruby:Gemfile
group :development, :test do
  :
  gem 'acts-as-taggable-on'
  gem 'bcrypt'
  gem 'carrierwave'
end
```
なぜ君たちこんなところにいるんや...（私が置いた）
本番でも使いたいgemを、development、testグループの外に出します。

```ruby:Gemfile

  gem 'acts-as-taggable-on'
  gem 'bcrypt'
  gem 'carrierwave'

group :development, :test do
  :
end
```
改めて

```terminal:ターミナル
$ git add .
$ git commit -m "ほにゃほにゃ"
$ git push origin master
$ git push heroku master
$ heroku open
```

無事に動きました。
この間に、masterブランチをHEADにする作業などを挟んでます。

以上。

##ポエム

さて。

ここまで自分で解決できずに、スクールのメンターさんに一緒に解決していただきました。1人では無理だった。聞ける人がいる環境って必要だなぁ。
そして3ヶ月お世話になったスクールの受講期間が終わり、週一ペースで見てもらってたメンターさんとも最後でした。フルタイムバイトしつつなので睡眠時間の確保とモチベーションの維持が難しかったです。

教材として提供されているインスタ風の写経アプリのあと、オリジナル開発として一通りのCRUD、セッション管理に加え、Twiiter認証や、カレンダー表示、タグ、レスポンシブなハンバーガーメニュー、ページネーションなど興味があるものを実装したTwitter風メモアプリ（今回デプロイしたやつ）を作ってみました。

最初に考えたMVP（Minimum Viable Product）を期日内に実装できなかったし、テストできなかったし、理解が曖昧なままとりあえずコピペで動いた部分が多いアプリなので反省点多いですが、逆にいうと課題感多めで引き続き手を加えていけそう。エラーが出たら落ち着いてログを辿ろう。

コース選択しておきながら手がつけられなかったブロックチェーンもやってみたいです。