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
で
:
:
remote: !
remote: ! Precompiling assets failed.
remote: !
remote: ! Push rejected, failed to compile Ruby app.
:
:
コンパイルエラーが出てしまった。
ググると、cssをsccsに変えると良い。とか、cssでエラー出てるはず。とかがヒットするのでまずscss周りを見直す。
W3Cの警告が出てるものの、それが原因ではなさそう。
あとは以下を加えると良いというアドバイスが多かったので、production.rbに以下一文を追加してみる。
config.assets.initialize_on_precompile = false
相変わらず
Precompiling assets failed.
bashに色つけてるので赤い...
エラーログを遡ると、赤字のずっと前に
:
:
remote: Running: rake assets:precompile
remote: rake aborted!
remote: KeyError: key not found: "TWITTER_KEY"
:
:
Twitterの認証キーがないエラーが出ていた。気がつかなかった。
(アプリにTwitter認証つけてます)
Heroku側に設定するために、.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.
のエラーは消えました。(やった)
しかし
$ heroku open
でアプリケーションエラーが出てしまう。
言われたとおりターミナルでログ見ます。
$ 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してなかったことに気がつきここで
$ heroku run rake db:migrate
します。
状況変わらず "App crashed" 壊れてる...
Herokuでrails consoleしてみる
$ heroku run rails console
すると...
You don't have bcrypt installed in your application. Please add it to your Gemfile and run bundle install
Gemないって言われた...
Gemfile確認
group :development, :test do
:
gem 'acts-as-taggable-on'
gem 'bcrypt'
gem 'carrierwave'
end
なぜ君たちこんなところにいるんや...(私が置いた)
本番でも使いたいgemを、development、testグループの外に出します。
gem 'acts-as-taggable-on'
gem 'bcrypt'
gem 'carrierwave'
group :development, :test do
:
end
改めて
$ 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)を期日内に実装できなかったし、テストできなかったし、理解が曖昧なままとりあえずコピペで動いた部分が多いアプリなので反省点多いですが、逆にいうと課題感多めで引き続き手を加えていけそう。エラーが出たら落ち着いてログを辿ろう。
コース選択しておきながら手がつけられなかったブロックチェーンもやってみたいです。