Rails + MySQL + Docker + Github Actions で詰まった所

Dockerを使ってRails環境を作成する。

以下がすごく参考になった。

qiita.com

Rubyは毎年クリスマスに大型アップデートがあるということで、2.7を使ってみた

以下はDockerfile

FROM ruby:2.7.0
~~~

RailsapiモードとMySQLを使用したかったので、以下のように rails new コマンドを差し替えた。

docker-compose run web rails new . --force --database=mysql --api

Rails + MySQL + Dockerまではスムーズに開発環境を作成することができた。

Github Actionsの設定で詰まった...。

github.com を参考にして.github/workflows/rails-ci.yml を追加し、以下のようにworkflowを作成した。

name: rails

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    services:
      db:
        image: mysql:5.7
        env:
          MYSQL_ROOT_PASSWORD: password
        ports:
        - 3306
        options: --health-cmd "mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 10

    steps:
      - uses: actions/checkout@v1
      - name: Set up Ruby 2.7
        uses: actions/setup-ruby@v1
        with:
          ruby-version: 2.7.x
      - name: apt-get
        run: |
          sudo apt-get update
          sudo apt-get install libmysqlclient-dev
      - uses: actions/cache@v1
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gems-
      - name: bundle install
        run: |
          gem install bundler
          bundle install --jobs 4 --retry 3
      - name: migration
        run: |
          bundle exec rails db:create
          bundle exec rails db:migrate
        env:
          RAILS_ENV: test
          MYSQL_ROOT_PASSWORD: password
      - name: run rubocop
        run: |
          bundle exec rubocop
      - name: run rspec
        run: |
          bundle exec rspec
        env:
          RAILS_ENV: test
          MYSQL_ROOT_PASSWORD: password

しかし、setup rubyruby 2.7.0 に対応しておらず使えなかったので 2.6.3に変更しました。 また、Access denied for user 'root'@'localhost'Github Actions上のMySQLに繋げないっぽい。 というか、ubuntsu-latestにMySQLはすでにインストールされてるっぽい

help.github.com

というわけで、以下のように書き換えました。 また、database.ymlを開発用とci用で分けるために、database.yml.ciを作成し、cpコマンドでGithub Actions上で書き換えるようにしました。

name: rails

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - name: Set up Ruby 2.6
        uses: actions/setup-ruby@v1
        with:
          ruby-version: 2.6.3
      - name: apt-get
        run: |
          sudo apt-get update
          sudo apt-get install libmysqlclient-dev
      - uses: actions/cache@v1
        with:
          path: vendor/bundle
          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gems-
      - name: bundle install
        run: |
          gem install bundler
          bundle install --jobs 4 --retry 3
      - name: migration
        run: |
          cp config/database.yml.ci config/database.yml
          bundle exec rails db:create
          bundle exec rails db:migrate
        env:
          RAILS_ENV: test
      - name: run rubocop
        run: |
          bundle exec rubocop
      - name: run rspec
        run: |
          bundle exec rspec
        env:
          RAILS_ENV: test