Java本格入門13章をdocker上で写経する

はじめに

Java本格入門の13章「周辺ツールで品質を上げる」を写経した。
Maven使った操作はdocker上で写経したので、その時の手順を記録しておく。
誰かの役に立てば幸い。なお写経したコードはこのリポジトリにある。

準備

HTML形式のレポートを見るため、centos/httpdイメージからコンテナを起動する。

コンテナ起動

$ docker run --name javabook -h javabook -d -p 8080:80 centos/httpd

http状態確認

ブラウザでhttp://localhost:8080にアクセスして「It works!」と表示されることを確認する。

コンテナ内に入る

$ docker exec -it javabook /bin/bash

パッケージインストール

[root@javabook /]# yum install -y vim git java maven

Javamavenバージョン確認

[root@javabook /]# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
[root@javabook /]# mvn -version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "4.9.49-moby", arch: "amd64", family: "unix"

Git準備

[root@javabook /]# git config --global user.email <メールアドレス>
[root@javabook /]# git config --global user.name <ユーザ名>
[root@javabook /]# git clone https://github.com/acroquest/javabook-maven-example.git
Cloning into 'javabook-maven-example'...
remote: Counting objects: 42, done.
remote: Total 42 (delta 0), reused 0 (delta 0), pack-reused 42
Unpacking objects: 100% (42/42), done.
[root@javabook /]# cd javabook-maven-example/

これで準備終わり。書籍の内容に入る。(書籍にはEclipseの手順とMavenの手順の両方が
掲載されているが、この記事ではMavenの手順のみ記載するので、章番号はとびとび。)

13-1-2 Mavenの基本的な利用方法

[root@javabook javabook-maven-example]# mvn package
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building javabook-maven-example 1.0-SNAPSHOT
[INFO] ---------------------------------------------------
〜中略〜
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.java.book.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.191 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
〜中略〜
[INFO] Building jar: /javabook-maven-example/target/javabook-maven-example-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:13.426s
[INFO] Finished at: Tue Nov 28 14:13:10 UTC 2017
[INFO] Final Memory: 18M/157M
[INFO] ------------------------------------------------------------------------

man packageを実行するとビルドが始まって、問題なければBUILD SUCCESSが表示される。
ログを見ていて、とくに設定した覚えはないのにテストが実行されていることに気づいた。
そこでちょっと検証してみたところ、pom.xmldependencyJUnitの記載があるかつsrc/test配下にテストファイルがあると、mvn packageでテストが実行されるように見えた。
pluginではJUnitを指定しておらず、dependencyを指定しただけなのに、テストが実行されて驚いたが、そんなものなんだろうか。
mvn installを実行するとローカルリポジトリにビルド成果物が登録される。ログには以下の通り出力される。

[INFO] Installing /javabook-maven-example/target/javabook-maven-example-1.0-SNAPSHOT.jar to /root/.m2/repository/com/java/book/app/javabook-maven-example/1.0-SNAPSHOT/javabook-maven-example-1.0-SNAPSHOT.jar
[INFO] Installing /javabook-maven-example/pom.xml to /root/.m2/repository/com/java/book/app/javabook-maven-example/1.0-SNAPSHOT/javabook-maven-example-1.0-SNAPSHOT.pom

13-2-4 APIドキュメントを作成する

APIドキュメント確認

pom.xmlmaven-javadoc-pluginの設定を記述してmvn siteを実行する。
生成されたHTMLをhttpdのドキュメントルートに配置する。

[root@javabook javabook-maven-example]# cp -rp target/site/apidocs/* /var/www/html/
[root@javabook javabook-maven-example]# 

ブラウザでhttp://localhost:8080にアクセスしてAPIドキュメントを確認する。
f:id:sonomirai:20171128234402p:plain

13-3-3 Mavenによるフォーマットチェック

pom.xmlmaven-checkstype-pluginの設定を記述してmvn clean package siteを実行する。
生成されたHTMLをhttpdのドキュメントルートに配置する。

[root@javabook javabook-maven-example]# rm -rf /var/www/html/*
[root@javabook javabook-maven-example]# cp -rp target/site/* /var/www/html
[root@javabook javabook-maven-example]# 

ブラウザでhttp://localhost:8080にアクセスする。 f:id:sonomirai:20171202214806p:plain

Project ReportsのCheckstyleをクリックしてレポートを見る。けっこうErrorがある。。。 f:id:sonomirai:20171202214811p:plain

とりあえずErrorを0にするよう修正したが、あまり意味のある変更とは思えなかった。
Checkstyleの使い方は今度の課題かな。。。 f:id:sonomirai:20171202215438p:plain

13-4-4 Mavenによるバグチェック

pom.xmlにfixbugs-maven-pluginの設定を記述してmvn clean package siteを実行する。
生成されたHTMLをhttpdのドキュメントルートに配置する。

[root@javabook javabook-maven-example]# rm -rf /var/www/html/*
[root@javabook javabook-maven-example]# cp -rp target/site/* /var/www/html
[root@javabook javabook-maven-example]# 

ブラウザでhttp://localhost:8080にアクセスし、FindBugsのレポートを見る。 f:id:sonomirai:20171202220406p:plain

13-5-3 テストを実行する

書籍だとEclipseで実行しているところを、Mavenで実行してみる。
先ほどまでのリポジトリ内に、書籍に掲載されているテスト用プログラム(わざとバグを入れてある)とテストコードを作成する。
mvn clean package siteを実行するとテストがコケてビルドに失敗する。
日本語が正しく出力できていない。。。そこは今後の課題。。。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.java.book.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.101 sec
Running acroquest.java.junit.GreetingTest
Tests run: 3, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.019 sec <<< FAILURE!

Results :

Failed tests:   getMessage_\u591C\u958B\u59CB(acroquest.java.junit.GreetingTest): 
  getMessage_\u663C\u958B\u59CB(acroquest.java.junit.GreetingTest): 

Tests run: 4, Failures: 2, Errors: 0, Skipped: 0

コード修正して再実行するとテストに成功する。
JUnitの結果もCheckstyle, FindBugsと同様にレポート出力されるかと思ったが、されなかった。
実際はJUnitの結果はJenkinsで出力させることになるので、気にせず次に進む。
次の章に向けて、Gitのローカルリポジトリをリモートリポジトリにコミットしておく。

13-6-2 Jenkinsの環境を準備する

書籍だとWindowsにJenkinsをインストールしているところを、DockerのJenkinsコンテナを立ち上げて利用する。

Jenkinsコンテナ準備

Jenkinsコンテナを立ち上げて、Mavenをインストールする。

$ docker run --name javabook_jenkins -h javabook -u 0 -d -p 8081:8080 -p 50000:50000 jenkins
$ docker exec -it javabook_jenkins /bin/bash
root@javabook:/# apt-get update; apt-get install -y maven

Jenkins状態確認

ブラウザでhttp://localhost:8081にアクセスして以下の画面が表示されることを確認する。 f:id:sonomirai:20171202224921p:plain

Jenkins設定作業

書籍に掲載された方法で設定していく。(「Create First Admin User」画面は、どうもユーザが
作成できなかったので、「Continue as admin」を選択して先に進んだ。)

13-6-3 Jenkinsでビルドを実行する

書籍の手順通り設定する。ソースコードの取得元の設定では、先ほどコミットしたリモートリポジトリを設定する。 f:id:sonomirai:20171202231531p:plain

とくに問題なくビルド成功するはず。 f:id:sonomirai:20171202231754p:plain

13-6-4 Jenkinsでレポートを作成する

書籍の手順通り設定すると、Checkstyle, FindBugs, JUnit, カバレッジのレポートが出力される。
おお、こんな感じの画面を見てみたかった。よかった。 f:id:sonomirai:20171202233008p:plain

JUnitの結果もこんな感じで表示される。

f:id:sonomirai:20171202233048p:plain

さいごに

Java本格入門の13章「周辺ツールで品質を上げる」をdocker環境で写経する手順について書いた。
JavaアプリってWindows上のEclipseで開発してLinuxで動作させることが結構あると思うが、
これまで環境ごとの周辺ツールの使い方やツール同士の連携のさせ方がわかっていなかった。
13章を写経することで、その辺りの使い方がはっきり理解できてよかった。