👮

Ruby + GitHub Actions + reviewdogでカバレッジを行単位で可視化する

2022/09/07に公開

以前作った undercover-checkstyle gemと便利な割にはあまり使われていなそうな undercover gemの紹介です。
これらの gem を使うことで以下のようなことが可能になります。

  • undercover gemの出力結果をreviewdogに連携できる
  • Codecovのような外部サービスを使わずに行単位でカバレッジを可視化できる
  • PR毎に行単位でカバレッジが可視化されることでレビュアーの負荷を軽減できる

Actions Demo

利用方法

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 と併用することで、外部サービスを使わなくてもカバレッジの計測・可視化状況を改善できるかと思います。
良かったら使ってみてください。

octocov

https://github.com/aki77/undercover-checkstyle

https://github.com/aki77/delete-pr-comments-action

Discussion