Rails + MySQL + Docker + Github Actions で詰まった所
Dockerを使ってRails環境を作成する。
以下がすごく参考になった。
Rubyは毎年クリスマスに大型アップデートがあるということで、2.7を使ってみた
以下はDockerfile
FROM ruby:2.7.0 ~~~
Railsはapiモードと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 rubyがruby 2.7.0
に対応しておらず使えなかったので 2.6.3
に変更しました。
また、Access denied for user 'root'@'localhost'
とGithub Actions上のMySQLに繋げないっぽい。
というか、ubuntsu-latestにMySQLはすでにインストールされてるっぽい
というわけで、以下のように書き換えました。
また、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