【Rails6】CircleCIでminitestとrubocopを実行【CIしてみる】
はじめに
CircleCIを導入して自動テスト、rubocopを実行してreviewdogでGithub上に出力までを行います。
こちらの記事を参考に進めていきます。
最終的な .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を選択
無料枠で登録するので、Start Building for Freeを選択
Githubと連携したいので、Sign Up with Githubを選択
アカウントや認証を確認して、Authorize circleciを選択
Githubのパスワードを入力
登録完了!
minitestを実行するための設定ファイルの作成
Add projectsを選択して、CIするリポジトリを選択します。
(今回はstudy_roadmapというリポジトリ)
Linux, Ruby を選択します。
Webページ上での作業はとりあえずここまでで、
次はリポジトリにファイルを追加します。
minitestを実行する設定ファイル
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 を実行します。
次のページで SUCCESS と表示されていればOKです。
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の実行
あとは待つだけで
Github上でCIの結果が表示されます。
ここまでで、プルリクエストを作成すると 自動的にテストを実行してくれるようになりました。
これによってテストの確認を怠ってプルリクエストがマージされるということが
なくなるはずですので、安全な開発ができます!
rubocopとreviewdogを実行するための設定
rubocop も自動的に実行してくれるようにして、
常に規約を守ったコードをリポジトリで管理できるようにします。
rubocop
コードの規約を守っているかチェックしてくれるツールです。
gem をインストールするだけですぐに終わります。
インストールとコードの修正は
下記の以前書いた記事を参考にしていただければと思います。
reviewdog
チェックツール等の結果をGithubのPull Requestにコメントしてくれるツールです。
こちらを使用してrubocopで警告があった際に、
Github上でコメントしてくれるようにします。
下記が紹介記事とgithubのページです。
設定ファイル
今回は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 を押下して作成ページに行きます。
Noteにtoken作成の目的を入力して、
- publicの場合は
public_repo
- privateの場合は
repo
にチェックを入れます。
これでtokenは作成できました。
CircleCIにtokenを設定しなければいけないので、
作成したtokenは控えておいてください。
CircleCIでtokenを設定
プロジェクトの環境変数に先ほど作成したtokenを設定します。
ADD PROJECTSメニューから
CIしているプロジェクト(リポジトリ)を押下
歯車のボタンがあるのでそれを押下
左側のメニューにあるEnvironment Variablesを押下して、
右上のAdd Variableを押下
ポップアップが表示されたら
Name:REVIEWDOG_GITHUB_API_TOKEN
Value:"先ほど作成したtoken"
を設定
これでtokenをCircleCIの環境変数に設定することができたので、
reviewdogへの権限の付与は完了です。
わざとrubocopの制約に引っかかってreviewdogの確認
確認のためにrubocopで警告が出されるコードをプッシュします。
インデントを不揃いにしたり、数十行のメソッドにしてみたり、
なんでもいいです。
今回はインデントを不要なところで1つ下げてプッシュしてみます。
下記のように「インデントを揃えて」とGithub上で指摘されたので
reviewdogが正常に動作していることを確認できました。
終わりに
Pull Requestを作成するだけで
自動的にテストとコード規約のチェックを行ってくれるようになりました!
次はCircleCIを使って自動デプロイとかSlackへの通知をやるよ。
知識皆無の状態でとりあえず動くまでをやったので、
コンテナとかCircleCIの勉強してまた修正予定。。。
とても参考になった記事
【CircleCI】CircleCI 2.0からはじめる個人での簡単なCI導入方法 - githubとの連携まで - tweeeetyのぶろぐ的めも
RailsプロジェクトにささっとCircleCI2.0を導入する - Qiita
CircleCI2入門① CirlceCIについて | Yuuの悠々自適Blog