Github Actions + simplecov + codecov でカバレッジを表示する

rochefort/git-trend のCIは、これまで Travis-CI を利用していたのですが、 無料で使えなくなっていました(どうも2020年ぐらいからだったみたい)ので、今だとGithub Actionsが簡単に利用できそうでしたので、こちらへ移行しました。

また、カバレッジの表示もCoveralls を利用していたのですが、公開されているGithub Actions でうまく利用できなかったので、 これを機に Codecov へ移行してみました。

あんまり関係ないところで少しはまっていましたが、移行自体は簡単でした。

こんな感じ

codecov側はこんな感じです。

githubに載せるバッジはこんな感じです。

Github Actionsでrspecの実行

ruby/setup-ruby@v1 を使って rspec, rubocop を実行しています。 ここでは省略していますが、複数のrubyで実行したかったので、jobsをrubyのversion毎に作成しています。

# .github/workflows/ci.yml
name: CI

on:
  push:
  pull_request:

jobs:
  ruby32:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.2.2'
          bundler-cache: true

      - name: Show ruby version
        run: ruby -v

      - name: Run tests
        run: bundle exec rspec

      - name: Run lint
        run: bundle exec rubocop

smplecov + codecov

codecov側の設定

Codecovgithubでログインし、対象リポジトリを選択すると、CODECOV_TOKEN が発行されます。

simplecov

SimpleCov::Formatter::SimpleFormatter で送れば良いので、これ用の設定は特に不要でした。

# spec/spec_helper.rb
require "simplecov"
SimpleCov.start do
  add_filter "/spec/"
end

最初は、githubに記載されてるように、ENV["CI"] でformatter分ける必要があるかと思ったのですが、なくてもlocalでhtmlとSimpleFormatterのそれぞれ出力されてるようなので、上記に変更しました。

# spec/spec_helper.rb
require "simplecov"
SimpleCov.start do
  add_filter "/spec/"

  if ENV["CI"]
    formatter SimpleCov::Formatter::SimpleFormatter
  else
    formatter SimpleCov::Formatter::MultiFormatter.new([
      SimpleCov::Formatter::SimpleFormatter,
      SimpleCov::Formatter::HTMLFormatter,
    ])
  end
end

Github Actionsの設定

これをgithubに追加します。 「Settings -> Secrets and Variables -> Actions -> Repository secrets」で追加できます。

Github Actionsワークフロー

filesとtokenオプションが必要です。 その他オプションは、Codecov · Actions · GitHub Marketplace に記載されています。

# .github/workflows/ci.yml
(略)
      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v3
        with:
          files: ./coverage/.resultset.json
          token: ${{ secrets.CODECOV_TOKEN }}

GithubのREADMEにつけるバッジ

codecovの設定から選択できます。

その他ハマったところ

今回合わせて、gemの更新も行ったのですが、 Simplecov.start の実行よりもアプリケーションのrequireが早く実行されており、 gemの更新により、rspecの結果がcoverageに表示されなくなってしまっていました。

これに気づかずに、codecovには送信できているが結果が何も表示されておらず、 formatterが問題ではないかと疑って、いろいろ試してしまっていました。

# before
require "simplecov"
require "webmock/rspec"
require "git_trend"   # <- これがアプリケーションコード。これより先に SimpleCov.start しないといけない
SimpleCov.start do
  add_filter "/spec/"
end
# after
require "simplecov"
SimpleCov.start do
  add_filter "/spec/"
end

require "webmock/rspec"
require "git_trend"