まだ全然しょぼいLaravelアプリをHerokuにデプロイしてみた

#はじめに
まだ作り始めの段階でしかないLaravelのしょぼいアプリを早々に、GitHubのmasterブランチからHerokuにデプロイする。GitHubのこのデプロイ話もネットにゴロゴロしていますが、どれも微妙に違ったりして、迷ったので、僕はこのやり方でやりましたというのを参考に記録しておきたいと思います。

###なぜしょぼいのにデプロイするの？
確かにHeroku デプロイで検索してざっと眺めてみた感じ、良い感じにアプリが出来上がってきてからデプロイする人が多いようです。てか僕もそう思っていました。[エンジニアYouTuberのおさないさん](https://www.youtube.com/channel/UCHxqQ8bUg5F2GW79D_DvSjQ/featured)のアドバイスをもらうまでは...。

おさないさん曰く、開発の初期の段階で本番に近い環境で制作していないと、アプリが仕上がった段階でデプロイしてしまって、その環境では動かないことが判明したときに修正するのが大変だからだそうです。どうせ一般公開しても誰も見に来れないと。

###環境
Laravel 7.26.1, Mac, GitHub, Heroku, ClearDB MySQL

###やるべきことをまとめとくと
チマチマとやることがあるので、やること一覧を俯瞰して把握できるように整理しておきたいと思います。

* Herokuでアカウント登録をして、新規アプリを作る
* Heroku CLI（Herokuのアプリ）をPCにインストールする
* ClearDBをアドオンする
* ProcfileをLaravelプロジェクトディレクトリ直下に作成する
* APP_KEYを設定する
* HerokuとGitHubを連携する

では、詳しく見ていきましょう。
#やってみよう
###Herokuでアカウント登録する
これはそんな難しくないと思いますので割愛。迷ったことと言えば地域がUnited StatesかEuropeしか選べなかったことくらいでしょうか。United Statesにしておきました。
###Heroku CLIをPCにインストールする
Heroku CLIとはHeroku Command Line Interfaceの略で、コマンドライン（ターミナルとか）でHerokuを操作できるようになる、`heroku xxx`というコマンドを使えるようにするやつです。
プロジェクトのディレクトリに行って、下記コマンドを打ちます。

```terminal
$ brew tap heroku/brew && brew install heroku
```
結構時間がかかったと記憶しています。
ちなみにbrewってのは、Homebrewです。HomebrewってのはMacOS用のパッケージ管理システムで、ソフトウェアのインストールを簡単にしてくれるシステムみたいです。npmってのもこの仲間だそうです。
###Herokuにログイン
言わなくてもわかるかと思いますが、$がついているのが、人間が打つコマンド、付いてない下段のメッセージはコンピュータからの応答です。（地味に初心者の僕らってこういうとこで混乱したりしますよね）

```terminal
$ heroku login
heroku: Press any key to open up the browser to login or q to exit: 
```
「ブラウザでHeroku開けるならなんかキーボード押して。終了するならqな。」と仰っておられます。
↓こんな感じのメッセージが出てきたら、ログインできています。

```terminal
Logging in... done
Logged in as XXXXXX@gmail.com
```
###ProcfileをLaravelプロジェクトディレクトリ直下に作成する
Procfileとは何かについてはこの[Qiita記事](https://qiita.com/opengl-8080/items/9dc9243c4e68cd0674f8#procfile)が詳しいです。要はHeroku用の設定ファイルみたいです。

```terminal
$ touch Procfile
```
ProfileではなくProcfileですのでご注意。`touch`というのはターミナルの超基本的なコマンドで、`ファイルを作って`という命令文です。ディレクトリ（フォルダ）を作る場合は`mkdir`ですよね。（`mkfile`にして欲しかったな）
作成できたら中身を編集します。VS codeなどのテキストエディタで開いてもいいし、ターミナルなら`$ vi Procfile`で開き、`i`で書き込みモードになり（下にINSERTと表示される）、編集して、`esc`の後`:wq`でもOKです。何を書き込むかというと、こちら↓です。

```terminal:Procfile
release: php artisan migrate:fresh
web: vendor/bin/heroku-php-apache2 public/
```
これ、他のサイトを参考にしたんですが、apacheサーバーを使うという前提ですね。他のサーバー（nignxとか）を使用するなら書き方が変わってくるかと思います。（曖昧ですみません）

Procfileをリモートディレクトリ（GitHub）にプッシュします。

```terminal
$ git add .
$ git commit -m "コミットコメント"
$ git push heroku master
```
$ git push origin masterではないのでご注意。
で、私はここでエラーに直面しました↓。（うまく行っている人は読み飛ばしてください）

```terminal
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
```
herokuなんてリポジトリはないよ、と仰っているので、設定してあげます。こちらのコマンドで.git/configを開いて

```terminal
$ vi .git/config
```
下記追加します。urlにはHeroku git URLを。HerokuサイトのSettingタブで見つけられます。

```terminal:.git/config
[remote "heroku"]
        url = https://git.heroku.com/jazz-review.git
        fetch = +refs/heads/*:refs/remotes/heroku/*
```

最初`fatal: bad config line 30 in file .git/config`とエラーが出ました。単なるスペルミスだったので、同じように躓いた方は見直してみてください。

どこのブランチでやるのかってことが意外とどの解説にもないのですが（当然すぎるから？？）、HerokuとリンクさせるGitHubブランチでやりましょう（今回はmaster）。
###ClearDB MySQLをアドオンする
Herokuのページ上で、`Heroku > あなたのアプリ名 > Resources > Add-ons`で追加できます。また下記コマンドでも作成できます。（igniteとは無料プラン名前のことです）

```terminal
$ heroku addons:create cleardb:ignite
```

###DBの環境設定をする
下記コマンドでDBの情報を取得します。

```terminal
$ heroku config
=== プロジェクト名 Config Vars
CLEARDB_DATABASE_URL: mysql://ユーザーネーム:パスワード@ホスト名/データベース名?reconnect=true
```
そこで出てきたURLを元に、下記のように`heroku config:set XXX`でターミナルで各種設定をしていきます。ごちゃごちゃしてますが、$の行のコマンドを入力していくだけです。

```terminal
$ heroku config:set DATABASE_URL='mysql://ユーザーネーム:パスワード@ホスト名/データベース名?reconnect=true'
Setting DATABASE_URL and restarting ⬢ プロジェクト名... done, v6
DATABASE_URL: mysql://ユーザーネーム:パスワード@ホスト名/データベース名?reconnect=true

$ heroku config:set DB_DATABASE=heroku_何たらかんたら
Setting DB_DATABASE and restarting ⬢ プロジェクト名... done, v7
DB_DATABASE: heroku_何たらかんたら

$ heroku config:set DB_HOST=何たらかんたら.cleardb.com
Setting DB_HOST and restarting ⬢ プロジェクト名... done, v8
DB_HOST: 何たらかんたら.cleardb.com

$ heroku config:set DB_USERNAME=ユーザーネーム
Setting DB_USERNAME and restarting ⬢ プロジェクト名... done, v9
DB_USERNAME: ユーザーネーム

$ heroku config:set DB_PASSWORD=パスワード
Setting DB_PASSWORD and restarting ⬢ プロジェクト名... done, v10
DB_PASSWORD: パスワード
```
これが済むとMySQLでログインできるそうですが、これをやった頃私はMySQLがMAMPのMySQLとは別物であることを知らなくてインストールしておらずできませんでした...。私と同じ状態の方は、詳しくはこちらの[記事]()で。

###APP_KEYを設定する

```terminal
heroku config:set APP_KEY=$(php artisan key:generate --show)
```
巷に転がるHerokuデプロイ記事では、`$ php artisan key:generate --show`で出た値をメモしておいて（もしくは`Heroku > 該当のアプリ > Settings > Config Var`でも確認して）、`$ heroku config:set APP_KEY=`に続けてAPP_KEYを直接インプットするというやり方もありましたが、上記のように式を代入するみたいなやり方でもうまく行きました。楽でいいですね。

###HerokuとGitHubを連携する
Heroku > 該当アプリ > Deployタブにて、Deploy methodでGitHubを選択し、Connect to GitHubで該当レポジトリを選択し、Connectするだけです。

僕はここで下記のエラーメッセージが出ました。

>Item could not be created:
>Admin access to repository required


>We are unable to access to this connected repository on GitHub
>Either the repository is empty, the authorization key is not valid, or the account used to connect to GitHub doesn't have access to the repository. Try disconnecting the repository above and then reconnect.

GitHub側でのAdminアクセス権限が必要だぞーと言われているので、リポジトリの管理者に問い合わせましょう。

また、当初、連携はできたもののローカルと違う表示になってしまっていました。この問題は、一旦マニュアルでデプロイすることで最新のmasterブランチの情報をアップデートしてくれて、解決しました。

#最後に
もし抜けていることがあったら、後で補足します！ご指摘ありましたら、よろしくお願い申し上げます。
###参考
ClearDB MySQL
https://devcenter.heroku.com/articles/cleardb

HerokuにLaravel+MySQL環境をデプロイする
https://shkn.hatenablog.com/entry/2019/06/23/163502

【Heroku】LaravelとMySQLでデプロイする
https://qiita.com/yukibe/items/5c1910e259ff4e6498db

Laravel アプリをHerokuにデプロイする方法
https://kimulog.com/2020/01/03/laravel-heroku-deploy/

Laravelのアプリケーションをherokuへデプロイしてみた
https://qiita.com/KZ-taran/items/6fd4fc6617953fdbc7db