railsアプリにCircleCIを導入する

はじめに

railsアプリにCircleCIを導入してCI部分のRspecとRubocopを自動化してみました。

設定方法

まずはアプリのルートディレクトリに.circleciというディレクトリを作り、その配下にconfig.ymlというファイルを作ります。

そのファイルにcircleciの設定を記述していきます。

version: 2
jobs:
  build: # workflowsを使わない場合はbuildというジョブを定義する
    docker:
      - image: circleci/ruby:2.7.2-node-browsers-legacy # 使用するdockerのイメージを指定する
        environment:
          - BUNDLER_VERSION: 2.1.4 # bundlerのバージョン指定
          - RAILS_ENV: test # 実行するデータベース名を指定
         # database.yml.ciで使用する環境変数を設定
          - MYSQL_HOST: 127.0.0.1
          - MYSQL_USER: root
          - MYSQL_PASSWORD: ''
          - MYSQL_PORT: 3306
          - TZ: "Japan"
      # データベース側の環境
      - image: circleci/mysql:5.7
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
          - MYSQL_ROOT_HOST: '%'

    working_directory: ~/repo

    steps:
      # githubのリポジトリを取得
      - checkout

      # yarnインストール
      - run:
          name: yarn Install
          command: yarn install

      # キャッシュがあればリストアする
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-

      # bundlerのインストールとbundle install実行
      - run:
          name: Install dependencies
          command: |
            gem install bundler -v 2.1.4
                                              # 並列処理
            bundle install --path=vendor/bundle --jobs 4 --retry 3
      # キャッシュする
      - save_cache:
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle
      
      # データベースのセットアップ
      - run:
          name: Database Setup
          command: |
            mv ./config/database.yml.ci ./config/database.yml 
            bundle exec rake db:create
            bundle exec rake db:schema:load
      # rubocop実行
      - run:
          name: Rubocop
          command: bundle exec rubocop

      # rspec実行
      - run:
          name: Run rspec
          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
      # 結果を保存
      - store_test_results:
          path: /tmp/test-results
      # テスト結果をCircleCIアプリのARTIFACTSに表示する
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results
test: &default
  adapter: mysql2
  encoding: utf8
  charset: utf8
  pool: 5
  username: <%= ENV.fetch("MYSQL_USER") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD") %>
  host: <%= ENV.fetch("MYSQL_HOST") %>
  port: <%= ENV.fetch("MYSQL_PORT") %>
  database: ci_test

ローカルで動作確認

$ brew install circleci

下記コマンドで.circleci.config.ymlファイルの文法をチェック

$ circleci config validate .circleci/config.yml

下記コマンドで指定したジョブを実行

$ circleci local execute --job build