CircleCIとCodecovでGitHubにカバレッジバッジをつけよう!

How to add coverage badge to GitHub repository using CircleCI and Codecov

Takuo
VELTRA Engineering
6 min readApr 15, 2019

--

GitHubのREADMEにバッジをつけると、CI/CDのビルド情報を始めとしたいろいろな情報がすぐに分かってとても便利です。また、リポジトリのちゃんとしてる感がぐっと高まります。そんなバッジの中でも、普段自動テストを書いているのであれば、あると嬉しいのがカバレッジバッジ。CircleCIはカバレッジバッジをサポートしていないので、今回はCodecovを使ってバッジをつける方法を紹介します。なお、言語はGoです。

前提

CircleCIで自動テストが動いている前提で、その先、カバレッジバッジをつける方法を紹介します。CircleCIで自動テストを動かす方法などは、別の記事を参照してください。

例えばこんなコマンドで、Goのテストが動いています。

-cover オプションが付いているので、CircleCIの実行結果を見ると、全体のカバレッジ率は確認できますが、やはり面倒なのでREADMEで見たいですよね。

Step1: Codecovのアカウント作成

まずは、Codecovにアカウントを作成しておきましょう。CircleCIと同じように、GitHubのアカウントを使用して認証することができます。

Step2: Codecovのトークン取得

Add new repositoryをクリックすると、自分のリポジトリの一覧が表示されるので、カバレッジバッジを付けたいリポジトリを選択しましょう。

画面に記載されている通り、この時点でリポジトリが追加されるわけではないようです。画面に表示されているトークンを使用してカバレッジレポートをアップロードすれば、自動的にリポジトリが追加されます。このトークンは次の手順で使用します。

Step3: CircleCIのプロジェクト設定変更

CircleCIの設定変更をします。変更箇所は2点。

  1. 対象リポジトリに、環境変数CODECOV_TOKENを登録します。Step2で取得したトークンを設定してあげてください。
  2. Org Settings - Securityで、Orb Securuty SettingsYesに変更します。これは次の手順で、Codecovが作成したOrbsを利用できるようにする設定です(参考)。これは組織単位で一度実施すればOKです。

Step4: config.ymlの修正

では、.circleci/config.ymlを修正していきましょう。修正箇所は大きく3つです。

まずひとつ目は、CodecovのOrbを利用する旨を記載します。最新のバージョンはこちらで確認できます。

続いて、テスト実施のコマンドを修正し、カバレッジ結果をファイルに出力します。

最後に、CodecovのOrbを使用して、カバレッジ結果をアップロードします。

config.ymlの全体像はこちらを参照してください。

Step5: READMEにバッジを追加

最後に、READMEにバッジを追加して終了です。Markdown形式だと、下記のようになります。

なお、一度でもカバレッジ結果をCodecovにアップロードすると、対象リポジトリがCodecovに追加されるので、Settings - Badgeから必要な形式のバッジを取得することができます。

README.md.circleci/config.ymlをGitHubにPushし、CircleCIの結果を確認しましょう。問題なければ、正しくカバレッジ結果がCodecovにアップロードされるはずです。

結果の確認

Codecovでは、きれいなフォーマットでカバレッジ結果を確認できます。

コードのどこを通ったのかなども一目瞭然ですね。(まぁこれはCodecovに限った話ではないですが)

なお、GitHubのPRにCodecovがサマリーを書き込んでくれるので、普段はCodecovのページに移動する必要はありません。OAuthのときにWrite権限が含まれていたのはこのためですね。

そしてREADMEにはこんなバッジが!これですね、これ!

カバレッジバッジがあるとリポジトリがグッと引き締まります。Codecovのようなカバレッジ測定ツールの他にも、CodeClimateといったコード品質測定ツールなどもあるので、今後はそちらも試してみたいです。

--

--

Takuo
VELTRA Engineering

Engineer who likes travel, simple code, and something new