【GithubAction】Rails + MySQL で CI を構築する

## 概要
`Github Actions`を利用してCIを自動化するための手順をまとめました。
リポジトリのコードをチェックアウトし、指定されたRubyバージョンをセットアップします。その後、依存関係のインストール、データベースのセットアップ、RSpecによる単体テストを実行します。

## 環境
Ruby 3.1
Rails7
MySQL 8.0

## config/database.yml.ci 作成
GitHub Actions で Rspec が実行される際に参照されるデータベースの定義ファイルです。
後述のワークフロー内で、`config/database.yml.ci → config/database.yml`に上書きコピーします

`password`：テストで一時的に起動されるDBコンテナなので、セキュリティは気にしなくて大丈夫です。
`host`： <font color='darkorange'>127.0.0.1</font>　localhost指定だと、ワークフローの処理でDB接続エラーになるため 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/069add64-2601-6658-f240-4f97e4216b63.png)

## ワークフローファイルの作成
テンプレートの選択はなんでも大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/d4efa85d-1894-3818-ec5b-76e46a7b3835.png)


先ほど作成したワークフローを以下のように変更します。
```yaml:.yml
name: Build and CI

on:
  push:
    branches: [test]  

jobs:
  setup_and_test_execution:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_ROOT_PASSWORD: 1234
          MYSQL_ROOT_HOST: '%'
        ports:
          - 3306:3306
        options: --health-cmd "mysqladmin ping -h 127.0.0.1" --health-interval 20s --health-timeout 10s --health-retries 10

    # GitHub Actionsでサポートしているruby versionは2.6以降
    steps:
    - name: Checkout from Repository
      uses: actions/checkout@v2
    
    - name: Setup Ruby version
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 3.1.x
          
    - name: bundle install
      run: |
        bundle install --jobs 4 --retry 3
    
    - name: Setup Database
      env:
        RAILS_ENV: test
      run: |
        cp config/database.yml.ci config/database.yml
        #./bin/railsは権限エラーになる
        #./bin/rails db:create
        #./bin/rails db:migrate
        bundle exec rake db:create
        bundle exec rake db:migrate
          
    # 単体テスト
    - name: Run RSpec
      run: bundle exec rspec
      env:
        RAILS_ENV: test
```

### runs-on:  ubuntu-latest
GitHub Actionsのホストされている仮想環境で、`ubuntu最新バージョン`を利用する。
Dockerfileで指定している ruby:3.1 が `debian:11ベース`なので、debian:11を指定したいですが、それだと実行時にエラーになるので、、、

### services:
GitHub Actionsにおいて、ワークフローの実行環境を定義する方法として、主に2つのアプローチがあります。

`ランナーマシン` (Runner Machine): ワークフローが実行されるホストマシンを指定します。例えば、runs-on: ubuntu-latest のように指定することで、Ubuntu環境での実行が行われます。この場合、ワークフロー内の各ステップは指定したランナーマシン上で実行されます。必要に応じてランナーマシン上で必要なソフトウェアやツールをインストールすることができます。

`サービスコンテナ` (Service Container): ワークフロー内で必要なサービスやアプリケーションをコンテナとして実行します。例えば、データベースサービスやキャッシュサービスなど、アプリケーションが依存する外部サービスなど。services セクションを使用して、イメージを指定し、必要な環境変数やポートマッピングを設定することができます。サービスコンテナは、ワークフローのステップからアクセス可能であり、アプリケーションとの相互作用が可能です。<font color='darkorange'>※MySQLの部分</font>

__MYSQL_ROOT_PASSWORD__
database.yml.ci で設定したパスワード

__MYSQL_ROOT_HOST__
mysqlに外部から接続できるように

__options__
コンテナのヘルスチェックを定義しておく。この指定がないと、コンテナの準備ができる前にワークフローが進行して、<font color='darkorange'>接続エラーになる時がある。</font>

__ports__
ポートマッピングを指定する。 docker-compose.yml の書き方と同じ。

　　

### 各ステップの説明

*__<font color="#444444">Checkout from Repository</font>__*
`actions/checkout@v2`アクションを使用して、リポジトリの最新のコードをチェックアウト。

*__<font color="#444444">Setup Ruby version</font>__*
`actions/setup-ruby@v1`アクションを使用して、指定されたRubyバージョン（3.1.x）をセットアップ。

*__<font color="#444444">bundle install</font>__*
`bundle install`コマンドを実行して、Gemfileに指定された依存関係をインストール。
--jobs 4 --retry 3オプションは、並列で4つのジョブを使用して依存関係のインストールを試み、最大3回の再試行を行う。

*__<font color="#444444">Setup Database</font>__*
環境変数 RAILS_ENV を test に設定。
`config/database.yml.ci → config/database.yml` にコピー。
テスト用のデータベースの作成とマイグレーション。

*__<font color="#444444">Run RSpec</font>__*
`bundle exec rspec` コマンドを実行して、RSpec による単体テストを実行。
RAILS_ENV を test に設定して、テスト環境で実行されるようにする。