経緯
Kotlin 言語で Android アプリ開発をしています。こちらの文献を参考に静的解析ツールの detekt を導入しました。
これにより Gradle のタスク実行だけで静的解析ができて、レポートも出力できるようにしました。
./gradlew deteKt
レポート形式は HTML や XML がありますが、今回は標準フォーマットと称される SARIF を使うことにしました。
さらに検出された Issue を GitHub のプルリクページにコメントするために、reviewdog を導入しました。CI で reviewdog コマンドにレポートファイルの中身を標準入力すると GitHub のプルリクページに投稿してくれます。
reviewdog -f=sarif -name="detekt" -reporter=github-pr-review < app/build/reports/detekt/detekt.sarif
しかしこのプロジェクトはマルチモジュールなので複数のレポートファイルが出力されます。
find . -type f -name detekt.sarif
./common/build/reports/detekt/detekt.sarif
./feature/home/build/reports/detekt/detekt.sarif
./androidApp/build/reports/detekt/detekt.sarif
./data/remote/build/reports/detekt/detekt.sarif
このままでは reviewdog コマンドに入力できないです。よって複数の SARIF ファイルを1ファイルに統合する方法を紹介します。
複数の SARIF ファイルを1つのファイルに統合する方法
マイクロソフト社が sarif-multitool というコマンドラインツールを OSS でリリースしています。nodejs で作られているので npx コマンドで動かせます。
それを find コマンドと合わせて使い、このようなコマンドで複数の SARIF ファイルを1つのファイルに統合できます。
find . -type f -name detekt.sarif -exec npx @microsoft/sarif-multitool merge {} +
merged.sarif
というファイルが作られるので、それを標準入力で reviewdog コマンドに渡せば良いです。
reviewdog -f=sarif -name="detekt" -reporter=github-pr-review < merged.sarif
補足
Gradle でなく jar ファイルをダウンロードして、それを実行する場合は、マルチモジュールプロジェクトでもレポートファイルは1つになります。
find コマンドの -exec
と {} +
については、こちらの記事が参考になります。