はじめに
今回はRails
プロジェクトにGitHub Actions
(Rspec)を追加したのでどういう状況でどうやって実装したのか、備忘録のためにも記事にしておきたいと思います。
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
はじめの状況
前段階としてGitHub Actions
はある程度は設定していました。
ちゃんと公開する前に講師の方に一度見てもらったところ「Rspecは?」と。
実は、Rspec
は一度入れていました。ですが、アクションを実行するとエラーの✖印が。何度か修正してみるものの解決せず。焦りもあったせいで「一度諦めよう」としてしまいました。
なのでRspec
のぞいた初期状態の私のファイルの中身は下記のような状態です
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.google.callback_url = Settings.sorcery[:google_callback_url]
つまり、google_callback_url
の値?がちゃんと読込めていないよ。という事。
色々調べて私は次のような解決を試してみました。
2:GitHubリポジトリのシークレット設定
※GitHub の Secrets に値を登録することで、CI/CD(継続的インテグレーション/継続的デリバリー)環境で安全に使うことができるようです。
【1. GitHub リポジトリの Secrets 設定ページを開く】
- GitHub のリポジトリページにアクセス
- 上部メニューの「Settings(設定)」をクリック
- 左側のメニューから「Secrets and variables」→「Actions」を選択
- *"New repository secret"(新しいリポジトリシークレット)**ボタンをクリック
【2. Secrets を登録する】
-
Name(名前) に
GOOGLE_CALLBACK_URL
と入力 -
Value(値) に
config/settings/production.yml
やdevelopment.yml
ファイルで入力した該当URLを入力(おそらくlocalhostの方) - 「Add secret」をクリックして保存
【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)>'
ActiveRecord::DatabaseConnectionError
: このエラーは、データベースに接続できないことを示しています。could not translate host name "db" to address
: ここでは、ホスト名「db」が解決できない(つまり、そのホストに接続できない)というエラーが発生しています。通常、これはデータベースのホスト名が正しくないか、コンテナ間のネットワーク接続に問題があることを示しています。
5:4エラーからテスト用dbの確認&修正
config/database.yml
でテスト環境用のデータベース設定が正しいか確認します。特にホスト名に関して。
👇もともと記載してあったコード(確かにhost不在)
test:
<<: *default
database: myapp_test
👇修正
test:
<<: *default
database: myapp_test
host: localhost
ここまできて無事にRspec通りました
※失敗したこと共有
test:
<<: *default
database: myapp_test
host: db
上記のようにホスト名をdb
にしたら失敗しました。
原因としては以下の2点があげられるようです
ホスト名の問題:
db
というホスト名は、データベースが動いているサーバーの名前を指している場合があるが、ローカル環境では通常localhost
を使うことが多い。もしdb
という名前のサーバーが存在しない場合、接続できずにエラーが発生してしまう。
環境の違い:
db
というホストは、Dockerなどのコンテナ環境で使われることがある。もし自分の環境がローカルで、データベースがlocalhost
にある場合、db
では接続できない。これが原因でRspecがエラーを出してしまう。
さいごにまとめ
Github Actionsの設定は人によって異なりますが、今回の記事が何か参考になれば幸いです。
エラーから学ぶことは本当に多いと感じています。