ブログ

継続的インテグレーションからのIntelliJインスペクションの実行

February 15, 2021
アラン・リチャードソン
ノートパソコンでコードを入力する手元と、「Senseiでセキュアコーディングをマスターしよう」というテキスト。

CI(継続的インテグレーション)からのIntelliJインスペクションの実行

IntelliJ IDEAには、コーディング中に「インテンション」としてコードの改善を支援する機能が備わっています。インテンションはバッチ処理として使用することで、ソースコード全体からパターンを検査したり、コマンドライン分析に拡張したり、CIに組み込んだりすることが可能です。本記事では、IntelliJ標準の機能と、Senseiで作成したカスタムインテンションによる拡張について解説します。

‍

IntelliJインスペクション

IntelliJのインスペクション機能は、コーディング中にIDEで動的に報告される多くのエラー表示を制御しています。例:

  • インターフェースに変換可能な抽象クラスの検出、
  • ローカル変数に置き換え可能な冗長なクラスフィールドの特定、
  • 非推奨メソッドの使用に関する警告、
  • など。


これらのインスペクションは、一致するコードをIDE上でインテンションアクションとして強調表示し、多くの場合、クイックフィックス(修正案)を提示します。


Inspection Deprecated Api Usage Options


コードがインスペクションに一致した際のリアルタイムなハイライト表示は、コーディングの動的な改善に役立ちます。コード内の問題を特定した後、IntelliJのインテンションアクションを使用してクイックフィックスを適用することで、より良いコーディングパターンを定着させることができます。

インスペクションプロファイル

インスペクションは、IDE内からのバッチ実行だけでなく、コマンドラインやCIプロセスからも実行可能です。

IntelliJのインスペクションをバッチ処理で活用する鍵は、「インスペクションプロファイル」の使用にあります。

IntelliJには、プロジェクトに保存されるものとIDEに保存されるものの、2つのデフォルトのインスペクションプロファイルがあります。

特定のプラグインやユースケースに合わせて、新しいインスペクションプロファイルを作成することも可能です。例:

  • Checkstyleのリアルタイムスキャンのみを実行
  • 特定のSenseiルールセットを実行
  • HTMLチェックを実行

プロファイル内のインスペクションは、IntelliJの環境設定から有効化または無効化できます。環境設定ダイアログは、利用可能なインスペクションの範囲を確認するのにも便利です。


Inspections Usage Of Api Marked For Removal


「ツール」アイコンを使用すると、プロファイルを複製して新しいプロファイルを作成し、特定のルールセットをまとめることができます。


Tool Icon To Duplicate A Profile


IDEでのインスペクションプロファイルの実行

インスペクションプロファイルは、IDEのメニューから「Analyze(解析)」>「Inspect Code...(コードのインスペクション)」を選択して実行できます。


Run An Inspection Profile Using The Analyze Or Inspect Code


解析機能を使用すると、インスペクションを実行する範囲(プロジェクト全体、テストソースの含める/除外、特定のファイルセットなど)を制御できます。


Specify Inspection Scope


ここからインスペクションプロファイルを管理し、特定のプロファイルを作成または構成することも可能です。


「Specify Inspection Scope(インスペクション範囲の指定)」ダイアログで「OK」をクリックすると、IntelliJは定義された範囲全体に対して、プロファイル内で選択されたすべてのインスペクションを実行します。

IntelliJは、インスペクションの実行結果を「Inspection Results(インスペクション結果)」タブに表示します。


IntelliJ Report The Results Of Running The Inspections In Inspection Results Tab


Secure Code WarriorのSenseiプラグインを使用すると、カスタムコードマッチングレシピを作成できます。SenseiはIntelliJと密接に統合されており、これらのカスタムレシピをIntelliJのインテンションアクションと同じくらい自然に使用できます。つまり、レシピはインスペクションとしてIntelliJに読み込まれ、インスペクションプロファイルを使用してグループ化、有効化、無効化が可能です。カスタムインスペクションプロファイルを作成し、「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の公式ドキュメントでは、インスペクションコマンドの一般的な形式は次のように説明されています:

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`フォルダに出力されます。

Computer file explorer showing scan-results folder with multiple XML files and output.json file.


インスペクション結果の確認

後述するように、これらの結果は継続的インテグレーション(CI)環境からレポートすることも可能です。

また、IntelliJの「分析」>「オフラインインスペクション結果の表示...」機能を使用して、IDE内で直接確認することもできます。


Analyze View Offline Inspection Results


これにより、結果が「インスペクション結果」タブに読み込まれます。


Loads Results Into The Inspection Results Tab


詳細については、JetBrainsの公式サイトで公式にドキュメント化されています:

- https://www.jetbrains.com/help/idea/command-line-code-inspector.html#inspection-results


コマンドライン実行をCIプロセスに組み込んでいる場合、コード レビューの過程で、レビュアーがインスペクション結果の各項目についてソースコードの全コンテキストを確認したいときに役立ちます。

CIにおけるインスペクションプロファイル

コマンドラインインスペクションをCIに追加する際は、レポートが自動的に生成されるのが理想的であり、そのための選択肢はいくつか存在します。

TeamCityは、CIにおけるインスペクションプロファイルを標準でサポートしています。

- https://www.jetbrains.com/help/teamcity/inspections.html


JenkinsのWarnings NGプラグインは、IntelliJインスペクションのコマンドライン出力をレポート形式の一つとしてサポートしています。

- https://github.com/jenkinsci/warnings-ng-plugin

- https://github.com/jenkinsci/warnings-ng-plugin/blob/master/SUPPORTED-FORMATS.md


他のCIツールでインスペクションプロファイルを利用できるようにするためのコミュニティプロジェクト(例:`idea CLI Inspector`)も存在します。

- https://github.com/bentolor/idea-cli-inspector


CIプロセスにおけるインスペクションプロファイルの将来は、JetBrains Qodanaプロジェクトの登場によりさらに明るいものとなっています。QodanaはIntelliJのヘッドレス版であり、公式のGitHub ActionsやDockerイメージが提供されています。

- https://github.com/JetBrains/Qodana


Qodanaは現在ベータ版ですが、Senseiチームは、継続的インテグレーション(CI)の一部としてSenseiルールを実行するための正式にサポートされたプラットフォームとなるよう、その動向を注視しています。


概要

インテンションアクションを使用すると、コーディングパターンを強化し、コーディング中のミスをIDE上で迅速に修正できます。

インスペクションプロファイルを使用すると、これらをプロファイルにまとめて、「コードの解析と検査」アクションとしてバッチ実行できます。これは、特定のパターンに遭遇した際に、コード内の他の場所で見落としがないか再確認したい場合に便利です。

インスペクションプロファイルはコマンドラインから実行でき、継続的インテグレーションプロセスに組み込むことも可能です。「信頼し、かつ検証する」モデルをサポートし、意図しないミスを未然に防ぎます。

上記はすべてIntelliJの組み込み機能であり、JetBrainsはQodanaの導入により、継続的インテグレーションプロセスをさらに改善しています。


SenseiレシピはIntelliJに読み込まれるとネイティブのインテンションアクションとして機能し、インスペクションプロファイルに収集されます。これにより、「コードの検査」によるバッチチェックや、JetBrains公式のコマンドライン実行機能による継続的インテグレーションのサポートが可能になります。

---


SenseiはIntelliJ内の「Preferences \ Plugins」(Mac)または「Settings \ Plugins」(Windows)からインストールできます。「sensei secure code」で検索してください。

IntelliJプロジェクトをコマンドラインから実行してみたい場合は、本記事で使用したプロジェクトをSecure Code WarriorのGitHubアカウントにある`sensei-blog-examples`リポジトリから入手できます。練習として、Senseiルールのみを実行するプロファイルを作成してみてください。ぜひ挑戦してみましょう。


https://github.com/securecodewarrior/sensei-blog-examples

Senseiについて詳しく見る


タグライン

AI主導の開発をリリース前にガバナンスする

AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。

デモを予約する
リソースライブラリ

他のブログ記事を見る

セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。

すべて表示
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

セキュリティ文化の統一:Sageはいかにしてチャンピオンプログラムを構築したか

Sageがどのようにして柔軟かつ関係性を重視したアプローチでセキュリティを強化し、200名以上のセキュリティチャンピオンを育成して、目に見えるリスク低減を実現したのかをご紹介します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

2026年サイバーセキュリティ意識向上月間:企業防衛に不可欠なAIセキュリティの理解

主要なAI企業の多くが、安全対策が追いつくまでの間、AI開発を世界的に減速させるよう公に呼びかける事態となっています。しかし現実には、深刻なセキュリティ問題はすでに顕在化しています。AI導入に伴う金銭的コストやリスクが増大し続ける中、多くのセキュリティリーダーや経営陣は差し迫った状況に追い込まれています。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

イネーブラー8:プログラムのブランディング

セキュアコーディングプログラムを成功させるには、優れたコンテンツ以上のものが必要です。イネーブラー8では、ブランディングによって参加を「憧れのステータスを得る体験」へと変える方法を解説します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

すべての従業員が今、AIサイバーセキュリティの最前線に立っている

エンタープライズテクノロジーの状況は、手遅れになるまで誰も予測できなかったほどの速さで変化しています。私たちは今、人間が書いたコードと基本的なコパイロット支援の時代から、エージェント型開発ライフサイクル(ADLC)の時代へと正式に足を踏み入れました。自律型AIエージェントは、複数の機能にわたってかつてない効率性をもたらす一方で、全く新しい種類のセキュリティリスクや規制リスクも引き起こしています。

詳細はこちら

AIを活用した開発をリリース前にセキュアに

開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。

デモを予約する
該当する項目が見つかりません。