『Jenkins実践入門』のAntプロジェクトのサンプルをMavenプロジェクトにする

#目次
* [はじめに](#init)
* [環境構成](#environment)
* [開発機へeclipse/JRE/Tomcatの準備](#pre_devlop)
* [開発機へサンプルプロジェクトをダウンロード](#pre_devlop_download)
* [Jenkinsの準備](#pre_srv_jenkins)
* [開発機へサンプルプロジェクトをダウンロード](#pre_devlop_download)
* [Jenkins Server に　Jenkinsの準備](#pre_srv_jenkins)
* [Jenkinsの初期設定](#jenkins_init_setting)
* [JOBの設定](#jenkins_job_setting)
* [ビルド後の処理追加](#jenkins_job_setting_after1)
* [開発機にてPOMファイルの編集](#jenkins_pom_edit)
* [SVNコミットする(eclipseより)](#develop_svn_commit)
* [Jenkins側でビルドの実行](#srv_jenkins_job_build)

----

<a name="init"></a>
#はじめに

『Jenkins実践入門』では、Antプロジェクトのサーブレットがサンプルで解説されている。

http://gihyo.jp/book/2011/978-4-7741-4891-5?ard=1403165090

Jenkinsでのビルドに、AntではなくMavenを使用してみたいが、残念ながら　pom.xmlファイルや設定例が掲載されていなかった。

ということで、『Jenkins実践入門』で扱われている、Antプロジェクトのサーブレットサンプル「sampleproject」を基にして
これをMavenプロジェクトに変換し、pom.xmlを編集し、JOBの設定を行ってみたので、その設定方法を紹介します。

最終構成は以下になります。
Jenkins+Maven+JUnit+CheckStyle+FindBugs+Cobertura+JavaNCSS

※pom.xmlは結構嵌まりました。

findbugsに関しては、一本必要なファイルがなかったので、追加しました。
findbugs-exclude.xml

<a name="develop_style"></a>
## 目指している開発スタイル

目指している開発スタイルは以下の様なものになります。

* eclipseでソースをコーディングして
* eclipseでテストソースをコーディングして
* subversionにソースをコミットして
* redmineに連携させて
* Jenkinsでビルドして
* coberturaでjavaコーディイング規約を自動でチェックして
* findbugsでバグの温床を事前発見して
* テストを実施して
* テストを集計し
* コードのカバレッジを調査して集計し
* ソースコードの分量を計測し
* 自動でwarファイルを作成し
* 自動でwarファイルをデプロイする

# 事前準備
<a name="environment"></a>
## 環境構成

||OS|main middleware|JDK|Maven|Subversion|Ant|
|:-----------|------------:|------------:|------------:|------------:|------------:|------------:|
|Jenkins Server  |CentOS 6.2 64bit (VMwarePlayer仮想マシン)|Jenkins -1.533- 1.567|1.6.0_37|3.2.1|1.6.11|1.9.2|
|Development PC  |Windows7 64bit|eclipse Kepler(Pleiades All in One 4.3.2.v20140321)|1.6.0_37|3.2.1||1.9.2|

<a name="pre_devlop"></a>
### 開発機へeclipse/JRE/Tomcatの準備

http://mergedoc.sourceforge.jp/index.html#/pleiades.html

Full Editionを選べばJREもTomcatもついてくる。

※一点だけ注意すべきことがある。
tools.jarをビルド時に使用するが、jenkins側と合わせるため、場所を移動しておく。（というかコピーでいい。）
jenkinsで自動インストールされるJDKのライブラリとeclipseのpleiades内包のJREのライブラリのパスが合わないため。

例）
```
C:\eclipse\pleiades-e4.3\java\lib\tools.jar
```

<a name="pre_devlop_download"></a>
### 開発機へサンプルプロジェクトをダウンロード

http://image.gihyo.co.jp/assets/files/book/2011/978-4-7741-4891-5/download/sampleproject.zip

解凍して、フォルダ名を sampleproject2 とする。（AntのProjectとは違うという意味で…）

<a name="pre_srv_svn"></a>
### Jenkins Server に　Subversionの準備

<pre>
# yum install -y subversion
</pre>

詳細は、以下を参照
http://centossrv.com/subversion.shtml

例）リポジトリとして「svnrepo1」を作成する。

<a name="pre_devlop_svn_import"></a>
### 開発機からサンプルプロジェクトをSVNリポジトリに向けてインポート

![jenkins_maven_eclipse3.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/6f072201-e155-17a4-118d-0fc992fae5ca.jpeg)

SVN URL:例）
http://jenkinsserver/svnrepo1/trunk/sampleproject2

<a name="pre_devlop_svn_checkout"></a>
### 開発機でeclipseにSVNリポジトリから該当のプロジェクトをチェックアウトする

SVNリポジトリ・エクスポローラ　パースペクティブで取り込む。

取り込んだ後、プロジェクトの構成をMavenに変換する

![eclipse_maven.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/89b4615d-89d0-6e57-955d-83964468e5ae.jpeg)


<a name="pre_srv_redmine"></a>
### Jenkins Server に　Redmineの準備（あればjenkinsとも連携できる）

詳細は、以下を参照
http://blog.redmine.jp/articles/2_5/installation_centos/

<a name="pre_srv_tomcat"></a>
### Jenkins Server に　Tomcatの準備

<pre>
# yum install -y tomcat6 tomcat6-webapps tomcat6-admin-webapps
</pre>

詳細は、以下を参照
http://kajuhome.com/tomcat6.shtml

<a name="pre_srv_jenkins"></a>
# Jenkins Server に　Jenkinsの準備

## jenkinsのダウンロード

http://jenkins-ci.org/
http://mirrors.jenkins-ci.org/war/latest/jenkins.war

## Jenkinsの起動

### 単体起動の場合

Tomcatを利用しないでも簡易的に起動できます。
デフォルトで8080ポートを使うので、利用されていないか事前に確認すること。

<pre>
# java -jar /root/tools/jenkins.war
</pre>

URL:
http://localhost:8080/

### Tomcatを利用して起動の場合

webappsにjenkins.warを配置

URL:
http://localhost:8080/jenkins/

<a name="jenkins_init_setting"></a>
## Jenkinsの初期設定

JDK、Ant、Mavenの自動インストールを設定する。

JDKに関しては、念のためJDK7とJDK6の２つをインストールしました。
ちなみに、Jenkins 1.533 ではJDKの自動インストールに失敗したため、現時点最新の Jenkins 1.567 にしました。

ちなみに、Oracleのアカウントが必要になるので、事前に取得しておくこと。

![jenkins_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/32060d18-ea8f-bf1f-4e44-c90daf8a4fd0.jpeg)


<a name="jenkins_job_setting"></a>
## JOBの設定

|JOBのプロジェクト名|sampleproject2_JOB|コメント|
|:-----------|------------:|------------:|
|Subversion リポジトリURL|http://localhost/svnrepo1/trunk/sampleproject2||
|Subversion ID|hoge||
|Subversion Password|password||
|Subversion ローカルモジュールディレクトリ|BUILD||
|Maven 使用するMaven|Maven3.2.1||
|Maven ゴール|clean cobertura:cobertura checkstyle:checkstyle package site|※実際にはひとつずつ丁寧に実行したほうがいいと思います。|

![jenkins_maven_sampleproject2_JOB5.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/12a01534-0c11-73fe-30a3-d408f357f268.jpeg)


<a name="jenkins_job_setting_after1"></a>
## ビルド後の処理追加

レポートのXMLのパスが肝です。

||file path|
|:-----------|------------:|
|checkstyle|**/target/checkstyle-result.xml|
|findbugs|**/target/findbugs.xml|
|cobertura|**/target/site/cobertura/coverage.xml|
|junit|**/target/surefire-reports/*.xml|
|javancss|**/target/javancss-raw-report.xml|

![jenkins_maven_jobsetting1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/92fa5d92-efdf-f784-19df-745c7af57a7f.jpeg)


![jenkins_maven_jobsetting2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/910b70bb-c01b-603d-f371-958a853e23de.jpeg)


<a name="jenkins_pom_edit"></a>
# 開発機にてPOMファイルの編集

試行錯誤の結果、最終的に以下の編集でうまくいきました。
（※格闘していたため、冗長な設定が一部残存していると思われますが。。。）


```xml:pom.xml
  <properties>
     <findbugs.version>2.5.2</findbugs.version>
     <checkstyle.version>2.9.1</checkstyle.version>
     <surefire.reportplugin.version>2.12.4</surefire.reportplugin.version>
     <cobertura.version>2.5.2</cobertura.version>
  </properties>
  <build>
    <sourceDirectory>src/java</sourceDirectory>
    <testSourceDirectory>src/test</testSourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
      </plugin>
      <plugin>
         <groupId>org.codehaus.mojo</groupId>
          <artifactId>cobertura-maven-plugin</artifactId>
         <version>${cobertura.version}</version>
         <configuration>
             <formats>
                 <format>xml</format>
                 <format>html</format>
             </formats>
             <instrumentation>
                 <excludes>
                     <exclude>**/*Test.class</exclude>
                 </excludes>
             </instrumentation>
         </configuration>
      </plugin>
      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>javancss-maven-plugin</artifactId>
          <version>2.0</version>
      </plugin>
    </plugins>
    <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>cobertura-maven-plugin</artifactId>
                    <version>2.5.1</version>
                    <configuration>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>cobertura</goal>
                                </goals>
                            </execution>
                        </executions>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-checkstyle-plugin</artifactId>
                    <version>2.9.1</version>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>findbugs-maven-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
            </plugins>
    </pluginManagement>
  </build>
  <reporting>
     <plugins>
        <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>findbugs-maven-plugin</artifactId>
           <version>${findbugs.version}</version>
           <configuration>
                    <effort>Max</effort>
                    <xmlOutput>true</xmlOutput>
           </configuration>
        </plugin>
        <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-checkstyle-plugin</artifactId>
           <version>${checkstyle.version}</version>
        </plugin>
        <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-report-plugin</artifactId>
           <version>${surefire.reportplugin.version}</version>
        </plugin>
        <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>cobertura-maven-plugin</artifactId>
           <version>${cobertura.version}</version>
           <configuration>
               <formats>
                   <format>xml</format>
               </formats>
           </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>javancss-maven-plugin</artifactId>
          <version>2.0</version>
        </plugin>
      </plugins>
  </reporting>
  <profiles>
    <profile>
        <id>default-tools.jar</id>
        <activation>
            <property>
                <name>java.vendor</name>
                <value>Sun Microsystems Inc.</value>
            </property>
        </activation>
        <dependencies>
            <dependency>
                <groupId>com.sun</groupId>
                <artifactId>tools</artifactId>
                <version>1.6.0</version>
                <scope>system</scope>
                <systemPath>${java.home}/../lib/tools.jar</systemPath>
            </dependency>
        </dependencies>
    </profile>
  </profiles>
  <parent>
    <groupId>org.easymock</groupId>
    <artifactId>easymock-parent</artifactId>
    <version>3.2</version>
  </parent>
  <dependencies>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>servlet-api</artifactId>
  		<version>2.5</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>jsp-api</artifactId>
  		<version>2.0</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>org.easymock</groupId>
  		<artifactId>easymock</artifactId>
  		<version>3.2</version>
  		<scope>test</scope>
  	</dependency>
  </dependencies>
```

<a name="develop_findbugs"></a>
## 開発環境に「findbugs-exclude.xml」を用意する


ダウンロード
http://code.ohloh.net/file?fid=hX9ynZAPfrJdP_eUd13nWm--fWk&cid=QYTpoM6QzVs&s=&fp=1166&mp&projSelected=true#L0

ファイル名を以下に変更する。
findbugs-exclude.xml

追加する場所は以下になります。

![jenkins_maven_eclipse1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/6f5ff18a-c469-ba70-0e6d-087f8cfe504c.jpeg)


<a name="develop_svn_commit"></a>
## SVNコミットする(eclipseより)

![jenkins_maven_eclipse2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/0d9a7a42-399d-75bc-4a32-0e98146e2bea.jpeg)


<a name="srv_jenkins_job_build"></a>
## Jenkins側でビルドの実行

![jenkins_maven_sampleproject2_JOB1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/3a9e333e-55ad-80e6-f848-cbd245f6fa04.jpeg)


<a name="srv_jenkins_job_build2"></a>
## ビルドの経過

SVNにコミットしたものを正しく取り込んでいる事を確認できる。

![jenkins_maven_sampleproject2_JOB2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/12c1687b-edcc-bf71-eb09-c480455e6165.jpeg)


後半部分

BUILD SUCCESS
Finished: SUCCESS

<pre>
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 51.149 s
[INFO] Finished at: 2014-06-19T18:35:41+09:00
[INFO] Final Memory: 52M/124M
[INFO] ------------------------------------------------------------------------
[CHECKSTYLE] Collecting checkstyle analysis files...
[CHECKSTYLE] Finding all files that match the pattern **/target/checkstyle-result.xml
[CHECKSTYLE] Parsing 1 files in /root/.jenkins/jobs/sampleproject2_JOB/workspace
[CHECKSTYLE] Successfully parsed file /root/.jenkins/jobs/sampleproject2_JOB/workspace/BUILD/target/checkstyle-result.xml of module  with 0 warnings.
[CHECKSTYLE] Computing warning deltas based on reference build #68
[FINDBUGS] Collecting findbugs analysis files...
[FINDBUGS] Finding all files that match the pattern **/target/findbugs.xml
[FINDBUGS] Parsing 1 files in /root/.jenkins/jobs/sampleproject2_JOB/workspace
[FINDBUGS] Successfully parsed file /root/.jenkins/jobs/sampleproject2_JOB/workspace/BUILD/target/findbugs.xml of module  with 0 warnings.
[FINDBUGS] Computing warning deltas based on reference build #68
[Cobertura] Publishing Cobertura coverage report...
Publishing Cobertura coverage results...
Cobertura coverage report found.
Recording test results
Finished: SUCCESS
</pre>

<a name="srv_jenkins_job_build3"></a>
## ビルドの結果表示（ビルドの画面）

CheckStyleやFindBugsの対応など行なったあとのキャプチャー画面ですが、こんな感じになります。


![jenkins_maven_sampleproject2_JOB3.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/e47a42e0-ce71-3b4a-7ede-1187b45f6755.jpeg)


<a name="srv_jenkins_job_build4"></a>
## ビルドの結果表示（JOBのプロジェクト画面）


![jenkins_maven_sampleproject2_JOB4.jpg](https://qiita-image-store.s3.amazonaws.com/0/25389/b80e5458-d97e-2bca-b5c7-e426c6243c4f.jpeg)



体裁を整え中です。。。