🙆
CircleCIで分割して実行したJestのカバレッジをSonarCloudで集約する
前提
- Jestで自動テストをしている
- CircleCIでテストを実行し、SonarCloudでカバレッジの集計をしている
- CircleCIで自動テストを並列実行を始めた
問題
SonarCloudで並列実行したときのカバレッジ結果をSonarCloudでまとめることができるか。
現状の私の結論
できる。
- jestの設定でカバレッジレポートの出力を環境変数
CIRCLE_NODE_INDEX
を使って別のファイルになるようにする - テストの実行レポートは不要と判断。SonarQubeの設定の
sonar.testExecutionReportPaths
は指定しない。 - カバレッジファイルの指定は出力を予定しているファイルすべてを指定する
Jestの設定例
coverageDirectoryを環境変数 CIRCLE_NODE_INDEX
ごとに変更することで集約したとき上書きされるのを回避する。jest.config.js
の設定例
module.exports = {
coverageDirectory: `coverage/node-${process.env.CIRCLE_NODE_INDEX}`,
}
SonarCloudの設定例
出力ディレクトリをわけた結果出力されるファイルを sonar.javascript.lcov.reportPaths
にコンマ区切りで全て指定する。出力されないファイルがあっても問題ないので、必要になりうるものは設定しておく。
16並列を想定した場合のsonar-project.properties
の設定例
sonar.javascript.lcov.reportPaths=coverage/lcov.info,coverage/node-0/lcov.info,coverage/node-1/lcov.info,coverage/node-2/lcov.info,coverage/node-3/lcov.info,coverage/node-4/lcov.info,coverage/node-5/lcov.info,coverage/node-6/lcov.info,coverage/node-7/lcov.info,coverage/node-8/lcov.info,coverage/node-9/lcov.info,coverage/node-10/lcov.info,coverage/node-11/lcov.info,coverage/node-11/lcov.info,coverage/node-12/lcov.info,coverage/node-13/lcov.info,coverage/node-14/lcov.info,coverage/node-15/lcov.info
この記事で記載してないこと
CircleCIの設定
もうちょっと詳しく
Jestに関する事情
- SonarCloudでJavaScriptのカバレッジデータはlcov形式を使う
- jestはlcov形式のカバレッジデータの出力をサポートしている
-
jest-sonar-reporterというnpmがありjestの設定を上書きしていい感じにしてくれるものがあるがすでにアーカイブされている
- そもそもファイルの出力先を変えるのにpackage.jsonを使うためロジックをかくことができない
-
jest-sonarというのもある
- 使えそうではあるが採用しなかった
- カバレッジレポート以外にテストの実行結果のレポートも出力できる
- 現時点では不要かつ出力しないことで実行時間が短縮できそうであったため、採用しなかった
SonarCloudに関する事情
- カバレッジのレポートファイルが出力されるファイルの位置を指定するSonarCloudの設定は正規表現やワイルドカードが使えそうにない
その他雑談
この記事は業務中に得たノウハウを単純化したものである。
Discussion