Herokuへのデプロイの流れ。

# 目的
herokuへのデプロイの流れを忘れないようにするための備忘録。

# Herokuへのデプロイの流れ
## 0. herokuのインストール
ターミナル上で以下コマンドを入力

    % brew tap heroku/brew && brew install heroku

以下のようにバージョンが無事に表示できるようになれば問題ない。

    % heroku --version
    => heroku/7.40.0 darwin-x64 node-v12.16.2

## 1. herokuへログイン
ターミナル上で以下コマンドを入力

    % heroku login --interactive
    => Enter your Heroku credentials.
    (メールアドレスを入力し、エンターキーを押す)
    => Email:sample@sample.com
    (パスワードを入力して、エンターキーを押す)
    => Password:********
下記表示でログインが確認できる状態になれば問題なし。

    Logged in as sample@sample.com

## 2. heroku上へアプリの作成を行う
ターミナル上で以下コマンドを実行
    
    % heroku create アプリ名
    % git config --list | grep heroku
    =>`fatal: not in a git directory`以外が表示されていれば問題ない

## 3. heroku上でMySQLを使えるよう
Herokuでは、使用するデータベースの設定が、<strong>デフォルトでPostgreSQL</strong>というデータベースになっているため、開発環境で使用したデータベースに合わせ、要設定変更。
今回は、開発環境でMySQLを使用したため、MySQLに変更する。

    #　ClearDBアドオンを追加し、MySQLを使えるようにする
    % heroku addons:add cleardb

これでデータベースをMySQLに設定できた。
しかし、Ruby on Railsを使う場合は、MySQLに対応するGemについて考慮し、その設定を変更する必要がある。

    # ClearDBデータベースのURLを変数heroku_cleardbに格納
    % heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`

    # データベースのURLを再設定
    # mysql2というGemを使用しているので、DATABASE_URLの冒頭がmysql2://に変更されている
    % heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}

## 4. herokuで非公開の値を管理する
アプリケーションを開発する際、サーバーのアクセスキーやAPIキーなど、外部に漏らしたくない情報を扱う場面がある。
デプロイをする際、それらの情報はセキュリティの観点から暗号化する必要がある。
暗号化された情報は、開発環境および本番環境であらかじめ用意した鍵を用いて復号（暗号化された情報を使えるように）する。

Railsのバージョン5.2以降では、<strong>credentials.yml.enc</strong>(暗号化用ファイル)を利用して、それらの情報を暗号化する。
credentials.yml.encの暗号文は、<strong>master.key</strong>を用いることで復号し、ファイル内の記述を確認できる。
master.keyは非常に重要な情報なので、<strong>デフォルトで.gitignoreに記述</strong>されており、Gitで管理されない仕組みになっている。

    # credentials.yml.encをmaster.keyによって復号し、中身を確認・編集するためのコマンド
    # credentials.yml.encとmaster.keyがない場合は、上記コマンドによりcredentials.yml.encとmaster.keyを新規作成した後に、中身を確認・編集することができる。
    % EDITOR="vi" bin/rails credentials:edit
    # 確認後は、「escキー」→「:」→「q」と入力し、「enterキー」を押して credentials.yml.encを閉じることができる

### 4.1 credentials.yml.encをリモートリポジトリに反映させる
credentials.yml.encを新規作成できた後は、一連の変更をコミット・プッシュして、リモートリポジトリに反映させる。
しかし、セキュリティの面から、<strong>master.keyはデフォルトでGitに管理されない仕組みとなっている</strong>。

つまり、master.keyはこのままだとHeroku上へデプロイできず、credentials.yml.encもHeroku上で扱えないということになります。

そこで、Heroku上に別途master.keyを設置し、Heroku上でもcredentials.yml.encを扱えるようにする必要がある。

### 4.2 環境変数(master.keyの値を入れる秘密の箱)を設定する
    # Heroku上に環境変数を設定ためのコマンド
    # config:set 環境変数名="値"で実行
    % heroku config:set RAILS_MASTER_KEY=`cat config/master.key`

    # 環境変数一覧を確認できる
    % heroku config

## 5. 動作環境を変更する
Stackという、Herokuにおけるアプリケーションの動作環境を変更する必要がある。
(Stackはデプロイされたアプリケーションを読み取り正常に稼働させるために用意されている。)
デフォルトのStackは「Heroku-20」ですが、今まで開発に使用してきたRubyのバージョンは、Heroku-20では使用できない。
そのため、Rubyのバージョン2.6.5が動作するStackを指定する必要がある。
    
    # Herokuで利用するStackのver指定
    % heroku stack:set heroku-18 -a アプリ名

## 6. herokuで使用するNodeのバージョンを指定する
環境構築の際、Nodeのversion14をインストールして、今までアプリ開発を行ってきた。
しかし、Herokuの初期設定ではNodeのversion16を使用する設定になっているため、このままでは正常なデプロイが行えない。
そのため、HerokuでもNodeのversion14を使用できるよう、使用するNodeのバージョンを指定する必要がある。

具体的には、Herokuの<strong>buildpack</strong>という機能の使用や、<strong>package.json内の記述を変更</strong>して、使用するNodeのバージョンを指定する。
※buldpackとは、デプロイされたコードをHeroku上で適切に扱うために用意された、スクリプトのパッケージです。これがあることにより、Herokuで様々な言語のアプリを扱うことができている。
今回は、nodejsとrubyのbuildpackをインストールする。

    # nodejsとbuldpackのインストール法
    % heroku buildpacks:add heroku/nodejs
    % heroku buildpacks:add heroku/ruby
    
    # 「heroku buildpacks」コマンドの実行結果
    === アプリ名 Buildpack URLs
    1. heroku/nodejs
    2. heroku/ruby
    と出れば問題なくインストールできている証拠。
    
    # heroku/rubyがheroku/nodejsより上にきている場合は、下記のコマンドを順に実行して、buildpackの順番を入れ替える。
    % heroku buildpacks:remove heroku/ruby
    % heroku buildpacks:add heroku/ruby
    % heroku buildpacks

続いて、使用するnodeのバージョンをpackage.jsonへ記述する。
まず、下記のコマンドを実行し、インストールされているnodeのバージョンを確認する。
    
    % node -v

    # 以下、実行結果の例（数字は異なる可能性がある）
    v14.15.3

次に、package.jsonのファイルを開き、以下のように追記する。

    {
     "name": "アプリ名",
     "private": true,
     "dependencies": {
       "@rails/actioncable": "^6.0.0-alpha",
       "@rails/activestorage": "^6.0.0-alpha",
       "@rails/ujs": "^6.0.0-alpha",
       "@rails/webpacker": "4.2.2",
       "turbolinks": "^5.2.0"
     },
     "version": "0.1.0",
     "devDependencies": {
       "webpack-dev-server": "^3.10.3"
     },  // ここにカンマを記述
     "engines" : {
       "node": "14.x.x"  // ここに先ほど確認したバージョンを記述
     }
    }

記述内容を変更したpackage.jsonをコミット・プッシュして、リモートリポジトリに反映。

## 7. herokuへアプリケーションを追加する。
Herokuにデプロイする際には、Gitの仕組みを使用する。Gitで管理しているリポジトリをHerokuへ反映することで、Heroku上で該当するアプリケーションの操作が可能になる。Gitで管理しているリポジトリをHerokuに反映するためには<strong>git push heroku master</strong>というコマンドを用います。

    % git push heroku master

## 8. heroku上でマイグレーションを実行
Herokuにアプリケーションの情報を反映することができた。
しかし、データベースにはマイグレーションの情報が反映されていない。
rails db:migrateを実行したいところですが、そのままコマンドを入力しても実行できない。
Heroku上で実行したいコマンドの頭には、<strong>heroku run</strong>をつける。

    % heroku run rails db:migrate

## 9. 公開を確認する
    #公開を確認するコマンド
    % heroku apps:info

## 10. デプロイ済みのアプリケーションに変更修正を加えた場合
1. 変更修正をcommitする
2. ブランチを作成していた場合は、masterブランチへマージする
3. Heroku上にpushする
（テーブルに変更を加えた場合は）Heroku上でマイグレーションを実行する