【Rust】CircleCIでgrcovを回してREADMEにカバレッジを表示する方法

テスト書いていますか?

 Rustのテストは、公式チュートリアルにもありますがとても簡単に導入できます。 

doc.rust-jp.rs

テストが簡単なのであれば、それを自動化したくなりますよね。

テストが自動化されたら、それを可視化したくなりますよね。

 

今回は、Mozillaが開発を進めているRust製カバレッジ計測ツールであるgrcovを使った自動テストを行い、さらにREADMEにバッジを貼る方法をご紹介します。

 

 

準備 

1.grcovとは

Mozillaが開発しているRust製のカバレッジ計測ツールです。

他にもcargo-kcovというツールが使いやすいとの声も聞きますが、mozillaが開発を進めている安心感には敵いません。

現在も開発が進められており今後は主流になる可能性もあるので、ぜひ使っていきたいですね。

github.com

 

2.CircleCIの導入

(CircleCIとは何かという説明は割愛します...。)

導入に際して、アカウントをまだ持っていない方は下記の公式ページより Sign Up してください。

f:id:TakumiKaribe:20190824153128p:plain

CircleCI公式ホームページ

Sign Up後は自分用のDashボードができますので、その左側にあるメニューにある ADD PROEJCTS より、CircleCIを導入したいリポジトリを選択します。

f:id:TakumiKaribe:20190824154104p:plain

ADD PROJECTS

リポジトリを選択すると、そのリポジトリでのCIの設定を選ぶ画面に遷移します。

f:id:TakumiKaribe:20190824154406p:plain

Set Up Project

ここで OS言語 を選択して、生成されたCIの設定ファイルである config.ymlリポジトリに置くことになります。

見て分かる通り、Rustは選択肢にないため、下図にあるデフォルトのファイルが提示されます。

f:id:TakumiKaribe:20190824154725p:plain

config.yml

設定ファイルの簡単な見方としては、steps の下に箇条書きされたプロセスが逐次実行される、というものになります。

今回は「grcovでテストを実行し、そのカバレッジを表示するプロセス」を追加することになるため、この設定ファイルに修正を加えるのですが、grcovとcodecovについて話した後に行うのでもう少しお付き合いください。

 

3.grcovでカバレッジを計測する

計測方法については README.md に記載されている通りですが、下記のとおりになります。

grcov ~/Documents/mozilla-central/build -t lcov > lcov.info

これで計測結果である、lcov.info を得ることができます。

grcov で行うことはこれだけです。

 

4.codecovで計測結果を可視化する

最後に grcov の計測結果の可視化を行います。

可視化には codecov というツールを用います。

codecov.io

こちらも Circle CI と同様にアカウントがまだの方は Sign Up を行ってください。

f:id:TakumiKaribe:20190825195257p:plain

Sign Up

Sign Up が済みましたら、codecov を導入したいリポジトリを選択してください。

f:id:TakumiKaribe:20190825195116p:plain

Add new repository

リポジトリを選択するとトークンが発行されますので、こちらは控えておいてください。

f:id:TakumiKaribe:20190825195618p:plain

Generate Token

控えておいたトークンを Circle CI に教えてあげます。

Circle CI の Jobパネルを選択して、codecov を導入したいリポジトリの設定を選択してください。

f:id:TakumiKaribe:20190825200013p:plain

Select Job Setting

Job の環境変数の設定より、先程の codecov のトークンを設定してください。

f:id:TakumiKaribe:20190825200214p:plain

Environment Variables

codecov の設定はこれで以上になります。

 

Jobの作成

さて、準備も済みましたので、ここからは実際に Job をいじっていきたいのですが、説明することはそこまでないため、完成した config.yml をここに載せてしまいます。

※「:space:」とキーワード化されてしまって上手くキーワード化を解除できなかったのですが、実際には「:space:」です。左記をさらにバックスラッシュを取り除いたものに読み替えてもらえると助かります。

version: 2.1
orbs:
codecov: codecov/codecov@1.0.5 

jobs:
build
docker
- image: circleci/rust
steps
- checkout
- run:
name: apt-get
command: sudo apt-get update && sudo apt-get -y install lcov ruby 
- run:
name: rustup install nightly
command: rustup install nightly
- run:
name: cargo install grcov
command: |
sudo gem install coveralls-lcov
cargo install grcov
- run:
name: generate coverage
command: |
PROJ_NAME=$(cat Cargo.toml | grep -E "^name" | sed -E 's/name:space:=:space:"(.*)"//g' | sed -E 's/-/_/g')
rm -rf target/debug/deps/$(PROJ_NAME)-*
export CARGO_INCREMENTAL=0
export RUSTFLAGS="-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Zno-landing-pads"

cargo +nightly build --verbose
cargo +nightly test --verbose

grcov ./target/debug/deps -s . -t lcov --llvm --branch --ignore-not-existing --ignore-dir "/*" -o lcov.info

- codecov/upload:
file: lcov.info

計測しているのは最後の step なのですが、project名の取得のために若干のシェルが書かれている程度で、行っていることは環境変数の設定とテストの実行、その実行結果から lcov を生成する、という単純な処理です。

上記のファイルをリポジトリのルートに .circleci/config.yml として保存しておけば、push 毎に lcov 生成のための処理が走り、codecov でカバレッジが計測できることになります。

 

なぜこの YAML がよしなに codecov と連携してくれるのかというと、CircleCI の orbs と呼ばれる package の存在です。これに lcov を送りつける I/F が存在するので、それを使ってしまえば良いということです。

circleci.com

codecov の orb の仕様

https://circleci.com/orbs/registry/orb/codecov/codecov

 

lcov を送ってしまえばあとは codecov が良い感じに可視化してくれます。

f:id:TakumiKaribe:20190921230053p:plain

(雑な commit message がバレる...)

 

さあ、バッジをつけよう

まずは CircleCI。

各 job の右側にある設定アイコンをクリックします(CircleCIそれ自体の設定ではないことに注意してください。)

f:id:TakumiKaribe:20190921231040p:plain

「Status Badges」を選択して、markdown で記述されたバッジをコピーし、README.md にペーストします。

f:id:TakumiKaribe:20190921231130p:plain

続いて codecov です。

こちらも CircleCI 同様に非常に簡単です。

markdown で書かれたものをコピーして、README.md にペーストしてください。

f:id:TakumiKaribe:20190921231433p:plain

下記のようなバッジが表示されていれば成功です。

f:id:TakumiKaribe:20190921231619p:plain

 

おわり

 導入がいかに簡単かわかってもらえたと思います。ぜひ自動テストを導入してみてください。