Qodana
The code quality platform for teams
Qodana 2023.1 アップデート情報: 柔軟なプロファイル構成やKotlin/JS IR コンパイラーへの移行サポート等
現在プレビュー段階にある Qodana は、 JetBrains が手掛けるスマートなコード品質プラットフォームです。 このパワフルな静的解析エンジンは JetBrains IDE のインスペクションをあらゆる CI パイプラインに取り込みます。リソースを膨大に使用するチェックを CI サーバー上で実行するため、開発者の労力とコンピューティングリソースの節約に役立ちます。 60 以上のテクノロジーがサポートされており、解析できるコードの行数は無制限です。
新しい Qodana リリースは主に最高品質のコードを実現できるように強化されて公開されました。 バージョン 2023.1 では、CI パイプラインの静的解析ステップに対する柔軟性が大幅に向上しています。 プロジェクトをスキャンするためのチェックをスマートに構成できる方法を導入し、最も手軽だと思われる Qodana 静的解析エンジンへのプラグインの追加方法を実装しました。
このまま以下の主な更新内容の全リストを読み進めるか、直接リンター固有の機能強化を直接ご覧ください。

主な更新内容
新しい YAML 形式による柔軟なプロファイル構成
インスペクションプロファイルは Qodana 構成の重要な要素です。 インスペクションプロファイルは Qodana がコード解析を実行中にコードに適用するインスペクション一式を定義します。
バージョン 2023.1 以降の Qodana では人間が判読できる YAML 形式でプロファイルを構成できるようになりました。これにより、インスペクションプロファイルのカスタマイズとプロジェクトの進行過程での調整がさらに簡単に行えるようになっています。 解析を微調整するためには、以下のようなオプションがあります。
- [新機能] インスペクションのグループ化とグループの管理。
- [新機能] 既存プロファイルのインクルードと新しいプロファイルの作成。
- インスペクションの有効化と無効化。
- インスペクションパラメーターのセットアップ。
- インスペクション範囲の構成。
たとえば、PHP/一般インスペクションカテゴリを使ってコードを検査する際に Qodana for PHP から PhpDeprecationInspection
インスペクションを除外できます。
name: "PHP/General without PhpDeprecationInspection" inspections: - group: "category:PHP/General" enabled: true # Enable the 'PHP/General' category - inspection: PhpDeprecationInspection enabled: false # Disable the PhpDeprecationInspection inspection
カスタムプロファイルの詳細については、ドキュメントをご覧ください。
デフォルトプロファイルの主なリファクタリング
Qodana にはデフォルトプロファイルが 2 種類あります。重要なチェックのみに使用され、プロジェクトの初回スキャンに最適な qodana.starter と、ほとんどのプロジェクトに幅広く適した事前選択済みのインスペクション一式を有効にする qodana.recommended です。
両方のプロファイルを書き直し、IDE で提供されている Default プロファイルとの整合を図りました。 この変更によって透明性が高まり、Qodana と IDE でほぼ同じインスペクションを実行できるようになったため、コード品質へのアプローチに一貫性を持たせやすくなっています。
更新された qodana.recommended プロファイルは GitHub にあります。 このプロファイルは以下のいくつかの例外を除き、IDE の Default プロファイルに一致しています。
- 解析をより軽量化するため、長時間を要する可能性のあるすべての global インスペクションが無効化されています。
- ビルドディレクトリやテストソースなどのいくつかのプロジェクトディレクトリは、デフォルトで解析対象から除外されています。
更新された qodana.starter プロファイルも GitHub にあります。 このプロファイルは qodana.recommended プロファイルから派生したもので、重要なチェックのみを実行します。 主な変更点は以下の通りです。
- コードスタイルおよびコード規則セマンティクスを伴うインスペクションが無効化されています。
- コードベースの実行不可能部分(Javadoc など)のインスペクションが無効化されています。
Qodana へのプラグインの簡単な追加方法
Qodana を拡張して JetBrains Marketplace のインスペクションプラグインを使用したい場合は、qodana.yaml
ファイルにプラグインの ID を追加するだけで実現できます。
Marketplace の最近のアップデートにより、プラグインの ID をプラグインのページから直接コピーできるようになりました。

プラグインに必要なサードパーティソフトウェアのインストール方法は以下の 2 通りがあります。
bootstrap
オプションを使用する。FROM jetbrains/qodana...
から始まるカスタムDockerfile
を作成します。GitHub で提供されている QodanaDockerfile
のサンプルを使用できます。
以下は、特に試す価値のある人気プラグインです。
- Grazie Professional。スペルチェック、文法修正、自然言語補完といったテキストの作成と編集に役立つ各種ツールを備えており、高度な自然言語記述支援を提供します。
- CheckStyle。IntelliJ IDEA 内から CheckStyle によるリアルタイムおよびオンデマンドの Java ファイルスキャンを実行できます。
- Zero Width Characters Locator。ソースコードとリソースに含まれる非表示のゼロ幅文字に関連する検出困難なバグの発生を防ぐインスペクションを追加します。
他のプラグインは JetBrains Marketplace でこちらの検索を使うと見つかります。
Qodana は現在、有料のプラグインをサポートしていません。また、現在のバージョンとは互換性のないプラグインも存在する可能性があります。 JetBrains Marketplace に、Qodana プラグインの適切な互換性チェックを今年にて導入できるよう取り組んでおります。
リンター固有の更新
Qodana の新しい JVM インスペクション
Kotlin / JS IR コンパイラーのインスペクション
Kotlin チームは Kotlin ソースコードから JavaScript への移行をサポートする新しい IR コンパイラーを導入しました。 Qodana は移行プロセスを支援して潜在的なエラーを検出するため、以下のインスペクションをサポートしています。
NonExternalClassifierExtendingStateOrProps
React の State
と Props
など、純粋な JS クラスから派生する Kotlin インターフェースとクラス(データクラスを含む)を使用すると ClassCastExceptions
が発生する場合があります。 このような例外は、このようなクラスが実際には JS に由来しているにもかかわらず、コンパイラーがこれらのクラスのインスタンスを Kotlin オブジェクトであるかのように処理しようとするために発生します。
これを解決するには、純粋な JS クラスから派生するすべてのクラスとインターフェースを外部インターフェースに変換する必要があります。 Qodana は外部分類子でない State
または Props
の拡張を使用していることを報告します。

NonVarPropertyInExternalInterface
Kotlin / JS コードの外部インターフェースのプロパティの値は js()
または jso()
でオブジェクトが作成された後にのみ割り当てられます。そのため、このようなプロパティを読み取り専用(val
)にすることはできません。 そのため、外部インターフェースのすべてのプロパティを var
に変換する必要があります。
Qodana は var
でないすべてのプロパティをハイライトし、変換できるようにします。

SpringTransactionalMethodCallsInspection
Spring フレームワークでは、コードアノテーションを使ってアプリケーションのトランザクションを管理できます。 そのトランザクションで実行されるのは、`@Transaction`
が付いたメソッドの外部呼び出しのみです。つまり、自己呼び出しで新しいトランザクションが開始されることはありません。 この新しいインスペクションを使うと、Qodana がトランザクション管理でエラーを引き起こす可能性のあるこのようなケースをハイライトします。

JUnitMixedFramework
プロジェクト内に複数のバージョンの JUnit が存在する場合、開発者が 1 つのテストケースに誤って異なるバージョンを混在させてしまうことでエラーが発生する可能性があります。 たとえば、次のコードを考察してみましょう。

このテストは JUnit4 で実行されるため、JUnit5 の BeforeEach
アノテーションは処理されず、テストは NullPointerException で失敗してしまいます。
Qodana はデフォルトでテストソースをチェックしません。そのため、このインスペクションを含めるには、以下の構成を qodana.yaml
に追加する必要があります。
include: - name: JUnitMixedFramework paths: - <path-to-tests-directory>
MathRoundingWithIntArgument
このインスペクションは、Math
と StrictMath
の round()
、ceil()
、floor()
、および rint()
メソッドへの呼び出しを報告します。 これらのメソッドを整数に対して呼び出すのは冗長であり、偶発的な整数の除算といったミスがあることを示します。

Go のサードパーティライセンス監査
オープンソースコンポーネントの使用、アウトソース開発、または GitHub などのサービスが提供するコードの再利用の場合、適切なライセンスを使用していることを確認する必要があります。 制限ライセンス付きのライブラリを誤ってソフトウェアのコードベースにインポートしたり、期限切れのライセンスを更新し忘れたりすることがあります。 このような場合、組織が評判に関わる法的なリスクにさらされる可能性があります。
このようなリスクを最小限にするため、昨年に Java、Kotlin、PHP、および JavaScript 用のライセンス監査機能を導入しました。 このリリースでは、Go のサポートを追加しています。 以下の例のように、Qodana は解析されたリポジトリに含まれる依存関係のライセンスをリストし、プロジェクトライセンスとの互換性に関わる問題について警告します。

依存関係のライセンスリストは以下のように表示されます。

.NET 関連の更新
インスペクションプロファイルがリポジトリの設定を考慮
従来、.NET リンターのインスペクションプロファイルに含まれるインスペクションの重要度設定は ReSharper から取得されるデフォルト値に基づいていました。 ただ、プロジェクトがすでに ReSharper と Rider のソリューションとプロジェクト構成レイヤーとリポジトリに保存された .editorconfig
ファイルを使用している場合、このアプローチは設定が重複してしまう原因となっていました。 つまり、このようなレイヤーに変更を適用した場合は同じ変更を Qodana YAML プロファイルにも適用しなければならなかったのです。
インスペクションプロファイルが ReSharper の設定と .editorconfig
ファイルの設定(リポジトリに存在する場合)を自動的に継承するようになりました。 手動での作業はもう必要ありません!
Qodana YAML 構成設定セクションの名前が変更
従来の qodana.yaml
構成ファイルには dot-net セクションが含まれていました。このセクションでは、開くソリューションまたはプロジェクトのほか、構成やプラットフォームのオプションを指定することができました。 このセクションは dotnet に名前が変更され、Qodana 2023.2 バージョン以降では dot-net 表記が廃止される予定です。
Qodana 2023.1 へのアップグレード方法
latest
Docker タグで Qodana を実行している場合は何も変更する必要はありません。 そうでない場合は、Qodana が使用されている CI ワークフローでバージョン 2023.1 にアップデートしてください。 既存の CI 統合についての詳細は、ドキュメントをご覧ください。
また、すべてのインスペクションが自動的に有効になるわけではありません。 特定のインスペクションを解析の対象から除外したり含めたりするには、インスペクションプロファイルをカスタマイズする必要があります。
Qodana 2023.1 のハイライトは以上です! 詳細は、リリースノートをご覧ください。 新しいリリースを気に入っていただければ幸いです。 今後のブログトピックについて提案がある場合、または Qodana がユーザーとビジネスにどのように役立つかを詳細に知りたい場合は、こちらにコメントを残すか、Twitter で弊社をタグ付けしてください。または、qodana-support@jetbrains.com でもご連絡いただけます。
コードをクリーンに保って、開発をお楽しみください!
Qodana チーム一同より
オリジナル(英語)ブログ投稿記事の作者: