MavenベースのJenkinsビルドジョブを設定する方法

このチュートリアルでは、**Alibaba Cloud ECS Ubuntu 16**に**Jenkins**自動化サーバの最新版をインストールします。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/cicd-with-jenkins---part-2-use-jenkins-for-continuous-integration_593720)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

 [Alibaba Cloud Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.7a4c481cDhVGl0) 著者Liptan Biswas. [Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.7a4c481cDhVGl0)は、クラウドコミュニティ内で技術的な知識やベストプラクティスを共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

3回シリーズの[前回のチュートリアル](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717?spm=a2c65.11461447.0.0.7a4c481cDhVGl0)では、Ubuntu 16.04にJenkinsをインストールする方法を学びました。今回の詳細なチュートリアルでは、MavenベースのJenkinsビルドジョブをセットアップする方法を学びます。まず、Alibaba ECSインスタンスにApache Mavenをインストールすることから始め、次にGit、Maven、JDKを使用するようにJenkinsを設定します。次に、Mavenを使用して、MavenプロジェクトとしてサンプルのJavaウェブアプリケーションを生成します。

JenkinsはGithubや任意のGitリポジトリから自動的にソースコードを引っ張ってくることができます。このチュートリアルでは、Githubからソースを引っ張ってくるようにJenkinsを設定します。そのためには、Githubにリポジトリを設定し、サンプルMavenプロジェクトをリモートリポジトリにプッシュする必要があります。すべての設定が完了したら、最初のJenkinsビルドを手動で実行します。DevOps環境では、ビルドの自動化が重要です。シリーズの最後のチュートリアルで、さまざまなタイプのビルドトリガーとソースコードポーリングについて詳しく学びます。

#Mavenのインストール
チュートリアルの最初の部分に従ったのであれば、Jenkins のインストール中に Git と JDK をインストールしたことになります。SSH インスタンスに再びログインし、sudo ユーザーに切り替えます。Git がインストールされているかどうかは、git --version を実行することで確認できます。

```
aliyun@jenkins:~$ git --version
git version 2.7.4
```

同様に、JDKのバージョンを確認することで、JDKがインストールされているかどうかを確認します。javac -versionを実行します。

```
aliyun@jenkins:~$ javac -version
javac 1.8.0_171
```

Apache MavenはデフォルトのUbuntuリポジトリで利用可能ですが、利用可能なバージョンが古い場合があります。[Mavenのダウンロードページ](https://maven.apache.org/download.cgi?spm=a2c65.11461447.0.0.7a4c481cDhVGl0&file=download.cgi)から最新のMavenバイナリを入手してください。

`wget http://www-us.apache.org/dist/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz`

アーカイブを展開し、Mavenディレクトリ全体を/optディレクトリに移動します。

```
tar -xf apache-maven-3.5.3-bin.tar.gz
sudo mv apache-maven-3.5.3 /opt/maven
```

さて、Mavenの実行ファイルを簡単に起動できるように、PATH変数にMavenを追加します。

```
echo 'PATH="$PATH:/opt/maven/bin"' | sudo tee -a ~/.profile
source ~/.profile
```

mvn --versionを実行することで、Mavenが正常にインストールされているかどうかを確認できます。

```
aliyun@jenkins:~$ mvn --version
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T19:49:05Z)
Maven home: /opt/maven
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-122-generic", arch: "amd64", family: "unix"
```

JDK、Git、Mavenをインストールしたので、Jenkinsアプリケーションにログインし、これらのアプリケーションで動作するようにJenkinsを設定します。

#Jenkinsを設定
管理者アカウントで正常にログインできたら、Manage Jenkins >> Global Tool Configurationに移動します。グローバルツール設定インターフェイスでは、ビルドプロセス中にJenkinsが使用する様々なツールを設定することができます。JDKオプションでは、JDK 1.8などのJDKの名前を指定します。すでにJDKをインストールしているので、セレクトボックスの「自動的にインストール」のチェックを外します。Jenkinsが自動的にJavaバイナリを識別できるように、Javaのインストール先のパスを指定します。「JAVA_HOME」の値がわからない場合は、「echo $JAVA_HOME」というコマンドを実行すれば、いつでもJavaのインストールパスを取得することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b6a5ee39-dbbf-136d-4311-f9780f2a804e.png)

gitはgitコマンドを実行すれば簡単にアクセスできるので、Gitのデフォルト値のままにしておきます。下にスクロールして、Mavenのインストール設定を見つけます。後で簡単に識別できるようにMavenインストールの名前を指定し、Install automaticallyオプションのチェックを外します。Mavenを/opt/mavenにインストールしたので、"MAVEN_HOME "テキストボックスに同じパス/opt/mavenを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ee6880b0-671d-a3d3-667f-eba9160d2ba8.png)


最後に、[保存]ボタンをクリックして変更を保存します。

#サンプルMavenプロジェクトの作成
Jenkinsを設定してMavenビルドを実行するためには、まずMavenプロジェクトが必要です。Maven自体には、開発者がアプリケーションの構築を開始するためのサンプルプロジェクトを生成する機能が備わっています。今回はMavenを使ってJavaでサンプルのWebアプリケーションを生成します。Jenkinsの使い方を学習しているので、Mavenプロジェクトの詳細には触れません。アーキテクチャタイプ「maven-archetype-webapp」でMavenプロジェクトを生成します。

```
cd ~
mvn archetype:generate -DgroupId=my.maven.app -DartifactId=MyMavenApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
```

上記のコマンドは、パッケージ名「my.maven.app」、プロジェクト名「MyMavenApp」のプロジェクトを生成します。似たような出力が表示されます。

```
[INFO] Generating project in Batch mode
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/aliyun
[INFO] Parameter: package, Value: my.maven.app
[INFO] Parameter: groupId, Value: my.maven.app
[INFO] Parameter: artifactId, Value: MyMavenApp
[INFO] Parameter: packageName, Value: my.maven.app
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/aliyun/MyMavenApp
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.599 s
[INFO] Finished at: 2018-05-05T10:39:28Z
[INFO] ------------------------------------------------------------------------
```

以下のファイルで新しいプロジェクトディレクトリ「MyMavenApp」が作成されます。

```
MyMavenApp
├── pom.xml
└── src
    └── main
        ├── resources
        └── webapp
            ├── index.jsp
            └── WEB-INF
                └── web.xml
```

Mavenプロジェクトの準備ができたので、先に進み、Githubにプロジェクトの新しいリポジトリを作成します。

#MavenプロジェクトをGithubにプッシュする
Githubアカウントを開き、任意の名前で新しいリポジトリを作成します。リポジトリをファイルで初期化しないように注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f6df3c37-7d6b-980b-ed6f-702c2237f6e5.png)


「リポジトリの作成」ボタンを押すと、空のリポジトリが作成され、リポジトリへのリンクが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f8aee749-83a2-534b-96f5-187bace2bdff.png)


チュートリアルの後半で必要になるので、リポジトリへのリンクをコピーします。もう一度 SSH インスタンスに sudo ユーザーでログインします。ユーザー情報を追加してローカルの git を設定します。

```
git config --global user.name "Alibaba Cloud User"
git config --global user.email you@example.com
```

新しく作成したMavenプロジェクトディレクトリに切り替え、プロジェクトをgitリポジトリとして初期化します。

```
cd MyMavenApp
git init
```


```
aliyun@jenkins:~/MyMavenApp$ git init
Initialized empty Git repository in /home/aliyun/MyMavenApp/.git/
```

リポジトリにファイルを追加し、最初のコミットを作成します。

リモートのGithubリポジトリのURLを追加します。以下のコマンドの URL を実際の URL に置き換えてください。

`git remote add origin https://github.com/liptanbiswas/MyMavenApp.git`

git remote -v を実行してリモート元を確認します。

```
aliyun@jenkins:~/MyMavenApp$ git remote -v
origin    https://github.com/liptanbiswas/MyMavenApp.git (fetch)
origin    https://github.com/liptanbiswas/MyMavenApp.git (push)
```

すでにすべてのファイルと変更をコミットしているので、リモートリポジトリに直接プッシュすることができます。

`git push origin master`

リモートオリジンにプッシュするためのGithubの資格情報を入力する必要があります。

```
aliyun@jenkins:~/MyMavenApp$ git push origin master
Username for 'https://github.com': liptanbiswas
Password for 'https://liptanbiswas@github.com': 
Counting objects: 10, done.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 1.07 KiB | 0 bytes/s, done.
Total 10 (delta 0), reused 0 (delta 0)
To https://github.com/liptanbiswas/MyMavenApp.git
 * [new branch]      master -> master

```

変更がGithubリポジトリに反映されているか確認します。コードがGithubにアップロードされているのがわかるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8f17f4e7-92d2-063c-b522-749126bd34ec.png)

この時点で、サンプルのJavaウェブアプリケーションがGithubにアップロードされ、Jenkinsで新しいパイプラインの作成に進むことができます。

#Jenkinsプロジェクトの作成
Jenkinsアプリケーションにログインし、「新しいジョブを作成」をクリックして開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/021af94b-b269-28bb-523b-71e183b0c4cc.png)

プロジェクトに名前をつけ、プロジェクトの種類として「フリースタイル型プロジェクト」を選択します。フリースタイルタイプのプロジェクトは、最も自由度の高いタイプのプロジェクトです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d06d0e75-b7da-8aac-6541-64c58e67b0ac.png)

「OK」をクリックすると、プロジェクトが作成され、プロジェクトの設定ページに移動します。プロジェクト名とプロジェクトの説明を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ab9326a1-5659-5da3-e4aa-c619abb13591.png)

「ソースコード管理」でGitを選択し、「リポジトリURL」にGithubリポジトリへのリンクを指定します。「master」以外のブランチはなく、リポジトリへのアクセスはデフォルトの動作を使いたいので、それ以外はデフォルトのままにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/87989193-23d3-3fa3-d7dd-f1d2ab3eb432.png)

さて、下にスクロールして「ビルド」オプションを見つけます。ビルドステップの追加」ドロップダウンメニューから「トップレベルのMavenターゲットを呼び出す」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6c8ec620-d6cd-94dd-82e0-c1a99b34d9a2.png)


先ほど設定したドロップダウンからMavenのバージョンを選択し、「Gals」にクリーンパッケージを入れます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/84530813-7618-5a4e-53b2-0019a4b912b4.png)

Maven のビルドライフサイクルには、検証、コンパイル、テスト、パッケージ、検証、インストール、デプロイという特定のステップまたはフェーズがあります。ビルドのライフサイクルは、検証から始まりデプロイで終了するシーケンシャルなものです。 cleanコマンドはビルド前にワークスペースをクリーンアップし、packageコマンドは検証からパッケージ化までのフェーズでビルドプロセスを開始します。ビルドが成功すると、Mavenは "war "ファイルにWebアプリケーションをパッケージ化しているはずです。

設定を保存した後、先ほど作成したジョブのビルドジョブインターフェイスに移動します。これでビルドジョブを実行する準備ができました。

#ビルドを手動で実行する
ビルドトリガーを設定していないので、手動でビルドジョブを開始する必要があります。Build Now" ボタンをクリックしてビルドを実行します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6195346d-15a7-4674-8578-a01aa212e88f.png)

これでマニュアルビルドが起動し、"Build History "でビルドが開始されていることがわかるはずです。ボールが点滅しているのは、ビルドが実行中であることを示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/70dcc600-5010-1be1-f044-52de89933efe.png)

弊社のアプリはサンプルアプリなので、完成までに数秒もかからないはずです。ビルド番号をクリックすると、ビルドに関する詳細情報が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/158a81b1-3b01-a88f-2e2e-9c800a4ce962.png)

上記のビルド状況のスクリーンショットでは、以下のような情報を確認することができます。

1、ビルドが成功した場合は青いボール、失敗した場合は赤いボールが表示されます。
2、"コンソール出力" ページには、ビルドジョブの完全なコンソール出力ログが表示されます。
3、ビルドがいつ開始されたか、終了までにかかった時間を教えてくれます。
4、変更点の概要を表示します。今回のビルドは最初のビルドだったので、表示される変更点はありません。

ビルドジョブが正常に完了したので、アプリケーションのウォーファイルがパックアウトされているはずです。このファイルが生成されたかどうかは、このジョブのワークスペース内のファイルを参照することで確認できます。プロジェクトのメインページで「ワークスペース」リンクをクリックして、プロジェクトのファイルを閲覧します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/98282146-88f7-6483-d5d3-f4163e9eb7e9.png)

「ターゲット」ディレクトリに移動し、「MyMavenApp.war」が表示されているはずです。warファイルは、ファイルのコレクションを配布するために使用されるクロスプラットフォームのJavaウェブアプリケーションアーカイブです。このwarパッケージは、Apache Tomcatなどの任意のJavaウェブサーバにデプロイすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/54cd22f5-5f35-b0bb-7207-6ef6ad04a952.png)

ビルドを手動でトリガーする方法を学んだところで、次はビルドをトリガーする他の自動化方法を探ってみましょう。自動ビルドの一般的な方法の一つは、定期的にSCMをポーリングすることです。Jenkinsがコードの変更を検出すると、更新されたソースコードから自動的に新しいビルドをトリガーします。

#まとめ
3回シリーズのチュートリアルの第2部では、MavenをインストールしてJenkinsで動作するように設定することを学びました。また、サンプルプロジェクトを作成し、Jenkinsでビルドプロジェクトを設定しました。最後に、最初のビルドを手動で実行することに成功しました。

チュートリアルの[3番目と最後の部分](https://community.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-3%3A-use-jenkins-for-continuous-delivery_593724?spm=a2c65.11461447.0.0.7a4c481cDhVGl0)では、異なるタイプのビルドトリガーを使用してアプリケーションを自動的にビルドするようにJenkinsを設定します。また、Jenkinsを設定して、Tomcat 8のWebサーバにWebアプリケーションを自動的にデプロイするようにします。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*