follmy

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

参考

GitHub Actions のワークフロー構文

ENV[]と ENV.fetch()の違い【Rails/Ruby】

Rails on GitHub Actions チュートリアル

Github Actions で RSpec を実行する

Rails5.2 から追加された credentials.yml.enc のキホン


プロフィール

koyamaaa2です。

プライバシーポリシー