【Rails】Herokuでアプリをデプロイする方法

# 目的
Railsで作成したアプリをHerokuを使用しデプロイする。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提
- Herokuでのユーザー登録は完了している。

- `test-app`という名のアプリがローカル環境にて実装されている。

# 手順

1. [Herokuの導入](#herokuの導入)
1. [Herokuへのログイン](#herokuへのログイン)
1. [Heroku上へのアプリ作成](#heroku上へのアプリ作成)
1. [MySQLの設定](#mysqlの設定)
1. [Heroku上での環境変数の設定](#heroku上での環境変数の設定)
1. [Stackの指定](#stackの指定)
1. [Herokuへアプリを追加](#herokuへアプリを追加)
1. [マイグレーションの実行](#マイグレーションの実行)
1. [アプリの確認](#アプリの確認)
1. [エラーが出る場合](#エラーが出る場合)

# Herokuの導入

まずターミナルからHerokuへアクセスするために、HerokuのCLIをインストールします!

```:ターミナル
% brew tap heroku/brew && brew install heroku
```
インストール終了後、下記コマンドにてバージョンを確認しましょう。

```:ターミナル
% heroku --version
```

バージョンが出力されればインストール完了です！

# Herokuへのログイン

次にターミナルからHerokuへログインしてみます!
下記コマンド入力後、メールアドレス・パスワードを入力しログインしてください。

```:ターミナル
% heroku login --interactive
```

登録したメールアドレスにてログインできれば成功です！

# Heroku上へのアプリ作成

デプロイの準備が整ったので、これからデプロイしていきます！
まずはHeroku上にアプリを作成します。
ここでHeroku上でのアプリ名を決める必要があります。(既に登録されているアプリ名は使えないので注意！)
アプリ名が決まったら、下記コマンドを実行しましょう!

```:ターミナル
% heroku create test-app
```

その後、下記コマンドにて設定が正しいか確認します。

```:ターミナル
% git config --list | grep heroku
```

`fatal: not in a git directory`が出ていなければ次へ進みます!

# MySQLの設定

Herokuはデフォルトで`PostgreSQL`というデータベースになっていますが、今回は`MySQL`を使用するため設定を変更します。
まず、HerokuでMySQLを使用するために`ClearDBアドオン`を追加します！

```:ターミナル
% heroku addons:add cleardb
```

これでデータベースをMySQLに設定できましたが、
今回はRailsのGemで`mysql2`を使用しているため、それに対応するよう設定を変更する必要があります。
下記コマンドを実行してください！

```:ターミナル
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```

ClearDBデータベースのURLを変数`heroku_cleardb`に格納できました。
続いて、下記のコマンドを入力してください。

```:ターミナル
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```

これでデータベースのURLを再設定できました!
DATABASE_URLの冒頭が`mysql2://`に変更されていると思います！

# Heroku上での環境変数の設定

Heroku上へデプロイする際、Gitで管理されているコードがデプロイされますが、`master.key`はデフォルトでGitに管理されない仕組みとなっており、このままでは`credentials.yml.enc`がHeroku上で扱えません。
そこでHeroku上に環境変数として`master.key`の値を設置します。

環境変数の追加は`heroku config:set 環境変数名="値"`で設定できます。
下記コマンドを実行してください。

```:ターミナル
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

続いて下記コマンドにて、環境変数一覧を表示し、設定が正しくできているか確認しましょう。

```:ターミナル
% heroku config
```

`RAILS_MASTER_KEY`という変数名で値が設定されていれば成功です。

# Stackの指定

Herokuではアプリの動作環境としてStackが用意されていますが、今回使用するRubyのバージョンでは`Heroku-18`までしかサポートされていないため、下記コマンドにてStackを指定します。

```:ターミナル
% heroku stack:set heroku-18 -a test-app
```

# Herokuへアプリを追加

ついにアプリの追加です！
Gitで管理しているリポジトリをHerokuへ反映することで、Heroku上でアプリの操作が可能になります。
下記コマンドを実行してください。

```:ターミナル
% git push heroku master
```

この際に`「remote: ! Could not detect rake tasks」`、`「remote: ! ensure you can run $ bundle exec rake -P against your app」`とエラーが表示される場合は、[こちら](#エラーが出る場合)をご確認ください。

# マイグレーションの実行

これまでの実装でHerokuにアプリの情報を反映することができました。
しかし、データベースにはマイグレーションの情報が反映されていないため、マイグレーションを実行しましょう！

```:ターミナル
% heroku run rails db:migrate
```

# アプリの確認

ここまでくれば、アプリは正常に動作しているはずです。
Herokuにデプロイされたアプリを確認してみましょう！  
まず下記コマンドを実行し、アプリの詳細を確認します。

```:ターミナル
% heroku apps:info
```

そして`Web URL:`の部分に記載されているURLにアクセスすればアプリを確認できるはずです！

# エラーが出る場合

Herokuヘアプリを追加する際に`「remote: ! Could not detect rake tasks」`、`「remote: ! ensure you can run $ bundle exec rake -P against your app」`とエラーが表示される場合は下記手順でbundlerのバージョンを変更してみましょう！

まず現在入っているbundlerを削除します。

```:ターミナル
% gem uninstall bundler
```

この際に何度か確認を求められますが、「y」を入力してエンターを押しましょう！

次に`bundlerのバージョン2.1.4`を指定してインストールします!

```
%  gem install bundler -v '2.1.4'
```

その後`Gemfile.lock`を削除します。
テキストエディタで作成済みのアプリを開き、「Gemfile.lock」を削除しましょう！

削除できたら`Gemfile.lock`を作り直します！
以下のコマンドを実行してください。

```
%  bundle install
```

変更をGitHubへ反映させるため、`commit`と`push`を忘れずに行いましょう。

続いて以下のコマンドで、Herokuにアプリケーションの情報を追加します!

```
% git push heroku master
```

これでデプロイできたかなと思います。

# 最後に

これでHerokuへのデプロイは完了です！
デプロイ後にアプリを変更した場合は、`git push heroku master`と`heroku run rails db:migrate`をしてHerokuへ反映させましょう！
では。