📘

IntelliJにSARIFファイルを解析させてProblemsに表示する

2022/12/08に公開

SARIFとは

https://SARIFweb.azurewebsites.net/

今回はThe Static Analysis Results Interchange Format (以下SARIF)についてです。
静的解析結果交換フォーマットという訳になるわけですが、世の中にある静的解析ツールの標準アウトプットフォーマットを定めたものです。
このフォーマットの読み込みにGitHub Actionsが対応しているので、ファイルをActionsでアップロードすれば解析結果をGitHubのAnnotationsとして手軽に表示できます。

MegaLinterというツールのリファレンスにSARIF対応の一覧がありました(全部かどうかは分かりませんが、かなりの数のツールが網羅されています)。
(むしろMegaLinterに興味が沸いたことは秘密にしておくとして)

https://megalinter.io/v6-alpha/

なお、SARIFの中身はJSONなので、例のごとくJSON Schemaとして仕様が公開されています。

https://json.schemastore.org/SARIF-2.1.0-rtm.5.json

この記事ではSARIFファイルの詳細な仕様についての説明は省きます。

IntelliJでSARIFを読み込む

SARIFファイルはQodanaプラグインに読み込ませるとProblemウィンドウで一覧の確認が可能……かと思っていたのですが、ESLintでSARIFファイルを出力した際、これが読み込まれませんでした。

ちょっと疑問に思ったので読み込めるようにできないか確認しました。

(IntelliJの場合、エディター内にESLintの指摘を表示できます。Qodanaに別途読み込ませる作業は通常不要です)

ESLintのSARIF出力

SARIFの出力はMicrosoftが様々なSDKを開発しています。

https://github.com/orgs/microsoft/repositories?language=&q=sarif&sort=&type=all

JS向けにもMicrosoftがNPMパッケージを公開しており、ESLintからSARIFフォーマットのレポートを出力するパッケージも存在しています。
今回はこれを使用します。

https://www.npmjs.com/package/@microsoft/eslint-formatter-sarif

手順

  1. IntelliJでQodanaプラグインを有効もしくはインストールする
  2. 下記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
    
  3. 下記のコマンドを使う(QodanaでSARIFが読み込めない参照
    sed -i 's/"uri": ".*\(src\/.*\)"/"uri": "\1"/' sarif.json
    sed -i 's/\("artifactLocation": {\)/\1 "uriBaseId": "SRCROOT",/g' sarif.json
    
  4. IntelliJ内でsarif.jsonをダブルクリック
  5. ProblemsウィンドウでQodanaタブが開き、eslintのエラーが出力される

QodanaでSARIFが読み込めない

eslint-formatter-sarifで出力されたSARIFは、そのままではQodanaで読み込めません。

  1. runs > results > locations > physicalLocation > artifactLocation配下のuriをフルパスではなく、プロジェクトルートからの相対パスで記載する
  2. 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です。
この機能については以前記事で上げていますので、ご興味があれば併せてご参照ください。

https://zenn.dev/naoyukik/articles/537f020909e2eae5155b#file-watcher

VS Codeでは?

VS CodeではMicrosoftからSARIFビューワー(エクステンション)が出ています。

https://marketplace.visualstudio.com/items?itemName=WDGIS.MicrosoftSarifViewer

ちなみに

GitHub Actions上ではQodanaのSARIFファイルを読み込めるのにeslint-formatter-sarifのSARIFは読み込めませんでした。
試してはいないのですが、上記のsedで変換したフォーマットであればQodanaで読み込めるのでGitHub ActionsのAnnotationsで表示できるようになるんじゃないかなーと。

以上。

Discussion