こんにちは。クラウドインテグレーション事業部の上原です。
研究開発系の先端的な内容が多いFLECTブログですが、
今回は開発の方面から、ちょっとしたTipsを共有してみようと思います。
対象アプリケーション
今回の記事で取り扱うのは、Spring Boot製のバックエンドAPIアプリケーションです。
CIツールにはCircleCIを採用し、GitHubへのpushをトリガーにテスト(JUnit)およびビルド・デプロイを自動実行しています。
- 言語/フレームワーク:Java8/Spring Boot (2.1.x)
- ビルドツール:Gradle
- テスト/カバレッジ測定:JUnit5/JaCoCo
- 構成管理・レビュー:GitHub
- CIツール:CircleCI
circleci.com
「レビューのときにカバレッジが見たい」
CircleCIを導入するにあたり、とりあえず自動テストの実行と、テスト結果をGitHubのプルリクエスト画面に連携する所までを設定。
しかし、コードカバレッジについてはHTMLレポートを出力して保存するタスクを作っただけでした。
.circleci/config.yml
- run:
# カバレッジレポートの生成
name: Generate coverage report
command: ./gradlew jacocoTestReport
when: always
- run:
# HTMLレポートを移動
name: Save coverage report
command: |
mkdir -p ~/test-results/jacoco/
find . -type f -regex ".*/build/reports/jacoco/test/.*xml" -exec cp {} ~/test-results/jacoco/ \;
cp -r ./build/reports/jacoco/test/html ~/test-results/jacoco/html
when: always
- store_artifacts:
# アーティファクトとして保存
path: ~/test-results/jacoco
最初はこれで問題なかったのですが、開発が進むにつれ、毎回CircleCIの画面に遷移してレポートを開いて該当部分のカバレッジを探して…というのが手間になってきました。
できればカバレッジもプルリクエスト画面で見えるようにしたいな…欲を言えば、修正分の差分が測定できたり、カバレッジが不十分だったらマージできないようにできたらいいな…
でもそんな都合の良いサービスなんて…………ありました。
CodecovというWebサービスです。
codecov.io
GitHub連携でプルリクエストにカバレッジレポートを表示可。差分測定に対応。UIやグラフも綺麗。いいですね!
利用方法もとても簡単。
- Githubアカウントでユーザ登録
- Codecovの管理画面からリポジトリを選択(GitHub組織の管理者がインテグレーションを許可する必要があります)
- アップロードトークンが払い出されるので、設定ファイル(codecov.yml)を作成してトークンを書き込む。(※ 環境変数でも可)
- GitHubにpushすると自動でCodecovにカバレッジ情報がアップロードされ、レポートが見えるようになる
あとはCircleCIとCodecovを連携して、自動テストのタイミングでカバレッジを収集するよう設定すればOK!
連携方法は公式のドキュメントとブログに記載されています。
circleci.comGenerating Code Coverage Metrics - CircleCI
circleci.comMaking code coverage easy to see with the Codecov CircleCI orb - CircleCI
英語やん…(2020年4月現在)
そう、CodeCovやCircleCIの一部ドキュメントは英語。いろいろ探したのですが、この件に関する日本語の記事は見つかりませんでした。
また、検索の腕が悪いのか「CircleCI+Codecov+Jacoco+gradle」のピンポイントな情報も見つからず…
ということで、英語と格闘して試行錯誤しながら何とか動かせるところまで持っていきました。というのがメインのお話です。
本題(設定ファイル)
結論から言うと、設定ファイルは以下のようになりました。
(注:重要なところだけ抜き出しているので、これだけだと動きません)
build.gradle
apply plugin: 'jacoco'
jacoco {
toolVersion = '0.8.4'
}
jacocoTestReport {
reports {
xml.enabled = true
}
}
.circleci/config.yaml
orbs:
codecov: codecov/codecov@1.0.5
jobs:
run-junit-test:
steps:
- (テストの実行などのstep)
- run:
# カバレッジレポートの生成
name: Generate coverage report
command: ./gradlew jacocoTestReport
when: always
- codecov/upload:
# Orb
file: ./build/reports/jacoco/test/jacocoTestReport.xml
when: always
必要な設定は以下の通りです。
- CircleCIの環境変数に「CODECOV_TOKEN」を追加し、値にアップロードトークンを設定しておく
- build.gradleの設定で、JaCoCoがXMLレポートを出力するように設定する
- CircleCIの設定ファイルで、CodeCovのOrb(CircleCIにおけるサードパーティライブラリ的なもの)を読み込ませる
- CircleCIのstepでレポート出力を実行する
- CircleCIのstepで、XMLファイルのパスを指定してOrbの「upload」コマンドを実行する
どのファイルをアップロードすればよいのか?認証方法の設定は?など色々ハマったところはあったのですが、まとめるとこんな感じです。
Slackへの通知についても色々調べたのですが、GitHubからの通知に差分等が出てくるようになったので、結局使っていません。
なお、合格とするカバレッジの閾値などは設定ファイルで細かく制御可能です。
細かい設定を追いきれていないので詳しくはCodeCovのドキュメントをご覧ください。
CodeCovのOrbのドキュメントはこちら。
https://circleci.com/orbs/registry/orb/codecov/codecov
おわりに
カバレッジをひと目で確認できるようになり、レビューが格段にやりやすくなりました。開発のスピードや品質を確保するには、仕組み作りが必要不可欠ですね。
CircleCIは機能がとても豊富なので、あとは設定ファイルの例がもっと増えてくれると嬉しいです…
(あとOrbの説明ページにも設定ファイルの記述例を…どうか………)
ここからテストの並列実行に取り組んだ話などもあるのですが、それは別の記事でお話できればと思います。
少しでもお役に立てたなら幸いです。それでは!