IntelliJにSARIFファイルを解析させてProblemsに表示する
SARIFとは
今回はThe Static Analysis Results Interchange Format (以下SARIF)についてです。
静的解析結果交換フォーマットという訳になるわけですが、世の中にある静的解析ツールの標準アウトプットフォーマットを定めたものです。
このフォーマットの読み込みにGitHub Actionsが対応しているので、ファイルをActionsでアップロードすれば解析結果をGitHubのAnnotationsとして手軽に表示できます。
MegaLinter
というツールのリファレンスにSARIF対応の一覧がありました(全部かどうかは分かりませんが、かなりの数のツールが網羅されています)。
(むしろMegaLinterに興味が沸いたことは秘密にしておくとして)
なお、SARIFの中身はJSONなので、例のごとくJSON Schemaとして仕様が公開されています。
この記事ではSARIFファイルの詳細な仕様についての説明は省きます。
IntelliJでSARIFを読み込む
SARIFファイルはQodanaプラグインに読み込ませるとProblemウィンドウで一覧の確認が可能……かと思っていたのですが、ESLintでSARIFファイルを出力した際、これが読み込まれませんでした。
ちょっと疑問に思ったので読み込めるようにできないか確認しました。
(IntelliJの場合、エディター内にESLintの指摘を表示できます。Qodanaに別途読み込ませる作業は通常不要です)
ESLintのSARIF出力
SARIFの出力はMicrosoftが様々なSDKを開発しています。
JS向けにもMicrosoftがNPMパッケージを公開しており、ESLintからSARIFフォーマットのレポートを出力するパッケージも存在しています。
今回はこれを使用します。
手順
- IntelliJでQodanaプラグインを有効もしくはインストールする
- 下記npmコマンドでESLintのSARIFフォーマッターをインストール
npm install @microsoft/eslint-formatter-sarif --save-dev ./node-modules/.bin/eslint -f @microsoft/eslint-formatter-sarif -o sarif.json yourfile.js
- 下記のコマンドを使う(QodanaでSARIFが読み込めない参照)
sed -i 's/"uri": ".*\(src\/.*\)"/"uri": "\1"/' sarif.json sed -i 's/\("artifactLocation": {\)/\1 "uriBaseId": "SRCROOT",/g' sarif.json
- IntelliJ内でsarif.jsonをダブルクリック
- ProblemsウィンドウでQodanaタブが開き、eslintのエラーが出力される
QodanaでSARIFが読み込めない
eslint-formatter-sarifで出力されたSARIFは、そのままではQodanaで読み込めません。
-
runs > results > locations > physicalLocation > artifactLocation
配下のuriをフルパスではなく、プロジェクトルートからの相対パスで記載する - uriと同一階層に
"uriBaseId": "SRCROOT"
を追加
雑ですが、下記のsedコマンドで書き換えると読み込めるようになるはずです。
sed -i 's/"uri": ".*\(src\/.*\)"/"uri": "\1"/' sarif.json
sed -i 's/\("artifactLocation": {\)/\1 "uriBaseId": "SRCROOT",/g' sarif.json
※SRCROOT
の意味するところは不明
これでsarif.jsonファイルをダブルクリックすれば、ProblemsにQodanaタブが追加され、内容がリストとして表示されます。
なお、IntelliJにはLinter等の出力をProblemsに表示する方法があります。
それがFile Watcher
です。
この機能については以前記事で上げていますので、ご興味があれば併せてご参照ください。
VS Codeでは?
VS CodeではMicrosoftからSARIFビューワー(エクステンション)が出ています。
ちなみに
GitHub Actions上ではQodanaのSARIFファイルを読み込めるのにeslint-formatter-sarifのSARIFは読み込めませんでした。
試してはいないのですが、上記のsedで変換したフォーマットであればQodanaで読み込めるのでGitHub ActionsのAnnotationsで表示できるようになるんじゃないかなーと。
以上。
Discussion