継続的インテグレーションからのIntelliJ Inspectionsの実行
IntelliJ IDEAは、コードを書く際にIDE内でインテンションとして、コーディングを改善するための機能を提供します。Intentionsは、ソース全体のパターンのためにコードを検査するためにバッチで使用することができ、さらにはコマンドラインでの分析や継続的インテグレーションに追加することもできます。この記事では、IntelliJに搭載されている機能と、Sensei で作成したカスタムインテンションの拡張について説明します。
IntelliJ Inspections
IntelliJのインスペクション機能は、コーディング時にIDEで動的に報告されるエラーの多くを表示します。
- インターフェイスに変換可能な抽象クラスを検出します。
- ローカルにできる冗長なクラスフィールドを特定する。
- 非推奨のメソッドの使用に関する警告
- などです。
これらの検査では、IDEにマッチするコードが意図的なアクションとしてハイライトされ、しばしば関連するQuickFixが用意されています。
コードがInspectionにマッチしたときにIDEがリアルタイムでハイライトすることで、コーディングをダイナミックに改善することができます。コードの問題を特定した後、IntelliJ Intention Actionsを使用してコードをQuickFixすることで、より良いパターンを強化することができます。
インスペクション・プロフィール
検査は、IDE内からバッチとして実行することも、コマンドラインや継続的インテグレーションプロセスで実行することもできます。
IntelliJのインスペクションを一括して行うには、インスペクション・プロファイルを使用することが重要です。
IntelliJには2つのデフォルトのInspection Profilesがあります。1つはProjectに、もう1つはIDEに保存されています。
特定のプラグインやユースケースを設定するために、新しい検査プロファイルを作成することができます(例)。
- チェックスタイル・リアルタイム・スキャンのみの実行
- 特定のSensei ルールのセットを実行
- HTMLチェックの実行
プロファイルに含まれるインスペクションは、IntelliJの環境設定で有効または無効にすることができます。また、環境設定ダイアログでは、利用可能なインスペクションの範囲を簡単に知ることができます。
ツール」アイコンを使って、プロファイルを複製したり、特定のルールセットを収集するための新しいプロファイルを作成することができます。
IDEで検査プロファイルを実行する
インスペクションプロファイルは、IDE内で「Analyze ‾ Inspect Code...」メニューを使って実行できます。
分析機能では、検査を実行する範囲をコントロールすることができます。例えば、プロジェクト全体、テストソースの有無、特定のファイルセットなどです。
また、ここから検査プロファイルを管理し、特定のプロファイルの作成や設定を行うことができます。
検査範囲の指定」ダイアログで[OK]をクリックすると、IntelliJは定義された範囲内で、プロファイルで選択されたすべての検査を実行します。
IntelliJは、インスペクションを実行した結果を「Inspection Results」タブで報告します。
の Sensei Secure Code Warrior のプラグインを使用すると、カスタムコードマッチングレシピを作成することができます。Sensei はIntelliJと緊密に統合されており、これらのカスタムレシピをIntelliJ Intention Actionsのように自然に使用することができます。つまり、インスペクションとしてIntelliJに読み込まれ、インスペクションプロファイルを使ってグループ化、有効化、無効化することができます。カスタムInspection Profileを作成し、Analyze Inspect Code機能を使用することで、Sensei レシピをプロジェクト全体で一括して実行することができます。
コマンドラインから検査プロファイルを実行する
IntelliJには、JetBrainsがドキュメントしているように、コマンドラインから検査を実行する機能があります。
- https://www.jetbrains.com/help/idea/working-with-the-ide-features-from-command-line.html
私は主にmacOSを使用しており、コマンドラインからIntelliJのシングルインスタンスを実行することができます。
open -na "IntelliJ IDEA CE.app"
より簡単な実行をサポートするために、私はこれをシェルコマンドスクリプトに追加します。
vi /usr/local/bin/idea
スクリプトの内容は、IntelliJが提供する公式ドキュメントに記載されているものです。
#!/bin/sh
open -na "IntelliJ IDEA CE.app" --args "$@"
そして、コマンドラインでの検査作業を簡略化するために、この実行ファイルを作成しました。
chmod 755 /usr/local/bin/idea
intellijの公式ドキュメントでは、inpectionコマンドの一般的な形式を次のように説明しています。
idea inspect <project> <inspection-profile> <output></output></inspection-profile></project>
[<options>]</options>
実際には、私はパスを完全に修飾しており、オプションは必要ありません。
idea inspect /Users/user/GitHub/sensei-blog-examples /Users/user/GitHub/sensei-blog-examples/.idea/inspectionProfiles/senseiprofile.xml /Users/user/GitHub/sensei-blog-examples/scan-results
これは、`senseiprofile`に追加したすべての検査を実行し、その結果を`scan-results`フォルダに報告します。
検査結果の閲覧
後述するように、これらの結果を継続的インテグレーションの中から報告することができます。
また、IntelliJ自身でも「Analyse ″View Offline Inspection Results″」機能を使って見ることができます。
これにより、「Inspection Results」タブに結果が読み込まれます。
これはJetBrainsのサイトに公式に記載されています。
- https://www.jetbrains.com/help/idea/command-line-code-inspector.html#inspection-results
これは、コードレビュープロセスにおいて、コマンドライン実行が継続的インテグレーションプロセスに組み込まれていて、レビュアーが検査結果のエントリの完全なソースコンテキストをチェックしたい場合に使用されます。
継続的インテグレーションにおける検査プロファイル
コマンドライン検査を継続的インテグレーションに追加する場合、理想的にはレポートを自動的に生成したいと考えますが、そのためにはいくつかのオプションがあります。
TeamCityは、継続的インテグレーションにおける検査プロファイルをサポートしています。
-https://www.jetbrains.com/help/teamcity/inspections.html
Jenkins Warnings NGプラグインは、IntelliJ Inspectionsのコマンドライン出力をレポート形式の一つとしてサポートしています。
-https://github.com/jenkinsci/warnings-ng-plugin
-https://github.com/jenkinsci/warnings-ng-plugin/blob/master/SUPPORTED-FORMATS.md
IDEA CLI Inspector」のようなコミュニティプロジェクトは、他のCIツールでInspection Profilesの使用をサポートするために存在します。
-https://github.com/bentolor/idea-cli-inspector
JetBrainsのQodanaプロジェクトの導入により、CIプロセスにおけるInspection Profilesの未来はさらに明るいものになりました。Qodanaプロジェクトは、公式のGithub ActionsとDockerイメージを持つヘッドレス版のIntelliJです。
-https://github.com/JetBrains/Qodana
Qodanaは現在ベータ版ですが、Sensei チームは、継続的インテグレーションの一部としてSensei ルールを実行するための公式にサポートされたプラットフォームになるように監視しています。
概要
Intention Actionを使うことで、コーディングパターンを強化し、コーディング中にミスをしてもIDEですぐに修正することができます。
検査プロファイルでは、これらの情報をプロファイルにまとめ、「コードの分析と検査」アクションとしてバッチで実行することができます。これは、あるパターンに遭遇して、コードのどこかでそのパターンを見逃していないかどうかを再確認したい場合に便利です。
検査プロファイルは、コマンドラインから実行することができ、「信頼しつつ検証する」モデルをサポートする継続的インテグレーションプロセスに組み込むこともでき、偶発的なずれをキャッチすることができます。
上記はすべてIntelliJの機能で構築されており、JetBrainsはQodanaの導入により継続的インテグレーションプロセスを改善しています。
Sensei レシピはIntelliJに読み込まれ、ネイティブのインテンションアクションとして動作し、Inspection Profilesに集められ、Inspect CodeによるバッチチェックやJetBrainsの公式コマンドライン実行機能による継続的インテグレーションをサポートします。
---
IntelliJの「Preferences ‾ Plugins」(Mac)または「Settings ‾ Plugins」(Windows)から、「sensei secure code」を検索して、「Sensei 」をインストールすることができます。
コマンドラインからIntelliJでプロジェクトを実行してみたい方は、この記事で使用しているプロジェクトは、Secure Code Warrior GitHubアカウントの `sensei-blog-examples` リポジトリにあります。読者の皆様には、Sensei のルールだけを実行するプロファイルを作成することをお勧めします。ぜひ試してみてください。
https://github.com/securecodewarrior/sensei-blog-examples
についてはこちらをご覧ください。Sensei