JetBrains製の静的コード解析ツール Qodana をGitLab CIで使う


TL;DR

設定してみたリポジトリはこちら。
- h.yoshida / qodana-sample · GitLab
- 2021/03/14時点でうごく状態のものです。今後、Qodanaはまだearly access programのサービスですのQodanaのDocker Imageのバージョン更新、GitLab Runnerのバージョン更新により動作しない可能性があります。

.gitlab-ci.ymlは以下の通り。


# 実際はstageを分けて使うのを推奨。
pages:
  stage: deploy
  image:
    name: jetbrains/qodana:2020.3-eap
    entrypoint: [""]
  script:
    - /opt/idea/bin/entrypoint --results-dir=$CI_PROJECT_DIR/qodana --save-report --report-dir=$CI_PROJECT_DIR/qodana/report
    - ls -la
    - mv qodana/report public
  artifacts:
    paths:
      - public
  only:
    - master

このような画面で解析結果が出ます。

1. about Qodana

Qodana は、JetBrains (Intellij IDEAなどの開発元)が、現在開発中の静的コード解析ツールです。

公式からDockerイメージが提供されており、このDockerイメージの中でIntellijによるコード解析が実行され、HTML形式でレポートが出力されるようになっています。

従来より、JavaではFindBugs、 SpotBugs、 PMD、 etc...のような静的チェックツールはありましたが、これらと比較すると以下のようなメリットがあると考えられます。

  • Intellij IDEAユーザであれば、手元のコード検査環境と、CI/CDでの検査を同じレベルにできる。
  • 非Intellij IDEAユーザーでも、Intellij IDEA相当のコード解析・チェックが可能。
  • Dockerイメージで提供されているため、様々なCI/CD環境に組み込むことが可能。
  • 開発言語を問わず、同じ解析ツールが使用できる (ようになる予定。現状はJava, Kotlin, PHPなどのみ対応)

2. 使い方

公式リポジトリに、各種CIサービスで使う為のサンプルが書いてあり、これに従えば動くはずです。
- JetBrains/Qodana: Source repository of Qodana Help
- Qodana/Docker at main · JetBrains/Qodana

ただし、GitLab CIで動かす場合はlatestのDocker Imageでは動かないケースがあるようです。 (そのうちlatestに取り込まれるはず)
- Make Qodana docker image more usable to use in GitLab CI : QD-638
- GitLab CI does not work with 2021.1-eap : QD-728

設定してみた

以下のリポジトリにコード、設定ファイルを配置しました。
- h.yoshida / qodana-sample · GitLab

Qodanaによるチェック結果はこちらにDeployされています。
- Qodana

以下の注意点があります。
- CI設定でキャッシュを設定していないので毎回時間がかかる。そのうち対応します。
- GitLab CIで動かした際、上記の QD-638のIssueにある内容と同じような内容を踏んで、60分間Runnerが動き続けてTime Outで強制終了した事があったので、Time Outを15分に設定しています。
- まだEAPなので動作が不安定になること可能性があるので、Runnerの稼働時間を気にする人は一応短めに設定しておいたほうがいいかもしれません。

3. 使ってみた感想、気になる点

デファクトスタンダードになるかはわかりませんが、Intellij IDEAユーザにとっては手元とCI側の検査レベルを同じにできるのがかなり良いのではないかと思います。

まだEAPなので、使用時はマニュアルと公式のYouTrackも確認しながら使う必要がありそうです

Qodana公式リポジトリ、およびJetBrainsのEAPに関する説明などは十分確認した上で使用をお願いします。

By using Qodana, you agree to the JetBrains EAP user agreement and JetBrains privacy policy. JetBrains/Qodana: Source repository of Qodana Help