amatsukixブログ

【Rails6】CircleCIでminitestとrubocopを実行【CIしてみる】

はじめに

CircleCIを導入して自動テスト、rubocopを実行してreviewdogでGithub上に出力までを行います。

こちらの記事を参考に進めていきます。

tweeeety.hateblo.jp

最終的な .circleci/config.yml ファイル

はじめに結果だけ載せておきます。
下記が最終的なCircleCIの設定ファイルです。

あとreviewdogを導入するにあたって、
環境変数の設定も必要です。
設定方法は記事内で説明します。

# 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.6.4-node-browsers
        environment:
          BUNDLER_VERSION: 2.0.2
          RAILS_ENV: test
          REVIEWDOG_VERSION: 0.9.11

    working_directory: ~/repo

    steps:
      - checkout

      - run:
          name: setup bundler
          command: |
            sudo gem update --system
            sudo gem uninstall bundler
            sudo rm /usr/local/bin/bundle
            sudo rm /usr/local/bin/bundler
            sudo gem install bundler

      # 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-

      # yarnのインストール
      - run: yarn install --check-files

      # bundlerのインストール
      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - run: bundle exec rake webpacker:compile

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

      # Reviewdogのインストール
      - run:
          name: Install Reviewdog
          command: |
            curl -fSL https://github.com/haya14busa/reviewdog/releases/download/$REVIEWDOG_VERSION/reviewdog_linux_amd64 -o reviewdog && chmod +x ./reviewdog

      # Database setup
      - run: bundle exec rails db:create
      - run: bundle exec rails db:migrate

      # run tests!
      - run:
          name: Rails Test
          command: bundle exec rake test

      # Rubocop & Reviewdogの実行
      - run:
          name: Rubocop & Reviewdog
          command: bundle exec rubocop | ./reviewdog -f=rubocop -reporter=github-pr-review

事前準備

事前に準備することが2点あります。

Githubアカウントの作成

CircleCIではリポジトリを使用するため、Githubアカウントが必要になります。
また、CircleCIのアカウントとGithubのアカウントを連携することになりますので作成しておきます。

CIするリポジトリの用意

CIしたいリポジトリを用意します。
今回はminitestとrubocopを実行してCIしたいので、 事前に設定をしておきました。

リポジトリがない場合はscaffold コマンドでアプリを作成して、
rubocopの設定を追加でしていただければと思います。

Githubと連携したCircleCIアカウントの作成

こちらの公式ページからCircleCIのアカウントを作成します。

Continuous Integration and Delivery - CircleCI

Pricingを選択

circleci-top
CircleCI TOP

無料枠で登録するので、Start Building for Freeを選択

signup-free
SignUp Free

Githubと連携したいので、Sign Up with Githubを選択

signup-with-github
Sign Up with Github

アカウントや認証を確認して、Authorize circleciを選択

authorize-circleci
Authorize Circleci

Githubのパスワードを入力

confirm-password
Confirm password to continue

登録完了!

circleci-dashboard
CircleCI Dashboard

minitestを実行するための設定ファイルの作成

Add projectsを選択して、CIするリポジトリを選択します。
(今回はstudy_roadmapというリポジトリ)

select-repository
ciするリポジトリの選択

Linux, Ruby を選択します。
Webページ上での作業はとりあえずここまでで、
次はリポジトリにファイルを追加します。

setting-repository
repository 設定

minitestを実行する設定ファイル

config.yml ファイルとは

このファイルはテスト等を検証するコンテナ環境下で、
何をインストールさせて何を実行させるかを自由に設定できます。

設定したファイル

config-yml
config.yml

.circleci/config.yml ファイルを作成します。

今回minitestを実行するまでに設定したファイルが下記になります。
これを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.6.4-node-browsers
        environment:
          BUNDLER_VERSION: 2.0.2
          RAILS_ENV: test

    working_directory: ~/repo

    steps:
      - checkout

      - run:
          name: setup bundler
          command: |
            sudo gem update --system
            sudo gem uninstall bundler
            sudo rm /usr/local/bin/bundle
            sudo rm /usr/local/bin/bundler
            sudo gem install bundler

      # 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-

      # yarnのインストール
      - run: yarn install --check-files

      # bundlerのインストール
      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - run: bundle exec rake webpacker:compile

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

      # Database setup
      - run: bundle exec rails db:create
      - run: bundle exec rails db:migrate

      # run tests!
      - run:
          name: Rails Test
          command: bundle exec rake test

test_helper.rb

現状のままだと、CircleCI上でテストの並列処理ができないようでしたので、
下記のように修正しておきます。

gemで並列処理を可能にするものがあるらしいので、
修正予定。

  # Run tests in parallel with specified workers
  parallelize(workers: 1)

リポジトリにプッシュ

タイトルの通り、リポジトリにプッシュします。

CircleCIのWebページに戻って

準備が完了したので、
先ほどのページで start building を実行します。

start-building
start building

次のページで SUCCESS と表示されていればOKです。

success
SUCCESS

Githubでプルリクエストを送ってCIする

ここまでの設定でプルリクエストを送ることで、
自動的にCIできるようになっています。

確認だけ行います。

プルリクエストの作成

下記のように新しいブランチを作成して、
プルリクエストを作成します。

# 新しいブランチの作成
$ git checkout -b ci-test

# 何かしら編集
$ vim README.md

# コミットしてプッシュ
$ git add README.md
$ git commit -m 'READMEの編集'
$ git push origin ci-test

Githubリポジトリのページにbranchesのページがあるのでそちらに遷移して、
New pull request からプルリクエストを作成します。

CIの実行

あとは待つだけで

wait ci
ci待ち

Github上でCIの結果が表示されます。

ci
自動的にCI

ここまでで、プルリクエストを作成すると 自動的にテストを実行してくれるようになりました。

これによってテストの確認を怠ってプルリクエストがマージされるということが
なくなるはずですので、安全な開発ができます!

rubocopとreviewdogを実行するための設定

rubocop も自動的に実行してくれるようにして、
常に規約を守ったコードをリポジトリで管理できるようにします。

rubocop

コードの規約を守っているかチェックしてくれるツールです。

gem をインストールするだけですぐに終わります。
インストールとコードの修正は
下記の以前書いた記事を参考にしていただければと思います。

amatsukixprog.hatenablog.jp

reviewdog

チェックツール等の結果をGithubのPull Requestにコメントしてくれるツールです。
こちらを使用してrubocopで警告があった際に、
Github上でコメントしてくれるようにします。

下記が紹介記事とgithubのページです。

haya14busa.com

github.com

設定ファイル

今回はrubocopが既に導入済みの前提ですので、
reviewdogの設定のみ行います。

config.ymlには下記の設定を追加します。

  • reviewdogのバージョン指定
  • reviewdogのインストール
  • rubocopとreviewdogの実行

編集後の 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.6.4-node-browsers
        environment:
          BUNDLER_VERSION: 2.0.2
          RAILS_ENV: test
          REVIEWDOG_VERSION: 0.9.11

    working_directory: ~/repo

    steps:
      - checkout

      - run:
          name: setup bundler
          command: |
            sudo gem update --system
            sudo gem uninstall bundler
            sudo rm /usr/local/bin/bundle
            sudo rm /usr/local/bin/bundler
            sudo gem install bundler

      # 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-

      # yarnのインストール
      - run: yarn install --check-files

      # bundlerのインストール
      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - run: bundle exec rake webpacker:compile

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

      # Reviewdogのインストール
      - run:
          name: Install Reviewdog
          command: |
            curl -fSL https://github.com/haya14busa/reviewdog/releases/download/$REVIEWDOG_VERSION/reviewdog_linux_amd64 -o reviewdog && chmod +x ./reviewdog

      # Database setup
      - run: bundle exec rails db:create
      - run: bundle exec rails db:migrate

      # run tests!
      - run:
          name: Rails Test
          command: bundle exec rake test

      # Rubocop & Reviewdogの実行
      - run:
          name: Rubocop & Reviewdog
          command: bundle exec rubocop | ./reviewdog -f=rubocop -reporter=github-pr-review

tokenを作成して、CircleCIの環境変数に設定

reviewdogからgithubのPull Requestにコメントさせるには
権限が必要になります。

githubでtoken作成

権限を証明するtokenをgithub上で作成します。

generate new token を押下して作成ページに行きます。

token作成ページ

Noteにtoken作成の目的を入力して、

  • publicの場合は public_repo
  • privateの場合は repo

にチェックを入れます。

access-token
access token

これでtokenは作成できました。
CircleCIにtokenを設定しなければいけないので、
作成したtokenは控えておいてください。

CircleCIでtokenを設定

プロジェクトの環境変数に先ほど作成したtokenを設定します。

ADD PROJECTSメニューから
CIしているプロジェクト(リポジトリ)を押下

select-project
select project

歯車のボタンがあるのでそれを押下

config-button
config button

左側のメニューにあるEnvironment Variablesを押下して、
右上のAdd Variableを押下

setting-environment-variables
setting Environment Variables

ポップアップが表示されたら
Name:REVIEWDOG_GITHUB_API_TOKEN
Value:"先ほど作成したtoken"
を設定

add-an-environment -variable
Add an Environment Variable

これでtokenをCircleCIの環境変数に設定することができたので、
reviewdogへの権限の付与は完了です。

わざとrubocopの制約に引っかかってreviewdogの確認

確認のためにrubocopで警告が出されるコードをプッシュします。 インデントを不揃いにしたり、数十行のメソッドにしてみたり、
なんでもいいです。

今回はインデントを不要なところで1つ下げてプッシュしてみます。

下記のように「インデントを揃えて」とGithub上で指摘されたので
reviewdogが正常に動作していることを確認できました。

rubocop-warning
rubocop warning

終わりに

Pull Requestを作成するだけで
自動的にテストとコード規約のチェックを行ってくれるようになりました!

次はCircleCIを使って自動デプロイとかSlackへの通知をやるよ。
知識皆無の状態でとりあえず動くまでをやったので、
コンテナとかCircleCIの勉強してまた修正予定。。。

とても参考になった記事

【CircleCI】CircleCI 2.0からはじめる個人での簡単なCI導入方法 - githubとの連携まで - tweeeetyのぶろぐ的めも

RailsプロジェクトにささっとCircleCI2.0を導入する - Qiita

CircleCI2入門① CirlceCIについて | Yuuの悠々自適Blog

RailsチュートリアルのサンプルにCircleCIを入れる - Qiita

reviewdogを使ってCI上でRuboCop自動レビューを動かす - Hack Your Design!