JenkinsのCobertura Pluginとlcov-to-cobertura-xmlを使ってみる

JenkinsのCobertura Pluginとlcov-to-cobertura-xmlでC/C++のコードカバレッジを測方法をまとめます。

Debian 8で実行しています。


1 Cobertura Pluginとは

CoberturaによるコードカバレッジをJenkins上で閲覧するプラグインです。

CebratureはJavaのコードカバレッジレポートツールです。HTML出力をサポートしております。Cobrtura Pluginを用いることでビルド毎のコードカバレッジを記録することができ、ビルド毎のコードカバレッジの偏移を把握することができます。

2 lcov-to-cobertura-xmlとは

lcovの出力結果をCoberturaの形式に変換するpythonスクリプトです。

lcovはgcovのグラフィカルなフロントエンドツールです。

C/C++コードカバレッジレポートツールのgcovの結果をグラフィカルに閲覧することができます。

lcov単体でもHTML出力をサポートしておりますが、Jenkinsと連携できるCoberturaの形式に変換する為にlcov-to-cobertura-xmlを用います。

2.1 lcov-to-cobertura-xmlの使い方

以下の手順でCobertura用データを作成します。

1. CFLAGSやCXXFLAGSに-coverageオプションを付けてプログラムをビルド
2. プログラムを実行してgcov用データ出力
3. lcov用データ出力
4. lcov-to-cobertura-xmlでCobertura用データに変換

3 他のC/C++のコードカバレッジ閲覧方法について

Cobertura Pluginとlcov-to-cobertura-xmlを用いる方法以外にもCobertura Pluginとgcovrを用いる方法と、HTML Publisher Pluginとlcovを用いる方法があるらしいのですが、上手く動作しませんでした。

3.1 Cobertura Pluginとgcovrの問題点

gcovrのxml出力結果をJenkinsのCobertura Pluginに読み込ませることで、Jenkins上でコードカバレッジを閲覧できます。

gcovrはソースツリーのパスの追跡が上手くできておらず、ソースコードの参照ができません(ひとつのディレクトリ直下に全てのソースコードがあるような場合は問題ないようなのですが)。

コードカバレッジが減少した場合にソースコードの実行パスが見れないので困ります。

3.2 HTML Publisher Pluginとlcovの問題点

lcov(genhtml)のhtml出力結果をJenkinsのHTML Publisher Pluginに読み込ませることで、ソースコードのカバレッジを閲覧できます。

あくまでhtml出力結果のリンクが生成されるだけで、コードカバレッジの履歴を残すことができません(ビルド毎のコードカバレッジのグラフが表示できない)。

ビルド毎のコードカバレージの差分が分かりにくい為、繰り返しテストを実行できるJenkinsのメリットに合いません。

4 Cobertura Pluginのインストール

Jenkinsのプラグイン制御画面からインストールします。

Jenkinsの管理 -> プラグインの管理 -> 利用可能

https://dl-web.dropbox.com/s/frtia52v24uiyl8/0001_Cobertura-install.png

5 lcov-to-cobertura-xmlのインストール

lcov_coberturaというpythonスクリプトをダウンロードします。

$ wget https://raw.githubusercontent.com/eriwen/lcov-to-cobertura-xml/master/lcov_cobertura/lcov_cobertura.py
$ chmod a+x lcov_cobertura.py
$ sudo cp lcov_cobertura.py /usr/local/bin/
$ rm -f lcov_cobertura.py

setup.pyを用いてシステムにインストールした場合、lcov-to-cobertura-xmlが提供するpythonインターフェースを自身で作成したpythonスクリプトにて利用できるようになります。

6 ジョブの設定

6.1 ビルド手順の追加

ビルド手順の追加にて、「シェルの実行」を選択します。

https://dl-web.dropbox.com/s/6jcugdc6uw5lt4f/0002_Build-setting.png

ソースコードを-coverageオプションを付けてビルドします。

# Clean files
make clean

# Run gcc with -coverage option
make gcov

プログラムを動作させます。

# Run program for code coverage
./myprog

lcovでgcov用データを収集して、lcov用データを作成します。

lcov –removeで一度作成したlcov用データから自分が追跡しないデータを排除します。私の環境では、/usr/include以下のファイルを排除してます(C/C++標準ライブラリのコードカバレッジ測定は目的ではないので)。

# Run lcov and output to 'lcov' directory
mkdir lcov
lcov -c -d . -o lcov/coverage.info
lcov --remove lcov/coverage.info "*/usr/include/*" -o lcov/coverage.info

lcov_cobertura.pyでlcov用データをCobertura用データに変換します。

# Run lcov_cobertura.py and output to 'lcov' directory
lcov_cobertura.py lcov/coverage.info -b `pwd` -o lcov/coverage.xml

6.2 ビルド後の処理

ビルド後の処理の追加にて、「Cobertura カバレッジ・レポートの集計」を選択します。

Cobertura XMLレポートパターンにCobertura用データのパスを指定します。

https://dl-web.dropbox.com/s/0l4b3skycq50lw3/0003_Post-build-setting.png

7 ジョブ実行後の画面

ジョブを実行するとコードカバレッジのサマリーが表示されました。

https://dl-web.dropbox.com/s/5g4andqlsgao8xn/0004_CodeCoverage-summary.png

ソースコードレベルで実行されたパスを確認できます。

https://dl-web.dropbox.com/s/wgcgx9pz7l8g96o/0005_CodeCoverage-detail.png