RubyなリポジトリのGitHub ActionsでCoverallsを使う


はじめに

Travis CIからGitHub Actionsに移行する際に、GitHub ActionsでSimpleCovの結果をCoverallsに送信する方法を調べました。simplecov-lcovを使用して、code coverageをlcov形式で出力し、それをCoverallsに送るという感じでした。

SimpleCovとsimplecov-lcovのインストール

Gemfileに以下の二行を追加して、bundle install しました。

gem 'simplecov', '~> 0.21'
gem 'simplecov-lcov', '~> 0.8'

spec/spec_helper.rb の先頭に以下を追加します。Coverallsにcoverageを送る場合に重要になるのは、SimpleCov::Formatter::LcovFormatter に関係する部分です。

require 'simplecov'
require 'simplecov-lcov'

SimpleCov::Formatter::LcovFormatter.config do |config|
  # Coverallsはデフォルトではcoverage/lcov.infoの結果を送信する
  config.report_with_single_file = true
  config.single_report_path = 'coverage/lcov.info'
end

SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
  SimpleCov::Formatter::HTMLFormatter, 
  # formatterにSimpleCov::Formatter::LcovFormatterを加える
  SimpleCov::Formatter::LcovFormatter
])

SimpleCov.start

Coveralls GitHub Actions

https://github.com/marketplace/actions/coveralls-github-action に、CoverallsのGitHub Actionsがあります。

Use latent version ボタンを押すと表示されるモーダルの二行をコピーして、Workflowのymlに追記します。

Workflowの例

code coverageをCoverallsに送信するために .github/workflows/coverage.yml というworkflowファイルを用意しました。重要なのは、前節でコピーした最後の - name: Coveralls GitHub Action からの部分です。github-token は必須のオプションになりますが ${{ secrets.GITHUB_TOKEN }} としておけばOKです。

name: coverage

on: [push, pull_request]

jobs:
  coverage:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
      - name: Set up Ruby 2.7
        uses: actions/setup-ruby@v1
        with:
          ruby-version: '2.7'
      - name: Build and test with Rake
        run: |
          gem install bundler
          bundle install
          bundle exec rake
      - name: Coveralls GitHub Action
        uses: coverallsapp/[email protected]
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

必要かどうかちょっと謎ですが、一行だけの .coveralls.yml を用意しました。

service_name: github-ci

あとはこれらをcommitしてpushすれば、workflowが動きだして、Coverallsに結果が送られます。あらかじめ、Coveralls側でリポジトリの連携をONにしておいてください。

おわりに

CoverallsのGitHub Actionのexampleが、Node.jsのものだったので、Rubyは対応してないのかな〜と思っていたのですが、ちゃんと調べたら簡単でした。Travis CIの頃は、coveralls gemを使っていました。coveralls gemでは、SimpleCovのバージョンにしばりがあるので、今回の様なsimplecov-lcovを使った方法の方が自由で良いですね。