1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-10-30

はじめに

今回は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

👇下記記事を参考に実装

本題の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行目のコードを確認します。

👇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.ymldevelopment.ymlファイルで入力した該当URLを入力(おそらくlocalhostの方)
  3. Add secret」をクリックして保存
    Image from Gyazo

【3.GitHub Actionsのワークフローでの設定】
.github/workflows/your_workflow.ymlenvセクションで、次のように設定(私はGOOGLE_CLIENT_IDGOOGLE_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の設定は人によって異なりますが、今回の記事が何か参考になれば幸いです。
エラーから学ぶことは本当に多いと感じています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?