GitHub ActionsとCOVERALLによるOSSカバレッジテストの可視化
GCC用のカバレッジテストツールであるGCOVにはHTMLレポートを出力する機能があります。この機能をGitHub Actionsから使用してCOVERALLSで可視化できるようにしました。
動機
GCOVはきれいなレポートを作ってくれますが、毎回ちょっとした手順を踏む必要があります。
- ビルド時に--coverageオプションを作る必要がある(コンフィギュレーション時に1回)
- テストプログラムを実行する必要がある(ビルド後に1回)
- カバレージ出力をHTMLに変更する一連のプログラムを実行する必要がある。
スクリプトを作ってVSCodeのタスクにでも登録すれば済む話ですが、正直言ってOSSの場合ビルドごとにチェックするものでもないのでタスクそのものを忘れかねません。
また、CMakeのビルドだとソースツリーの構成によってはビルドツリーのだいぶ深いところにレポートが作られるので、毎回見に行くのはちょっと億劫です。
そこでGitHub Actionsを使おうと考えたわけです。
Gcovr Action
GitHubのマーケットプレースには多数のアクションが登録されています。これらを使うと面倒なワークフローもあっさり実現でき(ることがあり)ます。
今回注目したのはGCovr Actionで、これを使うとGCOVの出力からレポートを簡単に作ることができます。どのくらい簡単かと言うと、リンク先のサンプルを自分のプロジェクトで使ったところあっさり動作しました。
name: test
on:
push:
jobs:
test-project:
runs-on: ubuntu-22.04
steps:
- name: Checkout Project
uses: actions/checkout@v4.2.0
- name: Build Project
uses: threeal/cmake-action@v2.0.0
- name: Test Project
uses: threeal/ctest-action@v1.1.0
- name: Check Test Coverage
uses: threeal/gcovr-action@v1.1.0
このままではGCOVの出力であるレポートを取り出せませんが、それでもCTestの結果によってWorkflowの動作結果をグリーン/レッドに表示できます。
さて、このサンプルに3行追加するだけで、COVERALLSにレポートを表示させることができます。
name: Coverage-Test
on:
push:
jobs:
test-project:
runs-on: ubuntu-22.04
steps:
- name: Checkout Project
uses: actions/checkout@v4.2.0
- name: Build Project
uses: threeal/cmake-action@v2.0.0
- name: Test Project
uses: threeal/ctest-action@v1.1.0
- name: Check Test Coverage
uses: threeal/gcovr-action@v1.1.0
with:
coveralls-send: true
excludes: build/* test/*
追加したのは最後の3行です。そして最後の1行は「レポートから除外する」ファイルを指定する補助情報ですので、実質2行追加しただけでレポートをCOVERALLに飛ばすことができます。
COVERALLS
COVERALLSによる表示については私の処理結果を例として挙げます。念のためスクリーンショットも示します。
COVERALLSとGitHubのアカウントを連携させると、ソースコードの行ごとにカバーされているか否かを色分けしてくれます。
このレポートを作ったリポジトリへのリンクも示しておきます。実験用のリポジトリですので、最新のコミットではなくcoverallsタグを参照するようにしてください。
COVERALLSサービスは随分前からあるようなのですが、存在が当たり前すぎるのか余り説明が見当たりませんでした。メモとして記事にした次第です。
Discussion