Railsチュートリアル第1章、herokuへデプロイする際にエラー

# この記事について
現在、Railsチュートリアル6版の2週目にチャレンジ中のNIssyiと申します。
1週目に挑戦した際にも同じ箇所でつまずいていました。自分への備忘録、そして自分と同じような初心者がつまずいた際に参考にできることを目指して記事を投稿します。


## 開発環境
開発環境は以下のとおりです。

- Macbook Pro(13-inch, M1, 2020)
- Mac OS Big Sur 11.6
- VSCode (Visual Studio Code - Insiders 1.62.0)

# エラーの概要
Railsチュートリアル6版の「1.5.2Herokuにデプロイする（1）」でherokuへデプロイしようとしたときに発生したエラーです。

```:ターミナル
$ git push heroku main

Enumerating objects: 113, done.
Counting objects: 100% (113/113), done.
Delta compression using up to 8 threads
Compressing objects: 100% (94/94), done.
Writing objects: 100% (113/113), 141.99 KiB | 7.10 MiB/s, done.
Total 113 (delta 7), 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-2.7.4
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:  !
remote:  ! ## Warning - The same version of this code has already been built: f0b18d1d98d71b106e8873195b323b18f6077dbf
remote:  !
remote:  ! We have detected that you have triggered a build from source code with version f0b18d1d98d71b106e8873195b323b18f6077dbf
remote:  ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch.
remote:  !
remote:  ! If you are developing on a branch and deploying via git you must run:
remote:  !
remote:  !     git push heroku <branchname>:main
remote:  !
remote:  ! This article goes into details on the behavior:
remote:  !   https://devcenter.heroku.com/articles/duplicate-build-version
remote: 
remote: Verifying deploy...
remote: 
remote: !       Push rejected to xxxxxxxxxxxxxxxxxx.
remote: 
To https://git.heroku.com/xxxxxxxxxxxxxxxxxx.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/xxxxxxxxxxxxxxxxxx.git'
```

基本的にチュートリアルに沿って進めているのになぜかエラーが発生しました。エラーの原因を特定してみようと思います。


## エラーが発生していそうな箇所を探す
先ほどのログからエラーの情報が書いてありそうなところを探してみます。

ログの最初の方に、「!」が出ているところがありますね。

```:ターミナル
$git push heroku main

Enumerating objects: 113, done.
(省略)
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
```
"Warning"と警告を発しているのはわかるんですが…英語力がないのでそれ以降はなんて書いてあるのかサッパリです。こんなときはGoogle先生に翻訳してもらいましょう!


```:google翻訳
警告：複数のデフォルトビルドパックが、このアプリを処理する機能を報告しました。 以下のリストの最初のビルドパックが使用されます。
検出されたビルドパック：Ruby、Node.js
```
ビルドパックとやらが競合を起こしたのでしょうか…?
ただ、ここでは勝手に解決されているようなので、デプロイで発生したエラーの原因ではなさそうです。

引き続き、エラーの原因を探してみます。

```:ターミナル
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:  !
(省略)
```

ログの中盤で「!」が続いたり、「Push failed」となっている箇所を発見しました。このあたりでエラーが起きていそうな気がします。

```:ターミナル
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.
```

２回も似たような文章が表示されている箇所を発見しました。「try again」と文末に書いてあります。なにかをもう一度やり直せと言っているのでしょうか？

```:google翻訳
バンドルはプラットフォーム["arm64-darwin-20"]のみをサポートしますが、ローカルプラットフォームはx86_64-linuxです。
 `bundle lock --add-platform x86_64-linux`を使用して現在のプラットフォームをロックファイルに追加し、再試行してください。
```

ログに書いてあるとおり、Bundlerでサポートされているプラットフォームと自分のローカルプラットフォームの差異が原因のようです。

## エラーの文章で検索してみる
エラーらしきものを発見したものの、どのように対処すればよいのかわからないのでエラーメッセージ自体をgoogleで検索してみます。すると、参考になりそうなページを発見。こちらの[【Rails】Bundler 2.2.x以降は開発者が適切なプラットフォームを追加する必要がある](https://www.autovice.jp/articles/150)を参考に、以下のbundleコマンドを実行してみます。


```:ターミナル
$ bundle lock --add-platform x86_64-linux
```

Gemfile.lockにプラットフォームが追加されました。


```:Gemfile.lock
PLATFORMS
  arm64-darwin-20
  x86_64-linux
```

# エラーを解消、再びherokuへデプロイ
ここで慌てずに、変更をコミットしておきます。

```:ターミナル
$ git commit -am "プラットフォームをGemfile.lockに追加"
```

では、デプロイしてみましょう。

```:ターミナル
$ git push heroku
Enumerating objects: 116, done.

(省略)

remote:        https://xxxxxxxxxxxxxxxxxx.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/xxxxxxxxxxxxxxxxxx.git
 * [new branch]      main -> main
```

デプロイができたようです!!

ターミナルのログに表示されている"To https://....git"のリンクを開くか、heroku openコマンドでデプロイできているか確認してみます。

```:ターミナル
$ heroku open
```
無事、表示したいRailsアプリケーションのビューが表示されていたら完了です!

#感想
エラーが発生した際には以下の点を気をつけてみようと思います。

- エラーログを読んでみる
- 英語が読めないならgoogle翻訳など翻訳サービスにメッセージをぶっこんでみる
- エラーログ自体で検索してみる。

## 参考にさせていただいたページ
[【Rails】Bundler 2.2.x以降は開発者が適切なプラットフォームを追加する必要がある](https://www.autovice.jp/articles/150)