【Herokuエラー】Failed to install gems via Bundler. 解決法

本記事は私自身の勉強のインプットとアウトプットを兼ねたものになりますので、分かりにくい点もあるかと思います。
間違っているところがありましたらコメントにて教えてください。

railsチュートリアル第１章の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.
```

```ruby:Google翻訳
バンドルはプラットフォーム["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
```

そして再度デプロイしてみる…
しかし同じエラーが出ました。

さらに調べてみると

https://www.autovice.jp/articles/150

こちらの記事を発見。
Bundlerのバージョンが2.1.xの時は開発環境がmacOS、デプロイ先のサーバーがLinuxでも設定なしでデプロイができたようですが、
2.2.x以降は設定が必要になるので先程のコマンドと

```
% bundle lock --add-platform ruby
```

を実行する必要があるそうでした。

```Gemfile.lock
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.
```
次はこのようなエラーが出てきました。

```ruby:Google翻訳
リモート：！ 少なくとも2回。 この動作の一般的な原因の1つは、別のブランチからコードをデプロイしようとすることです。
```

このエラーの下にherokuサポートのURLが出てきましたのでそちらをクリックすると、
コミットされていないファイルがあるのにデプロイしようとしているためエラーが出ていたようです。

先程のエラーを解決するために実行したコマンドでGemfile.lockが新たに変更になっていました。

```
% git status
```
でmasterブランチにいることと変更されたファイルがあることを確認。

```
% git add -A 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#変更された全てのファイルををadd
% git commit -m "Update Gemfile.lock" #addしたファイルをコミット
% git push                            #githubにプッシュ
```

で変更されたファイルをコミットしてgithubにプッシュ。

そして再度デプロイ。

#エラー③

成功したようなのでデプロイしたアプリを開くと

![スクリーンショット 2021-10-22 12.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836602/4223eb26-dcb7-2aa8-f28a-98635cc48b7d.png)

何やらエラーっぽいので言われた通りのコマンドを実行してみました。

たくさんのログの中に

```
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)
```

```ruby:Google翻訳
'postgresql' ActiveRecordアダプターのロード中にエラーが発生しました。 依存する宝石がありませんか？ pgをアクティブ化できません（〜> 1.1）、すでにpg-0.18.4がアクティブ化されています。 すべての依存関係がGemfileに追加されていることを確認してください。 （LoadError）
```

pgのバージョンがあってないのか〜
と思い、[RubyGems.org](https://rubygems.org/)でpgと検索。
（今まではgoogle検索で引っかかったRubyGems.orgのpg 0.18.4のコードをコピーしていました。）

pg 1.2.3がヒット。
2021年10月現在ではこちらが最新バージョンでした。
めっちゃ前のやつをインストールしていました…情けない！

```ruby:Gemfile
gem 'pg', '~> 1.2', '>= 1.2.3'
```

と記述し直して、再度add→commit→push→デプロイ

をし直すとデプロイ完了しました！
情けないミスでしたがバージョンの大切さが身に沁みたのでした。