Ruby + GitHub Actions + reviewdogでカバレッジを行単位で可視化する
以前作った undercover-checkstyle gemと便利な割にはあまり使われていなそうな undercover gemの紹介です。
これらの gem を使うことで以下のようなことが可能になります。
- undercover gemの出力結果をreviewdogに連携できる
- Codecovのような外部サービスを使わずに行単位でカバレッジを可視化できる
- PR毎に行単位でカバレッジが可視化されることでレビュアーの負荷を軽減できる
利用方法
SimpleCov が導入済みであることが前提です。
未導入の場合はREADMEを参考に設定を完了させてください。
Gemfile
に以下を追加します。
group :test do
gem 'simplecov-lcov'
gem 'undercover'
gem 'undercover-checkstyle'
end
undercoverのREADME を参考にsimplecovの結果がLCOVフォーマットで出力されるようにします。
.simplecov
の設定例を記載しておきます。
require 'simplecov-lcov'
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
SimpleCov::Formatter::LcovFormatter,
SimpleCov::Formatter::HTMLFormatter,
])
SimpleCov.start('rails')
require 'undercover'
undercoverのREADMEを参考にローカルでundercoverコマンドが実行できることを確認します。
bundle exec undercover --compare origin/main
reviewdogと連携させるためにundercoverの結果をcheckstyleフォーマットでも出力出来ることを確認します。
bundle exec undercover-checkstyle --compare origin/main
ここまでの確認が終われば、あとはGitHub Actionsでreviewdogの設定をすれば完了です。
設定例
reviewdog.yml
runner:
undercover:
cmd: bundle exec undercover-checkstyle --compare origin/main
level: warning
format: checkstyle
.github/workflows/ruby.yml
name: Ruby
on:
pull_request:
jobs:
rspec:
runs-on: ubuntu-latest
env:
RUBYOPT: -EUTF-8
steps:
- uses: actions/checkout@v3
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Rspec
run: bundle exec rspec
- uses: reviewdog/action-setup@v1
with:
reviewdog_version: latest
- name: Run reviewdog
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git fetch --no-tags
reviewdog -reporter=github-pr-review -runners=undercover
GitHub Actionsの追加設定
追加のコミットでテストがカバーされるようになっても、現在のreviewdogの仕組みだとコメントが残り続けてしまいます。
そのため手動で削除していかない限りは、最終的にどこまでテストでカバーされたか分からないという問題があります。
そのような場合はaki77/delete-pr-comments-action を利用することで、reviewdog実行前に前回actions実行時のreviewdogコメントを削除するといったことが可能となります。
設定例
- uses: aki77/delete-pr-comments-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
bodyContains: "[undercover]"
- name: Run reviewdog
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git fetch
reviewdog -reporter=github-pr-review -runners=undercover
reviewdogの関連Issue
[github-pr-review] Mark outdated review comments as obsolete or delete such comments · Issue #568 · reviewdog/reviewdog
おわりに
octocov と併用することで、外部サービスを使わなくてもカバレッジの計測・可視化状況を改善できるかと思います。
良かったら使ってみてください。
Discussion