【Golang】Github actionsでカバレッジを取得しCodecovにアップロードする

Go言語で作ったアプリケーションのGithubリポジトリGithub actionsワークフローを設定し、 codecovカバレッジを送る設定方法を紹介したいと思います。

codecov は、テストのコードカバレッジを取得してくれるツールです。テストスイートを実行した時にソースコードの実行箇所を視覚的に示してくれて、どこに新しいテストを書くべきか分かりやすくなります。

f:id:moritamorie:20210228015138p:plain

  • : テストスイートによってソースコード実行されている箇所
  • : テストスイートによってソースコード部分的に実行されている箇所(具体的には、真偽値が返るところで、 truefalse のどちらかしか返っていない箇所)
  • : テストスイートによってソースコード実行されていない箇所

忙しい時はテストコードを書くのが手抜きになったりするのですが、 codecov を使っているとカバレッジ定量的・視覚的に表現されることによって、状況を把握しやすくなり自然とテストコード追加しようという気持ちになると感じていて、自戒の意味を込めて codecov を設定しています。

coverall と codecovの比較

類似のツールに coveralls がありますが、以下の観点で codecov を使うようにしています。

前提

  • codecovでアカウントを作成済

Codecovにカバレッジを送信し、視覚的に見れるように

Codecovにリポジトリを追加

Codecov にログインして、Repositoriesのタブから「Add New repository」のボタンを押すと、以下のようにGithub上のリポジトリが表示されるので、対象のリポジトリを選択します。 f:id:moritamorie:20210227221937p:plain

プライベートリポジトリの場合は、Settingの画面でActivateします。フリープランの場合、アクティベートできるリポジトリ数は1つのみです。 f:id:moritamorie:20210228013431p:plain

再度、Overviewを開くと、codecovトークンが表示されるので、コピーします。 f:id:moritamorie:20210227222000p:plain

GithubリポジトリでSecretsに追加

Github で対象のリポジトリのSettingsタブ→Secretsと選択し、「New repository secret」ボタンを押してNameに「CODECOV_TOKEN」、Valueにコピーしたトークンを入れて保存します。 f:id:moritamorie:20210227222651p:plain

Github actionsでGoのテストカバレッジをcodecovに送信

以下の yaml ファイルをプロジェクトに追加し、Github リポジトリにpushすると(またはPull Request作成時)、Github actionワークフローが実行されます。

Github actionワークフローの処理の中で、Githubアクションcodecov/codecov-action がSecretsに設定したトークンを使ってコードカバレッジCodecov に送ってくれます。

on: [push, pull_request]
name: Test
jobs:
  test:
    strategy:
      matrix:
        go-version: [1.15.x]
        os: [ubuntu-latest, macos-latest, windows-latest]

    runs-on: ${{ matrix.os }}
    steps:
    - name: Install Go
      uses: actions/setup-go@v2
      with:
        go-version: ${{ matrix.go-version }}

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

    - name: Test
      run: go test -race -coverprofile="coverage.txt" -covermode=atomic ./...

    - name: upload coverage
      uses: codecov/codecov-action@v1
      with:
        token: ${{ secrets.CODECOV_TOKEN }}

このGithubアクションは https://codecov.io/bashを実行し、ファイルをcodecovに送ってくれます。(参照したコード

この実行される bash の中で、カバレッジレポートだと思われるファイルを探して、マッチしたファイルを対象としてくれます。上記の yaml ファイルでは"coverage.txt"がレポートのファイルです。

Github actionsワークフロー実行後の確認

実行後、Codecovに戻ると以下のように、ソースコード上でテストスイートが実行された箇所が視覚的に見えるようになったり、ファイル毎・プロジェクト全体のカバレッジ等を把握できるようになります。 f:id:moritamorie:20210227230257p:plain

f:id:moritamorie:20210228154357p:plain

便利な機能

Codecov には、よりプロジェクトのカバレッジ状況を把握しやすくしたり、コントロールする機能があります。

Pull RequestにCodecovのレポートをコメントされるように

Codecovは、Github integration機能も提供していて、インストールするとPull Requestに自動的にレポートをコメントしてくれるようになります。

f:id:moritamorie:20210228152047p:plain

f:id:moritamorie:20210228151925p:plain

GithubリポジトリのREADMEにCoverageのバッヂを追加

再度 Codecov に戻り、以下のSettingページを参照し、Badgeのマークダウンをコピーします。

f:id:moritamorie:20210227231033p:plain

README.mdに貼り付け、Githubリポジトリを開くと、以下ののようにカバレッジが表示されたバッヂが付き、クリックするとCodecov の該当のプロジェクトのURLに遷移します。

f:id:moritamorie:20210227231419p:plain

Github上でPRを作った際

Github上でPRを作った際に、一定以上のカバレッジを満たさないといけないという制約を付けたい場合はcodecov.ymlを設定することによって実現可能です。

制約の例としては

などです。

DocsのCommon Configurationsを参照すると、実現したい設定と近いものが見つかるかもしれません。 docs.codecov.io

codecov.ymlの設定は、チーム単位/リポジトリ単位にそれぞれ柔軟に設定できます。

サンプルコード

github.com

参考資料