【Rust】CircleCIでgrcovを回してREADMEにカバレッジを表示する方法
テスト書いていますか?
Rustのテストは、公式チュートリアルにもありますがとても簡単に導入できます。
テストが簡単なのであれば、それを自動化したくなりますよね。
テストが自動化されたら、それを可視化したくなりますよね。
今回は、Mozillaが開発を進めているRust製カバレッジ計測ツールであるgrcovを使った自動テストを行い、さらにREADMEにバッジを貼る方法をご紹介します。
準備
1.grcovとは
Mozillaが開発しているRust製のカバレッジ計測ツールです。
他にもcargo-kcovというツールが使いやすいとの声も聞きますが、mozillaが開発を進めている安心感には敵いません。
現在も開発が進められており今後は主流になる可能性もあるので、ぜひ使っていきたいですね。
2.CircleCIの導入
(CircleCIとは何かという説明は割愛します...。)
導入に際して、アカウントをまだ持っていない方は下記の公式ページより Sign Up してください。
Sign Up後は自分用のDashボードができますので、その左側にあるメニューにある ADD PROEJCTS より、CircleCIを導入したいリポジトリを選択します。
リポジトリを選択すると、そのリポジトリでのCIの設定を選ぶ画面に遷移します。
ここで OS や 言語 を選択して、生成されたCIの設定ファイルである config.yml をリポジトリに置くことになります。
見て分かる通り、Rustは選択肢にないため、下図にあるデフォルトのファイルが提示されます。
設定ファイルの簡単な見方としては、steps の下に箇条書きされたプロセスが逐次実行される、というものになります。
今回は「grcovでテストを実行し、そのカバレッジを表示するプロセス」を追加することになるため、この設定ファイルに修正を加えるのですが、grcovとcodecovについて話した後に行うのでもう少しお付き合いください。
3.grcovでカバレッジを計測する
計測方法については README.md に記載されている通りですが、下記のとおりになります。
grcov ~/Documents/mozilla-central/build -t lcov > lcov.info
これで計測結果である、lcov.info を得ることができます。
grcov で行うことはこれだけです。
4.codecovで計測結果を可視化する
最後に grcov の計測結果の可視化を行います。
可視化には codecov というツールを用います。
こちらも Circle CI と同様にアカウントがまだの方は Sign Up を行ってください。
Sign Up が済みましたら、codecov を導入したいリポジトリを選択してください。
リポジトリを選択するとトークンが発行されますので、こちらは控えておいてください。
控えておいたトークンを Circle CI に教えてあげます。
Circle CI の Jobパネルを選択して、codecov を導入したいリポジトリの設定を選択してください。
Job の環境変数の設定より、先程の codecov のトークンを設定してください。
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 が存在するので、それを使ってしまえば良いということです。
codecov の orb の仕様
https://circleci.com/orbs/registry/orb/codecov/codecov
lcov を送ってしまえばあとは codecov が良い感じに可視化してくれます。
(雑な commit message がバレる...)
さあ、バッジをつけよう
まずは CircleCI。
各 job の右側にある設定アイコンをクリックします(CircleCIそれ自体の設定ではないことに注意してください。)
「Status Badges」を選択して、markdown で記述されたバッジをコピーし、README.md にペーストします。
続いて codecov です。
こちらも CircleCI 同様に非常に簡単です。
markdown で書かれたものをコピーして、README.md にペーストしてください。
下記のようなバッジが表示されていれば成功です。
おわり
導入がいかに簡単かわかってもらえたと思います。ぜひ自動テストを導入してみてください。