tl;dr
RailsプロジェクトでCIをCircleCI2.0を利用。
DBをMySQLで構築したときに疎通させるので一苦労したのでメモしておく。
環境
Ruby 2.5.1
Rails 5.2.0
MySQL 5.7
はじめに
CircleCIでプロジェクトを登録。
OSはLinuxを選択。(macOSはiOS向けのアプリとか作る用らしい(有料))
自動的にひな形が生成されるので、コピーしてアプリケーションrootに.circleci/config.yml
として保存する。
MySQLとの疎通設定の前に
yarn installを追加
今回のプロジェクトでは、webpacker
を利用しているので、jsパッケージ管理にyarn
を使う。
yarn
はバージョンが古くなっていると警告が出てテスト起動に失敗する(デフォルト)ので、config.yml
に追記する。(設定でバージョン監視を無効にすることも出来るが、更新したほうがいいでしょう多分。)
version:2
jobs:
build:
steps:
...
# bundle exec rake db:createより前に書く!
- run: yarn install
専用database.ymlの用意
テスト専用(CircleCI上で用意されるMySQL用コンテナ)で構築されるDBの設定を記述して、テスト実施前に差し替えて上げる細工が必要。
config/database.yml.ci
test:
adapter: mysql2
encoding: utf8
pool: 5
username: 'root'
port: 3306
host: '127.0.0.1'
database: ci_test
で、これを差し替える細工を、.circleci/config.yml
へ追加
version:2
jobs:
build:
steps:
...
# bundle exec rake db:createより前に書く!
- run: yarn install
- run: mv config/database.yml.ci config/database.yml # ココらへんに追加
- run: bundle exec rake db:create
- run: bundle exec rake db:schema:load
MySQLの疎通
コンテナの準備
CircleCIはdockerを使ってコンテナ単位で必要なものを起動してテストが走るので、今回はRubyが動作するコンテナと、MySQLが動作するコンテナが必要になる。
予め用意されているコンテナイメージのバージョンは、ここで確認出来る。
で、以下の感じ。
version: 2
jobs:
build:
docker:
- image: circleci/ruby:2.5.1-node-browsers
- image: circleci/mysql:5.7.22
これだけだと、いろいろとエラーが出る。
特に環境変数類が入っていないので、さらに環境変数を追加する。
- image: circleci/ruby:2.5.1-node-browsers
environment:
- RAILS_ENV: 'test'
- image: circleci/mysql:5.7.22
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
- MYSQL_ROOT_HOST: '%'
CircleCI上で動作するテストでしか使われないので、ユーザーとか細かいことは気にしてないです。
参考程度に。