【Error・学習】RailsプロジェクトにGitHub Actions（Rspec）

## はじめに
今回は`Rails`プロジェクトに`GitHub Actions`(Rspec)を追加したのでどういう状況でどうやって実装したのか、備忘録のためにも記事にしておきたいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3


## はじめの状況
前段階として`GitHub Actions`はある程度は設定していました。
ちゃんと公開する前に講師の方に一度見てもらったところ「Rspecは？」と。

実は、`Rspec`は一度入れていました。ですが、アクションを実行するとエラーの✖印が。何度か修正してみるものの解決せず。焦りもあったせいで「一度諦めよう」としてしまいました。:sweat:

なので`Rspec`のぞいた初期状態の私のファイルの中身は下記のような状態です
```.github/workflows/rubyonrails.yml
name: Rails CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:latest
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
          POSTGRES_DB: myapp_test
      chrome:
        image: seleniarm/standalone-chromium:latest
        ports:
          - 4444:4444

    env:
      RAILS_ENV: test
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp_test

    steps:
      - name: Git checkout
        uses: actions/checkout@v2

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

      - name: Setup bundler
        run: gem install bundler

      - name: Cache gems
        uses: actions/cache@v2
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gem-

      - name: Install gems
        run: bundle install --path vendor/bundle --jobs 4
```

👇下記記事を参考に実装

https://qiita.com/s3i7h/items/b50ceb0008edc3c0312e


## 本題のRspec実装までの道のり
#### 1：Rspecに関するコードを追記して実行からのエラー
  ```
  - name: Run RSpec tests
    run: bundle exec rspec
  ```
まずはRspecに関する記述を加えるところからスタート。
そしてGithubでAction実行。
エラーが出ました
```
Run bundle exec rspec
  bundle exec rspec
  shell: /usr/bin/bash -e {0}
  env:
    RAILS_ENV: test
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: password
    POSTGRES_DB: myapp_test

An error occurred while loading ./spec/models/post_spec.rb.
Failure/Error: require_relative '../config/environment'

NoMethodError:
  undefined method []' for nil:NilClass
# ./config/initializers/sorcery.rb:8:in block in <main>'
```
> NoMethodError: `./config/initializers/sorcery.rb `ファイルで `nil `オブジェクトに対して [] メソッドを呼び出そうとしています。このエラーは` Sorcery `の設定が正しく読み込めていない可能性が高いです。

エラーログをよく見ると**8行目**に何か問題があるようなので該当ファイルの8行目のコードを確認します。


👇８行目のコードは以下のようなコードでした
```config/initializers/sorcery.rb
  config.google.callback_url = Settings.sorcery[:google_callback_url]
```
つまり、`google_callback_url`の値？がちゃんと読込めていないよ。という事。
色々調べて私は次のような解決を試してみました。


#### 2：GitHubリポジトリのシークレット設定
※GitHub の Secrets に値を登録することで、CI/CD（継続的インテグレーション/継続的デリバリー）環境で安全に使うことができるようです。

**【1. GitHub リポジトリの Secrets 設定ページを開く】**
1. GitHub のリポジトリページにアクセス
2. 上部メニューの「**Settings（設定）**」をクリック
3. 左側のメニューから「**Secrets and variables**」→「**Actions**」を選択
4. *"New repository secret"（新しいリポジトリシークレット）**ボタンをクリック

**【2. Secrets を登録する】**
1. **Name（名前）** に `GOOGLE_CALLBACK_URL` と入力
2. **Value（値）** に `config/settings/production.yml`や`development.yml`ファイルで入力した該当URLを入力（おそらくlocalhostの方）
3. 「**Add secret**」をクリックして保存
[![Image from Gyazo](https://i.gyazo.com/9a7ad0f1609a50a38b1cec8116b539d2.png)](https://gyazo.com/9a7ad0f1609a50a38b1cec8116b539d2)

**【3.GitHub Actionsのワークフローでの設定】**
`.github/workflows/your_workflow.yml` の`env`セクションで、次のように設定（私は`GOOGLE_CLIENT_ID`と`GOOGLE_CLIENT_SECRET`にも同様に設定しました）
```
      - name: Run RSpec tests
        run: bundle exec rspec
        env:
          GOOGLE_CLIENT_ID: ${{secrets.GOOGLE_CLIENT_ID}} 
          GOOGLE_CLIENT_SECRET: ${{secrets.GOOGLE_CLIENT_SECRET}}
          GOOGLE_CALLBACK_URL: ${{ secrets.GOOGLE_CALLBACK_URL }}
```


#### 3：改めてActionsの実行からのエラー
2までの設定を終えた後Actionsを実行したら少し違った内容のエラーになりました
内容的としましては、「`config/settings/test.yml `というテスト環境用の設定ファイル作成されていないよ」というようなもの。
なので`config/settings/test.yml`ファイルを作成し`config/settings/development.yml `の内容をコピーして完了。


#### 4：3の後エラー内容に変化
テスト用ファイル作成後、エラー内容が変化しました
👇エラーログになります。
```
Run bundle exec rspec

An error occurred while loading ./spec/models/post_spec.rb.
Failure/Error: ActiveRecord::Migration.maintain_test_schema!

ActiveRecord::DatabaseConnectionError:
  There is an issue connecting with your hostname: db.

  Please check your database configuration and ensure there is a valid connection to your database.

# ./spec/rails_helper.rb:31:in `<top (required)>'
# ./spec/models/post_spec.rb:1:in `<top (required)>'
# ------------------
# --- Caused by: ---
# PG::ConnectionBad:
#   could not translate host name "db" to address: Temporary failure in name resolution
#   ./spec/rails_helper.rb:31:in `<top (required)>'
```
> 1. **`ActiveRecord::DatabaseConnectionError`**: このエラーは、データベースに接続できないことを示しています。
> 2. **`could not translate host name "db" to address`**: ここでは、ホスト名「db」が解決できない（つまり、そのホストに接続できない）というエラーが発生しています。通常、これはデータベースのホスト名が正しくないか、コンテナ間のネットワーク接続に問題があることを示しています。


#### 5：4エラーからテスト用dbの確認＆修正
`config/database.yml `でテスト環境用のデータベース設定が正しいか確認します。特にホスト名に関して。
👇もともと記載してあったコード（確かにhost不在:fearful:）
```config/database.yml
test:
  <<: *default
  database: myapp_test
```
👇修正
```config/database.yml
test:
  <<: *default
  database: myapp_test
  host: localhost
```

ここまできて無事にRspec通りました:blush:


#### ※失敗したこと共有
```
test:
  <<: *default
  database: myapp_test
  host: db
```
上記のようにホスト名を`db`にしたら失敗しました。
原因としては以下の2点があげられるようです
> **ホスト名の問題**: `db`というホスト名は、データベースが動いているサーバーの名前を指している場合があるが、ローカル環境では通常`localhost`を使うことが多い。もし`db`という名前のサーバーが存在しない場合、接続できずにエラーが発生してしまう。

> **環境の違い**: `db`というホストは、Dockerなどのコンテナ環境で使われることがある。もし自分の環境がローカルで、データベースが`localhost`にある場合、`db`では接続できない。これが原因でRspecがエラーを出してしまう。


## さいごにまとめ
Github Actionsの設定は人によって異なりますが、今回の記事が何か参考になれば幸いです。
エラーから学ぶことは本当に多いと感じています。