本記事は私自身の勉強のインプットとアウトプットを兼ねたものになりますので、分かりにくい点もあるかと思います。
間違っているところがありましたらコメントにて教えてください。
railsチュートリアル第1章のHerokuデプロイ時にエラーが起きたので、誰かの役に立てたらと思いこの記事を書くことにしました。
ローカル環境で学習を進めています。
#筆者の環境
Macbook Air(M1, 2020)
macOS Big Sur バージョン11.4
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]
Rails 6.1.4.1
Bundler version 2.2.29
heroku/7.59.1 darwin-x64 node-v12.21.0
#エラー①
Total 6995 (delta 795), reused 0 (delta 0), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: ! Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used.
remote: Detected buildpacks: Ruby,Node.js
remote: See https://devcenter.heroku.com/articles/buildpacks#buildpack-detect-order
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.2.21
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-3.0.2
remote: -----> Installing dependencies using bundler 2.2.21
remote: Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
remote: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform
remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote: --add-platform x86_64-linux` and try again.
remote: Bundler Output: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform
remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote: --add-platform x86_64-linux` and try again.
remote:
remote: !
remote: ! Failed to install gems via Bundler.
remote: !
remote: ! Push rejected, failed to compile Ruby app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to XXX
remote:
To https://git.heroku.com/XXX
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to XXX
このように出てデプロイできませんでした。
内容をみると
remote: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform
remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote: --add-platform x86_64-linux` and try again.
remote: Bundler Output: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform
remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote: --add-platform x86_64-linux` and try again.
バンドルはプラットフォーム["arm64-darwin-20"]のみをサポートしますが、ローカルプラットフォームはx86_64-linuxです。
`bundle lock --add-platform x86_64-linux`を使用して現在のプラットフォームをロックファイルに追加し、再試行してください。
Bundlerの出力:バンドルはプラットフォーム["arm64-darwin-20"]のみをサポートしますが、ローカルプラットフォームはx86_64-linuxです。
`bundle lock --add-platform x86_64-linux`を使用して現在のプラットフォームをロックファイルに追加し、再試行してください。
とありました。
言われた通り実行してみます。
% bundle lock --add-platform x86_64-linux
そして再度デプロイしてみる…
しかし同じエラーが出ました。
さらに調べてみると
こちらの記事を発見。
Bundlerのバージョンが2.1.xの時は開発環境がmacOS、デプロイ先のサーバーがLinuxでも設定なしでデプロイができたようですが、
2.2.x以降は設定が必要になるので先程のコマンドと
% bundle lock --add-platform ruby
を実行する必要があるそうでした。
PLATFORMS
arm64-darwin-20
ruby
x86_64-linux
追加されたか確認します。
#エラー②
再度デプロイしてみます。
remote: ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch.
次はこのようなエラーが出てきました。
リモート:! 少なくとも2回。 この動作の一般的な原因の1つは、別のブランチからコードをデプロイしようとすることです。
このエラーの下にherokuサポートのURLが出てきましたのでそちらをクリックすると、
コミットされていないファイルがあるのにデプロイしようとしているためエラーが出ていたようです。
先程のエラーを解決するために実行したコマンドでGemfile.lockが新たに変更になっていました。
% git status
でmasterブランチにいることと変更されたファイルがあることを確認。
% git add -A #変更された全てのファイルををadd
% git commit -m "Update Gemfile.lock" #addしたファイルをコミット
% git push #githubにプッシュ
で変更されたファイルをコミットしてgithubにプッシュ。
そして再度デプロイ。
#エラー③
成功したようなのでデプロイしたアプリを開くと
何やらエラーっぽいので言われた通りのコマンドを実行してみました。
たくさんのログの中に
code=H10
status=503
このような部分を発見。
H10 - App crashed (アプリがクラッシュしました)
Web dyno のクラッシュや Web dyno でのブートタイムアウトにより、このエラーが表示されます。
とherokuのエラーコード一覧に書いてあったので検索。
% heroku run console
を実行するとエラーが出てきて解決に繋がりそうなログが出てくると言うことを発見したので実行してみました。
Error loading the 'postgresql' Active Record adapter. Missing a gem it depends on? can't activate pg (~> 1.1), already activated pg-0.18.4. Make sure all dependencies are added to Gemfile. (LoadError)
'postgresql' ActiveRecordアダプターのロード中にエラーが発生しました。 依存する宝石がありませんか? pgをアクティブ化できません(〜> 1.1)、すでにpg-0.18.4がアクティブ化されています。 すべての依存関係がGemfileに追加されていることを確認してください。 (LoadError)
pgのバージョンがあってないのか〜
と思い、RubyGems.orgでpgと検索。
(今まではgoogle検索で引っかかったRubyGems.orgのpg 0.18.4のコードをコピーしていました。)
pg 1.2.3がヒット。
2021年10月現在ではこちらが最新バージョンでした。
めっちゃ前のやつをインストールしていました…情けない!
gem 'pg', '~> 1.2', '>= 1.2.3'
と記述し直して、再度add→commit→push→デプロイ
をし直すとデプロイ完了しました!
情けないミスでしたがバージョンの大切さが身に沁みたのでした。