#主旨
Herokuを使ってデプロイをやってみた時の参考記事とぶち当たったエラーの記録です。
#当時の環境
MacOS
Rails 5.2.1
Bundler version 2.0.1
#基本的な進行でお世話になった参考記事
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#heroku%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4
とても親切な記事でした。
こちらの流れに乗ると大体進められました。
違った部分は、上の記事ではsqLite3を使用していたのに対し、私はMySQL2を使用していた点。
#Herokuでのデプロイで立ちはだかった強敵
以下、私がぶち当たったエラー集。
ご参考になさってください。
#$ git push heroku master できない問題
<エラー文(一部変更)>
remote: ! Could not detect rake tasks
remote: ! ensure you can run $ bundle exec rake -P
against your app
remote: ! and using the production group of your Gemfile.
remote: ! Activating bundler (2.0.1) failed:
remote: ! Could not find 'bundler' (2.0.1) required by your /tmp/build_####################/Gemfile.lock.
remote: ! To update to the latest version installed on your system, run bundle update --bundler
.
remote: ! To install the missing version, run gem install bundler:2.0.1
remote: ! Checked in 'GEM_PATH=vendor/bundle/ruby/2.5.0', execute gem env
for more information
remote: !
remote: ! To install the version of bundler this project requires, run gem install bundler -v '2.0.1'
==>
ざっくり和訳すると、「bundler 2.0.1」が見当たらないから入れてね、みたいな。
...入れても何も、最初からbundler 2.0.1なんですよねぇ。
Gemfile.lockを見ても、やはりバージョンは2.0.1。
なんか遠回り(bundlerのバージョンupdateしたり)しつつ、二時間くらいで対策発見。
ビルドパック?なるものでこの状態を回避できるらしい…
$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
(ソース:https://stackoverflow.com/questions/56680065/heroku-installs-bundler-then-throws-error-bundler-2-0-1)
Herokuで使用するbundlerを2.0.1でも対応するようにするためのエニシングなのかしらん...?
よく分からないところもありますが、実際成功した。やった!
でもすぐに新たなエラー、現る。
#$ heroku exec rails db:migrate できない問題
(そしてbundle installでもエラーが出る問題)
<migrate の方>
Specified 'postgresql' for database adapter, but the gem is not loaded. Add gem 'pg'
to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).
<bundleの方>
An error occurred while installing pg (0.19.0), and Bundler cannot continue.
Make sure that gem install pg -v '0.19.0' --source 'https://rubygems.org/'
succeeds before bundling.
==>
エラー文をざっくり要約すると、「gem ‘pg’」がインストールできてないよと。
でも、GemfileにもGemfile.lockにも記載はされているという状態。
まず、「gem ‘pg’」のバージョンを指定してやるといい、という記事をいくつか見かけました。
herokuではデプロイ毎にbundle installが行われる仕様?のようで、いつしかpgのバージョンがアップデートされて、herokuが対応していないものになっちゃうらしい。
なので、こちらであらかじめHerokuが対応できているバージョンを指定するのが安全!という理屈。
なので、Gemfileに「gem 'pg', '~> 0.19.0’」とバージョンを追記。
でも、解消せず。(bundle installが通らない)
嘘やん!?
とりあえず、pgがbundle installできないのをどうにもできず、ギブアップ。
メンターさんを召喚して知恵を貸してもらう事に。
(教えてもらえる内にこれに取り組んで良かった、とこの時思った)
メンターさんは、gemfileにもがっつり記載されてるのに居ない子(読み込めないよ!)扱いされるpgの元のアプリ 'postgresql’に注目。
私のmacさんにはインストールされてないアプリなのですが、Herokuの使用するSQLのデフォルトがこれなのでそれに対応するために本番環境(production)にだけ、動かすための「gem ‘pg’」を入れている。
開発・テスト環境は元々使用しているMySQL2を適用している状態。
そこで、メンターさんが気づいた。
「…大元の'postgresql’をインストールしてないから、それに対応したGemを読み込めないんじゃないですか?」
...なるほど!そこか!!
'postgresql’をインストール
→ bundle install
→何事もなく成功。
…せやな、大元のアプリがないのにrails対応用のgemが動くはずないわな。
盲点でした。
その後、
heroku exec rails db:migrate
→ bundlerを2.0.1にしなさいと怒られる。
前段階で足掻きまくった時にUpdateして2.0.2になってたのを、2.0.1に戻して再チャレンジ。
すると、やっとマイグレーションに成功しました。
ホームページを見てみる…おお、個人アプリのルートパス画面!
やった!大勝利!!
メンターさんありがとうございます!!(泣)
今回の教訓
①公式のアナウンスはきちんと確認しよう
Herokuの公式情報を見て判明したのですが、最新のバージョンだとHeroku側が対応中でパッチ的なの配ってたり完全に未対応だったりする模様。
一次ソースの確認はとても大事。
②gemを使うときは、そのgemの大元のアプリをインストールしておく
今回でいうと、gem 'pg'の元のアプリ 'postgresql’。
使わないにしろ、ローカルにインストールは必要だった模様。
AWSと比べると確かにステップは簡単でした。
でも、細かく設定する訳ではない分、エラーにぶち当たった時に何が原因なのかがわかりにくいのかな?という印象です。