ビルドジョブを自動化するためのJenkinsの設定方法

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

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

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

3部構成の前回のチュートリアルシリーズでは、[Ubuntu 16.04にJenkinsをインストールする方法](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717?spm=a2c65.11461447.0.0.14f0360a9F8Tkl)を見て、[Mavenを使ってサンプルのJavaアプリケーションを作成](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-2%3A-use-jenkins-for-continuous-integration_593720?spm=a2c65.11461447.0.0.14f0360a9F8Tkl)しました。また、サンプルのWebアプリケーションを構築するためにJenkinsでビルドジョブを作成し、最初のビルドジョブを正常に実行しました。

このシリーズ最後のチュートリアルでは、ビルドジョブを自動化するためにJenkinsを設定します。また、Jenkinsを設定してWebアプリケーションをTomcatのWebサーバに自動的に配信することで、継続的な配信の基本を見ていきます。

#自動ビルドの設定
Jenkinsのダッシュボードから、サンプルジョブ「MyMavenApp」をクリックして、ジョブのステータスページを開きます。次に、「構成」リンクをクリックして、ビルドジョブの構成を開きます。下にスクロールして「Build Triggers」セクションを見つけます。このセクションには、ビルドトリガーに複数のオプションがあることがわかります。ここでは、"Poll SCM "オプションのみに注目します。チェックボックスを選択すると、ポーリングスケジュールを入力するテキストボックスが表示されます。Jenkinsでのスケジュールの設定は、少し修正したcron構文を使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b9ad7414-f868-fdaf-8fd3-b17676d2713c.png)

cronの構文は以下の通りです。

```
MINUTE HOUR DATE MONTH DAY
MINUTE - Minutes in an hour, (0 to 59)
HOUR   - Hour of the day, (0 to 23)
DATE   - Date of the month, (1 to 31)
MONTH  - Month of the year, (1 to 12)
DAY    - Day of the week, (0 to 7), 0 and 7 both are Sundays

Examples.
0 20 * * *     At 20:00 every day
0 4 * * 0      At 04:00 on every Sunday
0 22 * * 1-5   At 22:00 on every day-of-week from Monday through Friday
```

上のスクリーンショットでは、5分ごとにソースの変更をポーリングするH/5を使用しています。本番環境では、6時間ごとなど、あまり頻繁ではない期間で変更をポーリングしたいかもしれません。これを実現するためにH /6を使用することができます。cronスケジュールを提供したら、設定を保存します。サイドバーに "Git Polling Log "という名前の新しいオプションが追加されているのがわかります。このオプションを使って、前回のGitポーリングを知ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/64b028e0-ddb0-5a83-838e-4c8fc82989e7.png)

ソースコードに変更があった場合に Jenkins が自動ビルドを起動しているかどうかを確認するために、コードに変更を加えてみます。すべてが正常に動作していれば、次のgit pollで変更を検知します。変更が検出されると、Jenkins が自動ビルドを開始します。

ECSインスタンスのターミナルにsudoユーザーでログインします。Mavenサンプルプロジェクトを作成したディレクトリに切り替えます。

`cd ~/MyMavenApp`

プロジェクト内のJSPファイルを編集し、コンテンツを追加します。ボディタグに「I love Alibaba Cloud」という行を追加することができます。目的は、ファイルの中にいくつかの変更を加えるだけです。

`nano src/main/webapp/index.jsp`

ファイルを保存したら、以下のコマンドで更新したファイルをgitに追加します。

`git add .`

では、変更した内容をプロジェクトにコミットします。

`git commit -m "Updated index.jsp”`

以下のような出力が表示されるはずです。

```
aliyun@jenkins:~/MyMavenApp$ git add .
aliyun@jenkins:~/MyMavenApp$ git commit -m "Updated index.jsp"
[master 4e5e2ce] Updated index.jsp
 1 file changed, 1 insertion(+)
```

変更内容をリモートのGithubリポジトリにプッシュします。

`git push origin master`

コードをリモートリポジトリにプッシュしたら、Jenkinsのジョブに戻り、Webページを更新し続けます。5分ごとにSCMの変更をポーリングするようにJenkinsを設定しているので、Jenkinsが変更を検出してビルドを開始するのにそれほど時間はかかりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/17b28701-680a-0c90-b430-e2f3b60280a0.png)

ビルドの情報はビルドステータスページでも確認できます。index.jspに変更が発生し、SCMの変更によってビルドが開始されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5dc3979b-78f0-de4b-782b-5a4e6486ac40.png)

#スクリプトによるビルドのトリガー
また、Webブラウザを介して、またはスクリプトから特別な事前定義されたURLを呼び出すことでビルドをトリガーすることもできます。このタイプのビルドトリガーは、スクリプトからビルドをトリガーする必要がある場合に便利ですし、ソースコントロールシステムのフックスクリプトで使用することもできます。URL からのビルドを有効にするには、作成した Maven ジョブの設定ページに移動します。下にスクロールして「ビルドトリガー」セクションを見つけます。スクリプトからのビルドトリガーを認証するために使用するランダムな認証トークンの秘密を提供します。ビルドをトリガーするには、この秘密の認証トークンを提供することが必須です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/cc830a10-f92b-bd01-88dd-12bc0d2721e5.png)

設定を保存した後、以下のURLにアクセスすることで簡単にビルドをトリガーすることができます。

`JENKINS_URL/job/PROJECT_NAME/build?token=TOKEN_NAME`

例えば、私の場合、ビルドURLは以下のようになります。

`https://jenkins.example.com/job/MyMavenApp/build?token=Random_ToKen`

また、メッセージと一緒にパラメータの原因を追加することで、コメントやビルドの原因を追加することもできます。例えば、以下のようになります。

`https://jenkins.example.com/job/MyMavenApp/build?token=Random_ToKen&cause=Invoked+from+browser`

下のスクリーンショットは、URLからビルドを起動した際のスクリーンショットで、リモートホストのIPアドレスからビルドが開始されていることがわかります。また、ビルドを開始する際に添付されたメモも表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9d0eff05-285e-cdc4-833e-aaaa43f2994e.png)

#その他のビルド方法
Jenkinsがサポートしているビルドトリガーは他にもいくつかあります。

他のプロジェクトがビルドされた後にビルドする。この方法では、他のプロジェクトのビルドが終了したときにJenkinsがビルドをトリガーします。例えば、以下のスクリーンショットでは、"SomeOtherProject "という名前の別のプロジェクトがビルドを終了し、ビルドが安定したらすぐに "MyMavenApp "をトリガーするように指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/33b63882-8c81-5196-57dd-7fceb7d74fc3.png)

定期的にビルドします。このメソッドを使用すると、プロジェクトの定期的なビルドをトリガーすることができます。ソースコードに変更があるかどうかは関係ありません。トリガーのスケジュールは、cron構文を使って設定する必要があります。cron構文の詳細については、上で説明したPoll SCMメソッドを参照してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6551807b-79ab-e71d-4763-fb47b845f51f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9a877039-1e6b-bf12-545c-1351cdce4502.png)


#Jenkinsによる継続的なデリバリー
継続的デリバリーとは、ソフトウェアの新しいバージョンを自動的に、より頻繁にユーザーにリリースすることを目的としたDevOpsのアプローチです。

新しいバージョンのソフトウェアを継続的に配信する方法を学ぶために、Jenkinsを使って継続的インテグレーションを行う方法を学ぶ際に使用したのと同じサンプルMavenプロジェクトを使用します。ここでは、生成したwarファイルをTomcat 8のWebサーバに自動的にデプロイするようにJenkinsを設定します。Tomcat 8 Webサーバは、Ubuntu 16.04にデフォルトのUbuntuリポジトリから簡単にインストールできます。もう一度、Ubuntu ECSインスタンスにsudoユーザーとしてログインし、以下のコマンドを実行してTomcat 8 Webサーバーをインストールします。

`sudo apt -y install tomcat8 tomcat8-admin`

デフォルトでは、Apache Tomcatはポート "8080 "をリッスンするように設定されています。私たちのUbuntuインスタンスでは、すでにJenkinsがポート "8080 "をリッスンしているので、Tomcatのポートを変更する必要があります。Tomcatサーバの設定ファイルを開きます。

`sudo nano /etc/tomcat8/server.xml`

次の行を探します。

```
   <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
     ...
```

ポートの値を「808080」から「8081」に変更します。

```
   <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
```

さらに、"manager-script" ロールを持つ新しい tomcat サーバユーザを作成する必要があります。このユーザは、JenkinsがTomcatサーバの設定とwarアプリケーションのデプロイに使用します。

`sudo nano /etc/tomcat8/tomcat-users.xml`

テキストファイルの前に以下の行を追加します。

`<user username="jenkins" password="StrongPassword" roles="manager-script" />`

完了すると、以下のような設定になっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/abbd13ad-e78d-c3e2-0f80-9ad1afcffeb8.png)

ファイルを保存してエディタを終了します。これで、Tomcatサーバを再起動し、コマンドを実行することで起動時に自動的に起動するようにすることができます。

```
sudo systemctl restart tomcat8
sudo systemctl enable tomcat8
```

Tomcatが動作しているかどうかを確認するには、Webブラウザを使って、[http://jenkins.example.com:8081](http://jenkins.example.com:8081/?spm=a2c65.11461447.0.0.14f0360a9F8Tkl) または [http://172.16.0.1:8081](http://172.16.0.1:8081/?spm=a2c65.11461447.0.0.14f0360a9F8Tkl) のアドレスにアクセスします。Tomcatの例のページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7e413e32-e64a-b78f-0c4c-48e5f9727deb.png)


これでウェブアプリケーションのステージングとテスト環境の準備ができました。さらに、アプリケーションをTomcat 8に自動的にデプロイするためにJenkinsを設定する必要があります。 Jenkinsインスタンスにログインし、"Manage Jenkins >> Manage Plugins "に移動します。「Available」タブに切り替え、「Deploy to container」プラグインを検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/51cfbe01-b4d7-6479-40c5-55e7bc2c3e90.png)

プラグインを選択し、「再起動せずにインストール」ボタンをクリックします。Jenkinsダッシュボードに戻り、「MyMavenApp」プロジェクトをクリックし、プロジェクトの構成ページを開きます。下にスクロールして「Post-build Action」を見つけ、ドロップダウンメニューから「Archive artifacts」オプションを選択します。[アーカイブするファイル]テキストボックスにワイルドカードの */.war を入れます。これにより、Jenkinsはワークスペース全体をスキャンして、すべてのwarファイルを見つけ出し、アーカイブするようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/61f55bb8-1a89-b8b7-d3e3-202e7202e9fb.png)

アーカイブされたアーティファクトは、すべてのビルド情報ページでダウンロードできるようになります。将来的には、すべてのビルド後に生成されたwarファイルをダウンロードできるようになります。

次に、ドロップダウンメニューから "Deploy war/ear to a container "を選択して、別のビルド後のアクションを追加します。"war/ear files" テキストボックスにワイルドカード */.war を入れて、現在のワークスペース内のすべての war アーティファクトを検索します。Context path" テキスト入力には、アプリケーションが公開されるパスを入力します。例えば、"MyMavenApp "と入力すると、アプリケーションはURLの "http://jenkins.example.com:8081/MyMavenApp "にデプロイされます。コンテナで、「コンテナの追加」のドロップダウンメニューから「Tomcat 8.x」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5f02a647-291f-a9be-6f6a-66abdde181b5.png)

「資格情報」の横にある「追加」ボタンをクリックします。「資格情報の追加 」では、先ほど "tomcat-users.xml "ファイルに入力したユーザ名とパスワードを入力します。IDフィールドは空欄のままにしておき、Jenkinsが生成するようにします。後で簡単に識別できるように、キーの説明を記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d8780121-2906-ac2a-f1da-add104b80f5f.png)

キーが追加されたら、"Credentials "のドロップダウンメニューからキーを選択します。プロトコル "http "または "https "とTomcatがリッスンしているポートと一緒に、Tomcat 8インスタンスへのリンクを提供します。ビルド後の設定は、スクリーンショットのようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7f76a8b1-ec4c-057f-fb37-31ce56006153.png)

設定を保存し、サンプルプロジェクトのメインページに戻ります。「Build now」リンクをクリックしてプロジェクトをビルドしてください。チュートリアルの通りに進めば、ビルドは正常に行われているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8437556e-a20c-7cf4-d665-c8dcbabff1d7.png)

ビルド情報のページでは、生成されたアーティファクトをダウンロードすることもできます。JenkinsがアプリケーションをTomcat 8上に正常にデプロイしたかどうかを確認するには、「コンソール出力」をクリックします。最後にスクロールダウンすると、Jenkinsがアプリケーションをアーカイブし、Tomcat 8上にデプロイしたことに関するログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f2ae988f-1816-6c59-142f-dd169d39312b.png)

これで、http://jenkins.example.com:8081/MyMavenApp
にアクセスしてWebアプリケーションにアクセスできます。アプリケーションが正常に機能していることがわかります。私たちのアプリケーションはサンプルアプリケーションだったので、「HelloWorld！」だけが表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/06c6a4f3-6662-557a-1b5e-7bb6db711578.png)

#結論
このチュートリアルの最後の部分では、複数の方法を使ってJenkinsの自動ビルドを設定することを学びました。最後に、Jenkinsを設定して、サンプルのWebアプリケーションをTomcat 8のWebサーバに自動的にデプロイすることで、Jenkinsでの継続的な配信を有効にしました。

これで、Jenkinsを使い始めるための3部構成のチュートリアルを終了します。我々は、単一ノードに[Jenkinsオートメーションサーバー](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717?spm=a2c65.11461447.0.0.14f0360a9F8Tkl)をインストールする手順を見てきました。また、JenkinsにCI/CDパイプラインを作成するための基本を学びました。また、Jenkinsを学習しながら、[Mavenのインストール](https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-2%3A-use-jenkins-for-continuous-integration_593720?spm=a2c65.11461447.0.0.14f0360a9F8Tkl)とその中でのサンプルJavaウェブアプリケーションプロジェクトの作成についても見てきました。プロジェクトの初期化、リポジトリの作成、変更のコミット、リモートオリジンの追加、変更のプッシュなど、「git」コマンドの使い方の基本を見ました。同様に、実際のプロジェクトをJenkinsにセットアップしていきます。ビルドパイプラインには様々なアプローチがあります。今回のプロジェクトで使用したのと同じような設定に従えば、あとはコミットをプッシュするだけで、Jenkinsがそれ以外のことはすべてやってくれます。変更をプッシュした後、ビルドが終了するのを待つと、アプリケーションがコンテナにデプロイされるのがわかります。ここではJenkinsの基本的なことしか説明していませんので、[Jenkinsのドキュメント](https://jenkins.io/doc/?spm=a2c65.11461447.0.0.14f0360a9F8Tkl)のページを参照してください。

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