GithubのActionでRspecとRubocopをpushすると自動で実行させるようにする

今回初めての試みでgit hubのActionによる自動テストを実行しました。自分的に解った部分を記事に書き込んでみました！

**git hub のActionって何？**

GitHub上でCI/CD（継続的インテグレーション/継続的デリバリー）を実現するための機能のことです。これを使うと、リポジトリにコードをプッシュしたり、プルリクエストを作成したりした際に、自動で特定の処理を実行できるように設定することができます。つまり、pushやプルリクするたびに、自動でテストや、デプロイを実行できるようにすることができる機能。

**＜git hub Actionの設定方法＞**

今回は、pushさせるたびにRspecとRobocopを実行させます。

RspecとRobocop関連のgemは導入済みという前提でいきます。

Git hub actionの設定は、**.github/workflows/rails.ci.yml**に

書き込むことができます！

以下は例文です。（プロジェクトごとに書く内容は変わってきますので注意！）

```yaml
name: CI

on:
  push:

jobs:
  test:
    runs-on: ubuntu-latest

    services:
      db:
        image: postgres
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
          POSTGRES_DB: myapp_test

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 3.2.3

    - name: Install dependencies
      run: |
        gem install bundler
        bundle install --jobs 4 --retry 3

    - name: Set up the database
      run: |
        cp config/database.yml.ci config/database.yml
        RAILS_ENV=test bin/rails db:create db:schema:load

    - name: Run RuboCop
      run: |
        bundle exec rubocop

    - name: Run RSpec
      run: |
        bundle exec rspec
```

このファイルにはgit actionをどのタイミングで実行するのか？、何を実行するのかを設定させることができます。

＜解説＞

```yaml
name: CI
```

- ここでは、このワークフローの名前をCIと指定しています。

```yaml
on:
  push:
```

- この部分は、`push`イベントが発生したとき（つまり、コードがリポジトリにプッシュされたとき）にこのワークフロー（git hub action)が実行されることを示しています。

```yaml
jobs:
  test:
    runs-on: ubuntu-latest

```

- `jobs`部分で実行するジョブを定義している。ここでは`test`というジョブを定義し、`ubuntu-latest`という最新のUbuntu環境で実行することを指定しているダ。

**＜`ubuntu-latest`のUbuntu環境って何？＞**

ubuntu-latest環境とは、Git hub Actionsで提供されている最新のUbuntuというLinuxのオペレーティングシステムのことです。この環境には、必要なソフトウェアとかツールが入っていて、開発者は手間をかけずにテスト実行できる。

つまり簡単にいうと、

buntu-latestの環境でCIを実行させるように定義することで、最新の機能やセキュリティ対策が施された環境がビルドされた状態を自動で作って、C Iが実行できるようになる！

```yaml
services:
  db:
    image: postgres
    ports:
      - 5432:5432
    env:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp_test
```

- `services`セクションでは、必要なサービス（ここではPostgreSQLデータベース）を定義している。`image`で使用するDockerイメージを指定し、`ports`でポートのマッピングを行っている。`env`で環境変数を設定しており、データベースのユーザー名、パスワード、データベース名をしています。

```yaml
steps:
- name: Checkout code
  uses: actions/checkout@v3

```

- `steps`セクションでは、実行する各ステップを定義している。最初のステップでは、`actions/checkout@v3`を使ってリポジトリのコードをチェックアウトしています。

```yaml
- name: Set up Ruby
  uses: ruby/setup-ruby@v1
  with:
    ruby-version: 3.2.3

```

- このステップでは、Rubyのバージョン3.2.3をセットアップしています。このステップで必要なRuby環境が整えられます。

```yaml
- name: Install dependencies
  run: |
    gem install bundler
    bundle install --jobs 4 --retry 3

```

- ここでは、依存関係のインストールを行っている。`gem install bundler`でBundlerをインストールし、`bundle install`でGemfileに定義された依存関係をインストールしている。`-jobs 4`は並行して4つのジョブを実行し、`-retry 3`は失敗した場合に3回再試行するオプションです（つまり4つのgemを同時にインストールしています）

```yaml
- name: Set up the database
  run: |
    cp config/database.yml.ci config/database.yml
    RAILS_ENV=test bin/rails db:create db:schema:load

```

- このステップでは、データベースの設定を行っている。まず、CI用のデータベース設定ファイルをコピーし、次にテスト環境用にデータベースを作成し、スキーマを読み込むコマンドを実行しています。

※CI用のデータベースは、**config/database.ci.yml**にて定義します。（後で述べます）

```yaml
- name: Precompile assets
      run: |
        RAILS_ENV=test bundle exec rake assets:precompile
```

- CI環境にアセット環境をプリコンパイルしています。

私の場合はこれをしないとRspecが失敗しました。

原因はおそらくCI環境にアセット環境がないと、CSSやJavaScriptなどのアセットが正しく読み込まれないためだと思います。

```yaml
- name: Run RuboCop
  run: |
    bundle exec rubocop

```

- `bundle exec rubocop`でrubocopを実行しています

```yaml
- name: Run RSpec
  run: |
    bundle exec rspec

```

- RSpecを使ってテストを実行している。これにより、アプリケーションのテストが自動的行われます。

まとめると、この`ci.yml`ファイルは、リポジトリにプッシュなどのアクションが実行されると、自動でデータベースをセットアップし、コードのスタイルチェックやテストなどを実行するため設定場所です。

**＜config/database.ci.ymlでCI用のデータ作成＞**

config/database.ci.ymlを以下の内容で作成します。これにより、CIプロセス中にテスト用のデータベースが正しくセットアップされます。

```yaml
test:
  adapter: postgresql
  encoding: unicode
  database: myapp_test
  pool: 5
  username: postgres
  password: password
  host: 127.0.0.1
```

これでGit hub action(CI)でRspecとRubocopがpushされる
たびに自動で実行されます。