CI環境構築手順 (Jenkins + SonarQube + Nexus)

# 概要
Jenkins、SonarQube、Nexusを使用してCI環境を構築する手順を記載する。

# どのようなCI環境を構築するか
- GitリポジトリにソースコードがPushされると、自動的にJenkinsがJunitテストとCheckstyle、FindBugs、SonarQubeによる静的解析を行う。
- Junitテストと静的解析の結果をJenkinsの画面で確認できる。
- GitリポジトリにライブラリモジュールがPushされると、自動的にNexusのプライベートMavenリポジトリにartifactとして登録される。

# 前提
- Linux(CentOS7)端末にCI環境を構築する。
- ビルドツールにMavenを使用する。
- バージョン管理システムにGitを使用する。
- Jenkins、SonarQube、NexusをDockerコンテナとして動作させる。

# 事前に用意しておくもの
- Gitリポジトリ
- Oracleアカウント(JDKのインストールに必要)

# 注意事項
CI環境を構築する端末に充分な容量のストレージとメモリを搭載すること。
※VMwareやVirtualBoxのデフォルト設定では不足する。

# CI環境構築手順

## Dockerのインストール
`$ yum install -y yum-utils device-mapper-persistent-data lvm2`
`$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo`
`$ yum makecache fast`
`$ yum install docker-ce`
`$ systemctl start docker`
`$ systemctl enable docker`
[【参考情報】Dockerの公式ドキュメント](https://docs.docker.com/engine/installation/)

## Jenkinsコンテナの起動
`$ docker run -p 8080:8080 -p 50000:50000 jenkins`
[【参考情報】Jenkinsの公式Dockerリポジトリ](https://hub.docker.com/_/jenkins/)

## Jenkinsの初期設定
1. ブラウザで http://XXX.XXX.XXX.XXX:8080/ にアクセスする。
2. 「Administrator password」に管理者用パスワードを入力し、「Continue」を押下する。
  - Jenkinsコンテナ起動時、コンソールに表示される「Please use the following password to proceed to installation:」の直後に管理者用パスワードが表示されている。
3. 「Install suggested plugins」を押下する。
4. 各項目に任意の値を入力し、「Save and Finish」を押下する。
5. 「Start using Jenkins」を押下する。
6. Jenkinsのトップ画面が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/b798f5c9-6b7a-d525-3a03-6da2337f815c.png)

## Jenkinsプラグインのインストール
1. サイドメニューの「Jenkinsの管理」を押下する。
2. 「プラグインの管理」を押下する。
3. 「利用可能」を押下する。
4. 以下のプラグインにチェックし、「ダウンロードして再起動後にインストール」を押下する。
  - Checkstyle Plug-in
  - FindBugs Plug-in
  - SonarQube Scanner for Jenkins
5. 「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックする。

## SonarQubeコンテナの起動
`$ docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube`
[【参考情報】SonarQubeの公式Dockerリポジトリ](https://hub.docker.com/_/sonarqube/)

## Nexusコンテナの起動
`$ docker run -d -p 8081:8081 --name nexus sonatype/nexus:oss`
[【参考情報】Nexusの公式Dockerリポジトリ](https://hub.docker.com/r/sonatype/nexus/)

## JDKのインストール
1. サイドメニューの「Jenkinsの管理」を押下する。
2. 「Global Tool Configuration」を押下する。
3. 「JDK追加」を押下する。
4. 「名前」に「JDK」と入力する。
5. 「バージョン」にCI対象のアプリケーションが使用しているJDKと同じバージョンを選択する。
6. 「Java SE Development Kitの使用許諾に同意する」にチェックする。
7. 「ユーザー名とパスワードを入力してください。」を押下する。
8. 「ユーザー名」と「パスワード」にOracleアカウントのユーザー名とパスワードを入力し、「OK」を押下する。
9. 「閉じる」を押下する。
10. 「Save」を押下する。

## Mavenのインストール
1. サイドメニューの「Jenkinsの管理」を押下する。
2. 「Global Tool Configuration」を押下する。
3. 「Maven追加」を押下する。
4. 「名前」に「Maven」と入力する。
5. 「Save」を押下する。

## SonarQubeの設定
1. サイドメニューの「Jenkinsの管理」を押下する。
2. 「システムの設定」を押下する。
3. 「Add SonarQube」を押下する。
4. 「SonarQube installations」の「Name」に「SonarQube」と入力する。
5. 「SonarQube installations」の「Server」に「 http://XXX.XXX.XXX.XXX:9000 」と入力する。
6. 「保存」を押下する。

## Jenkinsジョブの作成
1. サイドメニューの「新規ジョブ作成」を押下する。
2. 「Enter an item name」に任意のジョブ名を入力する。
3. 「フリースタイル・プロジェクトのビルド」を選択し、「OK」を押下する。
4. 「ソースコード管理」に「Git」を選択し、「リポジトリURL」にGitリポジトリのURLを入力する。
5. 「認証情報」の「追加」→「Jenkins」を押下する。
6. 「ユーザー名」と「パスワード」にGitリポジトリのユーザー名とパスワードを入力し、「追加」を押下する。
7. 「認証情報」に手順6で入力したユーザー名を選択する。
8. 「ブランチ指定子」にビルド対象のブランチ名を入力する。（例）\*/develop
9. 「ビルド・トリガ」の「SCMをポーリング」にチェックし、「スケジュール」に「H/15 \* \* \* \*」と入力する。
  - 「H/15 \* \* \* \*」と入力した場合、GitリポジトリにソースコードをPushした15分後にJenkinsジョブが起動する。
10. 「ビルド手順の追加」→「Mavenの呼び出し」を押下し、「使用するMaven」に「Maven」を選択する。
11. 「ゴール」に`site`と入力する
  - Nexusにビルド対象モジュールを登録させたい場合は`site deploy`と入力する。
12. 「ビルド後の処理の追加」→「Checkstyle警告の集計」を押下し、「集計するファイル」に「\*\*/target/checkstyle-result.xml」と入力する。
13. 「ビルド後の処理の追加」→「FindBugs警告の集計」を押下し、「集計するファイル」に「\*\*/target/findbugs.xml」と入力する。
14. 「ビルド後の処理の追加」→「JUnitテスト結果の集計」を押下し、「テスト結果XML」に「\*\*/target/surefire-reports/\*.xml」と入力する。
15. 「ビルド後の処理の追加」→「SonarQube analysis with Maven」を押下する。
16. 「SonarQube analysis with Maven」の「高度な設定」を押下する。
17. 「SonarQube analysis with Maven」の「JDK」に「JDK」を選択する。
18. 「SonarQube analysis with Maven」の「Maven Version」に「Maven」を選択する。
19. 「保存」を押下する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/04acdaf4-034d-6a9f-08e7-b9f8f4496362.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/faa8024c-2846-ecbc-6f7e-3c5ae53d0631.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/101b1997-b792-091c-3424-b49b091d1602.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/2863b6a5-e920-8094-35a6-f8762c19199c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/8516f6a5-1d44-d5cd-f220-5e95881a53b0.png)

## pom.xmlの編集
\<project\>要素内に以下の記述を追加する。

```xml:pom.xml
<reporting>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
      <version>2.17</version>
      <reportSets>
        <reportSet>
          <reports><report>checkstyle</report></reports>
        </reportSet>
      </reportSets>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>findbugs-maven-plugin</artifactId>
      <version>3.0.5</version>
      <configuration>
        <xmlOutput>true</xmlOutput>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
      <version>2.20.1</version>
    </plugin>
  </plugins>
</reporting>
```

[【参考情報】maven-checkstyle-pluginの公式ドキュメント](https://maven.apache.org/plugins/maven-checkstyle-plugin/usage.html)
[【参考情報】findbugs-maven-pluginの公式ドキュメント](https://gleclaire.github.io/findbugs-maven-plugin/usage.html)
[【参考情報】maven-surefire-report-pluginの公式ドキュメント](http://maven.apache.org/surefire/maven-surefire-report-plugin/usage.html)

Nexusにモジュールを登録させたい場合は\<project\>要素内に以下の記述も追加する。

```xml:pom.xml
<distributionManagement>
  <repository>
    <id>releases</id>
    <url>http://admin:admin123@XXX.XXX.XXX.XXX:8081/nexus/content/repositories/releases/</url>
  </repository>
  <snapshotRepository>
    <id>snapshots</id>
    <url>http://admin:admin123@XXX.XXX.XXX.XXX:8081/nexus/content/repositories/snapshots/</url>
  </snapshotRepository>
</distributionManagement>
```

# 動作確認

## JenkinsとSonarQubeの動作確認
1. GitリポジトリにCI対象ブランチのソースコードをPushする。
2. 15分後、Jenkinsトップ画面の「最新の成功ビルド」に「X 時間 Y 分 前 - #Z」と表示されることを確認する。
3. 画面右のジョブ実行ボタンを押下する。
4. 「ビルド実行状態」を見て、ジョブが終了したことを確認した後、ジョブ名のリンクを押下する。
5. 画面に「Checkstyle警告の推移」、「FindBugs警告の推移」、「テスト結果の推移」が表示されることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/47e4d4a3-bc28-f52c-78ee-75ff2dd490c7.png)
6. 「SonarQube」を押下する。
7. SonarQubeの画面にソースコードレビュー結果が表示されることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/f2f37be3-f887-c7f8-ae97-701a5e0b25d2.png)

## Nexusの動作確認
Nexusにモジュールを登録するように設定した場合は以下の動作確認を行う。

1. ブラウザで http://XXX.XXX.XXX.XXX:8081/nexus/ にアクセスする。
2. 画面左の「Repositories」を押下する。
3. モジュールのバージョンに応じて、「Releases」、または「Snapshots」のどちらかを押下する。
4. 「Browse Storage」に登録したartifactが表示されることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/bc51a67e-92a6-c858-aff4-1edbc4f49fc4.png)