Rails初心者が初めての【Heloku】へデプロイした話。[デプロイ ~ エラー解決まで]

#はじめに
本記事は教材をもとにアプリ作成初心者がRailsで作成したアプリをGitを使い、Herokuへデプロイした記事になります。
手順通り進めたつもりですが、エラー連続で試行錯誤してなんとかデプロイに成功した際の対処法をまとめたものになるのであらかじめご了承ください。
##環境及び前提条件

Railsでのアプリ作成は前提としております。

- Ruby 3.0.1

- Rails 6.0.3.6

- mac os Big Sur



##Herokuへアカウント登録

下記URLからアカウント登録。
https://signup.heroku.com/jp

##Heroku CLI をインストールして設定

今回はHoebrewからインストールしていく為、
ターミナルにて下記コマンドを入力。

```
brew tap heroku/brew && brew install heroku　　　# HerokuCLIをインストール
```

Heroku CLI のインストールが完了したらアップロードしたいディレクトリに移動して、
ターミナルからコマンドを入力しログイン。

```
cd [アプリ名]　　   #アプリ名にはRailsで作成したアプリ名を入れます。
                 #cd を使うことで選択したディレクトリに移動出来ます。

heroku login     #herokuにログイン
```

下記コマンドが表示されるので登録した email,password を入力します。
後登録したemailが表示されたらログイン完了です。

```
Enter your Heroku credentials:
Email:  　　　　　　　　　　　　　　# emailを記入
Password:                      # passwordを記入

Logged in as                   # 登録したメールアドレスが表示
```

##Gemfile の設定

Rails アプリ作成でのローカル環境ではデフォルトで SQLite 3 が設定されているが Heroku での本番環境ではpostgreSQL 使うため為 ターミナルでコマンドを入力し postgreSQL をインストール。

```
brew install postgresql     #postgreSQLをインストール
```

インストール完了後、本番環境で postgreSQL を適応させる為に
Gemfile に新しく[gem 'pg', group: :production]を追加、
[gem 'sqlite3', '~>1.3.6'] を [gem 'sqlite3', '~>1.3.6', group: :development ] に編集しインストール。

```rb
gem 'pg', group: :production　　　　　　　　　　　　　　#一行新しく追加
                                                   #加えることで本番環境にpostgreSQLを設定

gem 'sqlite3', '~>1.3.6', group: :development 　　　#group: :development を追加
                                                   #加えることでローカル環境にSQLite3を設定
```

ターミナルでコマンドを実行し Gemfile.lock に反映させる。

```
bundle install --without production
```

##Git を使って Heroku にデプロイ

```
git add .                             #追加するファイルを全て選択

$ git commit -m "[コミットメッセージ]"      #選択したファイルをコミット [コミットメッセージはわかりやすいもの]

$ git push heroku master              #リモートリポジトリにアップロード
```

本番環境のデータベースを作成して完了。

```
heroku run rails db:migrate
```
**のはずが、git push でエラー...。**

###エラー対策
本来はここでデプロイできるはずのようですが、僕は出来ません出した...。

エラーメッセージ

```
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 fathomless-falls-63173.
remote: 
To https://git.heroku.com/fathomless-falls-63173.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/fathomless-falls-63173.git'
```

Gem をインストール出来ませんでしたとのこと。　その為、Gemfileを確認。
本番環境の設定が悪いのかと思い書き換えてみる。
もう一度　bundle install --without production で反映する。

```rb
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'sqlite3', '~> 1.4'
end

group :production do
  gem 'pg'
end
```
やはりそれだけでは上手くいかず。Googleで調べてみると datebase.yml も書き換える必要があるとの事。
確認してみると、本番環境(production)のデフォルトが sqlite3 のままになっている為、PostgreSQLに変更して、もう一度　bundle install --without production で反映する。

```yaml
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```
またしても上手くいかず...。　エラーメッセージも変わらず bundle が引っかかっているのは間違いなさそうですが、原因が分からず。　もう一度他の案を検索。 するとHerokuが指定しているバージョン以外のbundlerではデプロイ出来ないとの記事を発見。
こちらになります。　https://310nae.com/heroku-bundler/

そんなエラー出てたかなと思いもう一度ターミナルを確認してみると上の方にバージョンのことが書いてありました。

```
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.2.16
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-3.0.1
remote: -----> Installing dependencies using bundler 2.2.16
```
bundle -v でバージョンを確認してみると、2.2.15 でした...。
これか！と思い読んでみると、バージョンは合わせてくれる模様。
知れべてみると、 Ruby2.6.0 以降は自動的にバージョンが決定される様です！
参照記事：https://techracho.bpsinc.jp/hachi8833/2020_04_09/90793

その後も一通り実行文を読んでみると、気になる点が。

```
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 ["x86_64-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.
```
こちらも違うようなことが書いてあるので、 and try again. と言われた通り実行してみる。

```
bundle lock --add-platform x86_64-linux
```
エラー文を一通り読み、問題なさそうでしたので再び`git push`する。



**やっとデプロイ出来ました...。**
正直gitのこともあまり分からない状態でアプリ作成からデプロイを初めて取り組んでしまったので、何が原因だったのかわからずかなり躓きました。
対処法も間違っているところもあるかも知れませんので参考にはならないかも知れませんが、ポイントでエラー文の対策として誰かの役に立てたら幸いです。
もしご指摘、アドバイスありましたらご教授お願いします。

##今回学んだ事
- Git の知識が足りない

- Heroku の知識が足りない

- remote！ 以外の文脈にもヒントがある

- エラー文検索の際のワード選びが重要

- 総合的に全て未熟

###今後について
- Git SQL の学習も必要だが Rails の知識も足りないと感じたため基礎固めをする。