Mavenプロジェクトへの静的解析ツール(JaCoCo/FindBugs/Checkstyle）導入メモ

# やりたいこと
Mavenをビルドする際に、下記のような静的解析を実行する。
また、Jenkinsにて解析結果を可視化させる。

* ユニットテストのカバレッジレポーティング
* コードのバグ解析
* コードスタイルの解析

# 1. Mavenプラグインの設定
## 1.1 JaCoCo
```xml:pom.xml
<!-- プラグインの追加 -->
<plugins>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.2</version>
        <executions>
            <execution>
                <id>default-prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>default-report</id>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
            <execution>
                <id>default-check</id>
                <goals>
                    <goal>check</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

<!-- reporting設定 -->
<reporting>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <reportSets>
                <reportSet>
                    <reports>
                        <!-- select non-aggregate reports -->
                        <report>report</report>
                    </reports>
                </reportSet>
            </reportSets>
       </plugin>
    </plugins>
</reporting>

```

JaCoCoプラグインを設定後、テストコマンドを実行すると*target*直下に*jacoco.exec*が生成される。
その後、JaCoCoのレポート出力コマンドを実行すると*target/site/jacoco*直下に*jacoco*のユニットテストのカバレッジレポートのhtmlファイルが生成される。

```shell
$ mvn clean test
$ mvn jacoco:report
# 下記コマンドでテスト実行からレポートhtml出力までを一気に行うことも可能
$ mvn jacoco:prepare-agent test jacoco:report
```

* https://www.jacoco.org/jacoco/trunk/doc/maven.html
* https://www.jacoco.org/jacoco/trunk/doc/examples/build/pom.xml

## 1.2. FindBugs

```xml:pom.xml
<!-- プラグインの追加 -->
<plugins>
   <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>findbugs-maven-plugin</artifactId>
       <version>3.0.5</version>
   </plugin>
</plugins>

<!-- reporting設定 -->
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <configuration>
                <xmlOutput>true</xmlOutput>
                <xmlOutputDirectory>target/site</xmlOutputDirectory>
            </configuration>
        </plugin>
    </plugins>
</reporting>
```

findbugs:findbugsコマンドを実行することで、*target*直下に実行結果の*findbugsXml.xml*が出力される。
また*target*ファルダに*findbugsXml.xml*が出力されている状態でsiteコマンドを実行することで、*targe/site*直下にhtml形式のレポートが出力される。
※siteコマンドを実行するためには*maven-site-plugin*が必要となるので注意すること。

```shell
# findbugsXml.xmlの出力
$ mvn clean test findbugs:findbugs
# htmlファイルの出力
$ mvn site
```

* http://findbugs.sourceforge.net/
* https://gleclaire.github.io/findbugs-maven-plugin/usage.html

## 1.3. Checkstyle

```xml:pom.xml
<!-- プラグインの追加 -->
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
            <execution>
                <id>validate</id>
                <phase>validate</phase>
                <configuration>
                    <!-- プロジェクト直下にスタイル定義を格納し、指定する -->
                    <configLocation>project-checkstyle.xml</configLocation>
                    <encoding>UTF-8</encoding>
                    <consoleOutput>true</consoleOutput>
                    <failsOnError>true</failsOnError>
                    <linkXRef>false</linkXRef>
                </configuration>
                <goals>
                    <goal>check</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

<!-- reporting設定 -->
<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <reportSets>
                <reportSet>
                    <reports>
                        <report>checkstyle</report>
                    </reports>
                </reportSet>
            </reportSets>
        </plugin>
    </plugins>
</reporting>
```

*\<configLocation\>*にプロジェクトで使用するスタイル定義を指定する。
Javaプログラムのスタイル定義として「[Google Style](https://google.github.io/styleguide/javaguide.html)」と「[Sun Style](http://checkstyle.sourceforge.net/sun_style.html)」がある。
それぞれのスタイルの差は[【別の方】](https://qiita.com/kazokmr/items/7ff3371c68da7e0a6765)がまとめているのでそちらを参照すること。実際の開発ではダウンロードしたスタイル定義をプロジェクト独自定義にカスタマイズして利用する。

スタイル定義は以下のリンクからダウンロードする。

* [Google Check Style XML定義](https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml)
* [Sun Check Style XML定義](https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/sun_checks.xml)

※Google StyleのバージョンとCheckstyleのバージョンが一致しない場合、スタイル定義の解析エラーとなることがあるため、利用するバージョンに注意すること。maven-checkstyle-pluginとCheckstyleのバージョン表は[【ここ】](https://maven.apache.org/plugins/maven-checkstyle-plugin/history.html)を参照すること。

checkstyle:checkstyleコマンドを実行することで、スタイルチェック結果が*target*直下に*checkstyle-result.xml*として生成される。また、*target/site*直下にhtml形式のレポートが出力される。

```shell
$ mvn checkstyle:checkstyle
```

* https://maven.apache.org/plugins/maven-checkstyle-plugin/check-mojo.html


# 2. Jenkinsでのジョブレポート出力
## 2.1. Jenkinsプラグインのインストール
サイドメニューの[Jenkinsの管理]->[プラグインの管理]から[利用可能]タブを選択し、下記のプラグインをインストールする。

* [JaCoCo plugin](https://wiki.jenkins.io/display/JENKINS/JaCoCo+Plugin)
* [FindBugs plugin](https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin)
* [Checkstyle plugin](https://wiki.jenkins.io/display/JENKINS/Checkstyle+Plugin)

## 2.2. ジョブの設定
### 2.2.1 シェル実行コマンドの修正
ジョブが「フリースタイル・プロジェクトのビルド」で作成されている場合、ジョブ設定から[ビルド]->[シュルの実行]のシェルスクリプトを下記の通り修正する。パイプラインの場合はJenkinsファイル等のシェルコマンドを修正する。

```shell
$ mvn clean package findbugs:findbugs
``` 

### 2.2.2. JaCoCo/FindBugs/Checkstyleレポートの追加設定
Jenkinsジョブにビルド後の処理を追加する。
Jenkinsジョブの設定画面を開き、一番下の[ビルド後の処理の追加]を選択し、下記を追加する。

* JaCoCoカバレッジレポートを記録
* Publish Checkstyle analysis results
* Publish FindBugs analysis results

各プラグインの設定画面が表示されるので、プロジェクト構成に合った設定値を入力する。
JaCoCoの場合、jacoco.execなどのビルド出力ファイルのパスを指定する。
FindBugs/Checkstyleの場合は「集計するファイル」を設定する。

![ビルド後の処理設定.png](https://qiita-image-store.s3.amazonaws.com/0/177076/17679740-c273-1eac-5242-17840832619a.png)

各種プラグインの設定を行わない場合、デフォルト設定されているパスのファイルを集計対象として処理される。
pom.xmlで出力先ファイル名やディレクトリを独自に設定している場合、ファイルのパスを個別に設定すること。

### 2.2.3. ビルド結果のレポート
各種設定後、ジョブを実行すると下記のようなレポートがビルド結果やジョブのトップ画面に表示される。

![ジョブ実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/177076/6a9d31eb-0a12-70c0-2e8a-4fa087031e5d.png)

![ジョブ実行結果2.png](https://qiita-image-store.s3.amazonaws.com/0/177076/a071eecd-e87e-6a0f-f17b-c36132c5f738.png)