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

2021年2月15日発行
アラン・リチャードソン著
ケーススタディ

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

2021年2月15日発行
アラン・リチャードソン著
リソースを見る
リソースを見る

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

IntelliJ IDEAは、コードを書く際にIDE内でインテンションとして、コーディングを改善するための機能を提供します。Intentionsは、ソース全体のパターンのためにコードを検査するためにバッチで使用することができ、さらにはコマンドラインでの分析や継続的インテグレーションに追加することもできます。この記事では、IntelliJに搭載されている機能と、Sensei で作成したカスタムインテンションの拡張について説明します。


IntelliJ Inspections

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

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


これらの検査では、IDEにマッチするコードが意図的なアクションとしてハイライトされ、しばしば関連するQuickFixが用意されています。


Inspection Deprecated Api Usage Options(インスペクション非推奨)。


コードがInspectionにマッチしたときにIDEがリアルタイムでハイライトすることで、コーディングをダイナミックに改善することができます。コードの問題を特定した後、IntelliJ Intention Actionsを使用してコードをQuickFixすることで、より良いパターンを強化することができます。

インスペクション・プロフィール

検査は、IDE内からバッチとして実行することも、コマンドラインや継続的インテグレーションプロセスで実行することもできます。

IntelliJのインスペクションを一括して行うには、インスペクション・プロファイルを使用することが重要です。

IntelliJには2つのデフォルトのInspection Profilesがあります。1つはProjectに、もう1つはIDEに保存されています。

特定のプラグインやユースケースを設定するために、新しい検査プロファイルを作成することができます(例)。

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

プロファイルに含まれるインスペクションは、IntelliJの環境設定で有効または無効にすることができます。また、環境設定ダイアログでは、利用可能なインスペクションの範囲を簡単に知ることができます。


インスペクション Apiマーク除去の使用状況


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


プロファイルを複製するツールアイコン


IDEで検査プロファイルを実行する

インスペクションプロファイルは、IDE内で「Analyze ‾ Inspect Code...」メニューを使って実行できます。


Analyze Or Inspectコードを使用した検査プロファイルの実行


分析機能では、検査を実行する範囲をコントロールすることができます。例えば、プロジェクト全体、テストソースの有無、特定のファイルセットなどです。 


検査範囲の指定


また、ここから検査プロファイルを管理し、特定のプロファイルの作成や設定を行うことができます。


検査範囲の指定」ダイアログで[OK]をクリックすると、IntelliJは定義された範囲内で、プロファイルで選択されたすべての検査を実行します。

IntelliJは、インスペクションを実行した結果を「Inspection Results」タブで報告します。


IntelliJ インスペクションの実行結果を「インスペクション結果」タブで報告する。


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


リソースを見る
リソースを見る

著者

アラン・リチャードソン

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

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

2021年2月15日発行
アラン・リチャードソン著

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

IntelliJ IDEAは、コードを書く際にIDE内でインテンションとして、コーディングを改善するための機能を提供します。Intentionsは、ソース全体のパターンのためにコードを検査するためにバッチで使用することができ、さらにはコマンドラインでの分析や継続的インテグレーションに追加することもできます。この記事では、IntelliJに搭載されている機能と、Sensei で作成したカスタムインテンションの拡張について説明します。


IntelliJ Inspections

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

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


これらの検査では、IDEにマッチするコードが意図的なアクションとしてハイライトされ、しばしば関連するQuickFixが用意されています。


Inspection Deprecated Api Usage Options(インスペクション非推奨)。


コードがInspectionにマッチしたときにIDEがリアルタイムでハイライトすることで、コーディングをダイナミックに改善することができます。コードの問題を特定した後、IntelliJ Intention Actionsを使用してコードをQuickFixすることで、より良いパターンを強化することができます。

インスペクション・プロフィール

検査は、IDE内からバッチとして実行することも、コマンドラインや継続的インテグレーションプロセスで実行することもできます。

IntelliJのインスペクションを一括して行うには、インスペクション・プロファイルを使用することが重要です。

IntelliJには2つのデフォルトのInspection Profilesがあります。1つはProjectに、もう1つはIDEに保存されています。

特定のプラグインやユースケースを設定するために、新しい検査プロファイルを作成することができます(例)。

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

プロファイルに含まれるインスペクションは、IntelliJの環境設定で有効または無効にすることができます。また、環境設定ダイアログでは、利用可能なインスペクションの範囲を簡単に知ることができます。


インスペクション Apiマーク除去の使用状況


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


プロファイルを複製するツールアイコン


IDEで検査プロファイルを実行する

インスペクションプロファイルは、IDE内で「Analyze ‾ Inspect Code...」メニューを使って実行できます。


Analyze Or Inspectコードを使用した検査プロファイルの実行


分析機能では、検査を実行する範囲をコントロールすることができます。例えば、プロジェクト全体、テストソースの有無、特定のファイルセットなどです。 


検査範囲の指定


また、ここから検査プロファイルを管理し、特定のプロファイルの作成や設定を行うことができます。


検査範囲の指定」ダイアログで[OK]をクリックすると、IntelliJは定義された範囲内で、プロファイルで選択されたすべての検査を実行します。

IntelliJは、インスペクションを実行した結果を「Inspection Results」タブで報告します。


IntelliJ インスペクションの実行結果を「インスペクション結果」タブで報告する。


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


弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。