GitHub Actionsを使ったRSpec実行環境をつくるときにはまったエラーと対処法
2020-12-06
基本情報
rails: 6.0.3
ruby: 2.7.1
mysql: 5.7
開発環境では docker-compose.yml を使用しています。また、GitHub Actions では services は使用せず、ubuntu-latest にプリインストールされている MySQL5.7 を DB として使用しています。
作成した GitHub Actions の設定ファイル
name: Exec Rspec
on:
push:
branches: [develop]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.1
- name: Install dependencies
run: bundle install
- name: Setup Database
run: |
sudo systemctl start mysql
bundle exec rake db:create RAILS_ENV=development
env:
RAILS_ENV: develop
SECRET_KEY_BASE: ${{ secrets.SECRET_KEY_BASE }}
MYSQL_DEV_USER: ${{ secrets.MYSQL_DEV_USER }}
MYSQL_DEV_PASSWORD: ${{ secrets.MYSQL_DEV_PASSWORD }}
- name: Run Rspec
run: bundle exec rspec
env:
RAILS_ENV: develop
発生したエラーたち
develop の DB を立ち上げるときに secret_key のエラーが出る
Missing `secret_key_base` for 'development' environment, set this string with `rails credentials:edit`
原因
secret_key_base を環境変数で渡さないといけなかった
対処
1 GitHub の Secrets に変数を設定する
2 GitHubActions のファイルで環境変数に設定した変数を渡す
こんな感じで環境変数にセット
run: |
sudo systemctl start mysql
bundle exec rake db:create RAILS_ENV=development
env:
RAILS_ENV: develop
SECRET_KEY_BASE: ${{ secrets.SECRET_KEY_BASE }}
参考に、secret_key_base のメソッドはこんな感じになっていた
def secret_key_base
if Rails.env.development? || Rails.env.test?
secrets.secret_key_base ||= generate_development_secret
else
validate_secret_key_base(
ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
)
end
end
mysql に接続できない
下記エラーが出た
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
原因
mysql サーバーが起動していない
対処
mysql サーバーを起動
- name: Setup Database
run: |
sudo systemctl start mysql
bundle exec rake db:create RAILS_ENV=development
mysql のパスワードが違う
原因
Ubuntu-latest にインストールされている mysql を使うなら、設定されているパスワード等は下記で設定しないといけなかった
- MySQL 5.7.32
- MySQL Server (user:root password:root)
- MS SQL Server Client Tools
また、host は localhost を使うと通った
詳細はここに記載されている
対処
上記の内容で user、password、host を設定する。database.yml の一部設定を下記の様に環境変数で設定するようにしているので、GitHub の Secrets で変数を設定し、Action ファイルで環境変数にセットした。
# database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %>
username: <%= ENV.fetch('MYSQL_DEV_USER') { 'root' } %>
password: <%= ENV.fetch('MYSQL_DEV_PASSWORD') { 'password' } %>
host: <%= ENV.fetch('MYSQL_DEV_HOST') { 'localhost' } %>
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
name: Exec Rspec
on:
push:
branches: [develop]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.1
- name: Install dependencies
run: bundle install
- name: Setup Database
run: |
sudo systemctl start mysql
bundle exec rake db:create RAILS_ENV=development
env:
RAILS_ENV: develop
SECRET_KEY_BASE: ${{ secrets.SECRET_KEY_BASE }}
MYSQL_DEV_USER: ${{ secrets.MYSQL_DEV_USER }}
MYSQL_DEV_PASSWORD: ${{ secrets.MYSQL_DEV_PASSWORD }}
- name: Run Rspec
run: bundle exec rspec
env:
RAILS_ENV: develop
参考
ENV[]と ENV.fetch()の違い【Rails/Ruby】