LoginSignup
50
45

More than 5 years have passed since last update.

CircleCIでRails+MySQLプロジェクトの自動テストを行うための最低限の設定

Posted at

これはなに?

  • Rails + MySQLで作成したプロジェクトのRspec自動テストを、CircleCIで行いたい!
  • そのために最低限必要な、.circleci/config.ymlの設定方法を紹介します

環境

  • Ruby 2.5.1
  • Rails 5.2.1
  • CircleCI 2.0

.circleci/config.ymlの設定

デフォルトの設定ファイル

  • CircleCIの「Add Project」から、GitHubのプロジェクトを選択し、Languageの設定から「Ruby」を選ぶと、以下のSample .yml Fileが自動で払い出されます (2018年12月現在)
.circleci/config.yml
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
       - image: circleci/ruby:2.4.1-node-browsers

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/postgres:9.4

    working_directory: ~/repo

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "Gemfile.lock" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

      # Database setup
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load

      # run tests!
      - run:
          name: run tests
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"

            bundle exec rspec --format progress \
                            --format RspecJunitFormatter \
                            --out /tmp/test-results/rspec.xml \
                            --format progress \
                            $TEST_FILES

      # collect reports
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

変更した箇所

MySQLのDockerイメージを追加する

サンプルではpostgresが指定されていますが、MySQLに変更します

jobs:
  build:
    docker:
      - image: circleci/mysql:5.7

RailsとDBとの接続を行う

接続を行うために必要な環境変数を追加します

jobs:
  build:
    docker:
      - image: circleci/ruby:2.5.1-node-browsers
        environment:
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: 'root'
          DB_PASSWORD: ''

設定した環境変数をRailsに反映するために、config/database.ymlは以下のように設定しておきます

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= ENV.fetch("DB_HOST") { 'localhost' } %>
  username: <%= ENV.fetch("DB_USERNAME") %>
  password: <%= ENV.fetch("DB_PASSWORD") %>
  socket: /tmp/mysql.sock

test:
  <<: *default
  database: your_app_name_test

MySQL Dockerイメージの起動を待つ設定を追加する

何度か自動テストを回していると、MySQLが起動する前にテストが走ってしまい、テストが落ちるケースがあったため、以下の設定を追加します

steps:
  - run:
      name: Wait for DB
      command: dockerize -wait tcp://127.0.0.1:3306 -timeout 120s

Rubocopの設定を追加する

自動テストと合わせて、Rubocopで静的解析を行いたかったので、以下の設定を追加します

steps:
  # run rubocop
  - run:
      name: run rubocop
      command: bundle exec rubocop

完成した設定ファイル

working_directoryをアプリケーションの名前に変更しておきます。最終的に以下のような設定ファイルが完成しました

.circleci/config.yml
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/ruby:2.5.1-node-browsers
        environment:
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: 'root'
          DB_PASSWORD: ''

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      - image: circleci/mysql:5.7

    working_directory: ~/your_app_name

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "Gemfile.lock" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

      - run:
          name: Wait for DB
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 120s

      # Database setup
      - run: bundle exec rake db:create
      - run: bundle exec rake db:schema:load

      # run tests!
      - run:
          name: run tests
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"

            bundle exec rspec --format progress \
                            --format RspecJunitFormatter \
                            --out /tmp/test-results/rspec.xml \
                            --format progress \
                            $TEST_FILES

      # collect reports
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

      # run rubocop
      - run:
          name: run rubocop
          command: bundle exec rubocop

50
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
45