読者です 読者をやめる 読者になる 読者になる

しおしお

IntelliJのあれやこれや

JenkinsでIntelliJ IDEAのinspectionを実行して結果をいい感じに表示させてみる

IntelliJさんのinsupectionはCI環境でも実行できるので、Jenkinsで実行&いい感じに結果を表示する方法を調べてみた。 *1

Jenkinsに必要なプラグイン

Warnings Plugin - Jenkins - Jenkins Wiki
IntelliJさんのinspectionの結果をいい感じに集計&表示するために必要になります。

ビルドにinspectionの実行を定義する

inspectionの実行と、inspection実行結果のファイル内のパス置き換えを行ってあげます。
実行結果ファイルのパス書き換えをしないと、指摘箇所のソースへのジャンプ時にエラーになってしまいます。

/var/jenkins_home/idea-IC-163.9166.29/bin/inspect.sh . /var/jenkins_home/my_inspection.xml ./report/inspection -d src/main/java
sed -i 's/file:\/\/\$PROJECT_DIR\$\///' ./report/inspection/*.xml

設定のイメージ的にはこんな感じです。

IntelliJプラグインをCIサーバに配置する

サードパーティ製のプラグインのInspection機能をCIサーバで実行したい場合には、プラグインをCIサーバ上にインストールする必要があります。
インストール先は、$idea.config.path/pluginsとなります。

ビルド後の手順にinspection結果の集計を追加する

下の画層のようにWarnings Pluginを使って結果の集計を行います。
集計するファイルにはinspection実行結果のファイルを指定して、パーサにはIntelliJ IDEA Inspectionsを選択します。

ジョブの実行結果

ジョブを実行するとChecstyleプラグインと同じ感じに結果が見れます。

ジョブの結果画面


指摘の一覧

指摘箇所のソースコード


ハマりポイント

CI環境にIntelliJさんのjdk設定が必要

具体的には、$idea.config.path/options/jdk.table.xmlが必要となります。
この設定がないと、下のようなメッセージがでてinspectionの実行がエラーとなってしまいます。
(他のパターンもあって、下と同じようにJDKの設定がないよ的なエラーがでます)

Please, specify sdk 'null' for module 'inspection_test_pj_main'

デスクトップ環境があれば、IntelliJを起動して、JDKの設定をしてあげるだけでOKです。
もし、デスクトップ環境がない場合には、別の環境で作ったファイルをCIの該当ディレクトリに移動する必要があります。

Warnnings pluginがエラーをはいておわってしまう

こんな感じのエラーをはいて異常終了してしまうことがあります。
これは、inspectionの結果ファイルに行数を示す要素がない場合に発生します。
例えば、パッケージ名やモジュールに対するinspection結果にはこの要素がないためエラーとなってしまいます。

エラーとなった結果ファイルは、例えばgrep -L line report/inspection/*.xmlで検索できます。
これらの結果を除外したい場合は、inspect.sh(bat)実行後に、grep -L line report/inspection/*.xml | xargs rm -rfを実行して削除してあげれば良いと思います。

ERROR: Build step failed with exception
java.lang.NumberFormatException: For input string: "-"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:572)
	at java.lang.Integer.parseInt(Integer.java:615)
	at hudson.plugins.warnings.parser.IdeaInspectionParser.parseProblems(IdeaInspectionParser.java:69)

おわり。