📌

Qodana Community で静的コード検査

2023/08/17に公開

Qodana Community で静的コード検査

目次

Qodana って?

そもそも Qodana って何? って話ですが、JetBrains が提供している静的コード検査ツールです。

IntelliJ IDEA をはじめとする JetBrains の統合開発環境は強力な静的コード検査エンジンを内蔵しています。Qodana はこのエンジンのみを抜き出し、CLI や CI で使えるようにしたものということッぽいです。

余談ですが、.NET の JetBrains ReSharper の検査エンジンは ReSharper command line tools として提供されていて、CI で動作させられます。

Qodana Cloud などもありますが、それについてはおいおい。

Qodana Community って?

Qodana は有料の Ultimate / Ultimate Plus に加え、無料の Community も提供しています

Qodana の静的コード検査は Java だけでなく、C# や Go などの様々な言語に対応していますが、無料の Community プランで利用できるのは JVM / Android / Python のみです。かつ、Spring Boot や Django などのフレームワークには対応していません。

JetBrains の統合開発環境には無償で使えるものが用意されていますが、それに合わせている感じです。

  • IntelliJ IDEA Community Edition
  • Android Studio
  • PyCharm Community Edition

Qodana CLI で検査する

Qodana のエンジンは Docker Image で提供されています。Community とついているものだけが無料で使えます。

  • Qodana Community for JVM
  • Qodana Community for Android
  • Qodana Community for Python

セットアップ

まずは Docker Engine をインストールしてください。Windows では Docker Desktop が利用できます。

Docker Image を直接利用することもできますが、Qodana CLI を利用する方が楽なので、Qodana CLI をインストールします。公式ドキュメントの Run Qodana を参考にしてください。

Linux では次の通りです。

$ curl -fsSL https://jb.gg/qodana-cli/install | bash

検査

テスト用のプロジェクトを作成します。適当なディレクトリを作成し、問題のあるコードを含む main.py ファイルを作成します。

main.py
def hello(a):
    pass

プロジェクトのディレクトリで次のコマンドを実行します。(エンジンに Qodana Community for Python を利用しています)

$ qodana scan --linter jetbrains/qodana-python-community

次のようにトークンがどうたら言われますので、n で無視して続行します。

?  Do you want to open the team page to get the token? [Y/n]: 

初回は Docker Image のダウンロードなどで時間がかかります。

検査が完了すると、レポートを表示するか聞かれますので、y とします。

2023/08/17 04:12:19 IDE exit code: 0
2023/08/17 04:12:19 Generating HTML report ...
Generating final reports...
Done
2023/08/17 04:12:20 Sync IDEA cache from: /data/project/.idea to: /data/cache/.idea
✗  Found 1 new problems according to the checks applied

?  Do you want to open the latest report [Y/n]: 

ブラウザーが起動して、結果が表示されます。

設定ファイル qodana.yaml

一度検査をすると、qodana.yaml ファイルがカレントディレクトリに出力されます。

qodana.yaml
version: "1.0"
linter: jetbrains/qodana-python-community:2023.2

利用するエンジンが設定ファイルに含まれていますので、次回以降は qodana scan だけで OK です。

qodana.yaml では除外するファイルなどの設定できます

CLI で結果を見る

--print-problems 引数を使えば、コンソールに検査結果を表示します。

$ qodana scan --print-problems

...

NOTE PyUnusedLocalInspection
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 main.py:1:11
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    1  │ def hello(a): ←
    2  │     pass
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Parameter 'a' value is not used
✗  Found 1 new problems according to the checks applied

レポートファイル

レポートファイルのありかは qodana scan --help で調べられます。

$ qodana scan --help

...

  -o, --results-dir string              Override directory to save Qodana inspection results to (default "/home/masakura/.cache/JetBrains/Qodana/e3b0c442-e43f67c8/results")

この default のディレクトリにあります。

$ ls /home/masakura/.cache/JetBrains/Qodana/e3b0c442-e43f67c8/results
log  projectStructure  qodana-short.sarif.json  qodana.sarif.json  report

HTML レポートは report ディレクトリに、qodana.sarif.json ファイルに SARIF 形式の結果が出力されています。

最後に

とりあえず Qodana CLI をインストールして Qodana Community で静的コード検査してみました。

JetBrains IDE から実行したり、Qodana Cloud を使ったり、CI で実行したり、いろいろできるのですが、そのあたりは次回以降で。

Discussion