【CI奮闘記】第9章:フリースタイルジョブでMavenのビルドを行う!


はじめに

前回のブログでは、Jenkinsができること、Jenkinsが得意なことについて説明しました。
前回のブログはこちら
今回は実際にJenkinsのフリースタイルジョブでMavenのビルドを行う方法を説明します。

登場人物

吉田:転職したてのエンジニア。前職では積極的にCIやCDという事に取り組みながら開発をしていた。

服部:配属1年後の新人。CIやJenkinsについては言葉は聞いたことがある程度。もともと開発で今回初めて環境周りを扱う事になった。

フリースタイルジョブでMavenのビルドを行う!

ジョブを作成する

Jenkinsで何か作業させる単位をジョブというの。

このJenkinsのダッシュボードの左上の「新規ジョブ作成」というやつですか?

そう。ここからジョブを作成するわ。

たくさんのジョブの種類がありますね。

新規ジョブ作成画面。Jenkinsにインストール済みのプラグインによって増減します。

今回はまず「フリースタイル・プロジェクトのビルド」を選択して実行していくわ。
次回は「パイプライン」を説明するわね。その時に違いもあわせて説明するわね。

わかりました。Enter an item nameにジョブの名称を入力すればいいんですね。
それで「フリースタイル・プロジェクトのビルド」を選択して、OK、、、
お!できたみたいです。

これでまっさらなJenkinsのフリースタイルジョブの箱ができたわ。

ここからいろいろな設定をしていくんですね。

そうね。単純にバッチスクリプトの実行でもいいんだけど、、、せっかくだしうちの部署のApache Maven(以下、Maven)プロジェクトのビルドでもやってみましょうか。

今回はJavaではおなじみのビルドツールであるMavenを例にして説明していきます。ご利用の環境・開発言語によってさまざまなビルドツールがあると思います。それぞれを読み替えて読み進めていただければ幸いです。

また、バージョン管理ツールとしてGitを例に挙げます。SubversionやTeam Foundation Serverでも同様にJenkinsでの実行が可能ですのでご安心ください。

お!いいですね。この設定ができればJenkinsを用いて定期的にMavenでのビルドができるようになるというわけですね。

ソースコード管理

まずはJenkinsとソースコード管理を関連付けていく必要があるわ。

このソースコード管理というところですか?

そう。今回はGitを選択して、そこに関連付けるリポジトリのURLを入れていけばOKよ。

いきなり赤い文字が表示されました!

これはJenkinsにGitの認証情報を入力していないから表示されているだけ。
その下の追加ボタンを押して認証情報を設定しましょう。

種類はユーザー名とパスワードでいいんですか?

今回のGitの場合はユーザー名とパスワードで問題ないわよ。
今後さまざまなツールやサービスと接続する際にこの認証情報の追加を利用していくことになるわ。
接続するツールやサービスによって利用する種類が異なるので都度確認する必要があるわね。

了解しました。お、赤い文字が消えました。

認証がうまくいったのね。これでJenkinsとGitの連携ができたわ。

現在ソースコード管理の箇所にGit、Mercurial、Subversionが表示されています。例えば、Team Foundation Serverを利用したいという場合はプラグインを追加することでこの選択肢が増えます。

このようにJenkinsはプラグインを追加することで連携できるツール・サービスを増やすことが可能です。

ビルド・トリガの設定

ビルド・トリガというのが前回のCI奮闘記で説明された「定期的やスケジュールでの実行」といった設定箇所ですね。

よく覚えていたわね。ここでこのジョブをどのタイミングで実行するかを設定できるわ。もちろん手動でもジョブは実行できるんだけど、Jenkinsを使うのだからここはきちんと覚えておいてね。
設定内容がわからないときは「?」マークを押せばヘルプを確認できるわ。

「他プロジェクトの後にビルド」というのを選択すれば特定のジョブが終わった後に自動的にこのジョブを実行してくれるんですね。
でも今回はまだ1つしかジョブがないので「定期的に実行」を行ってみたいと思います!
スケジュールには何を入力すればいいんですか?

ここにはUNIXのcronでの指定方法と同じ記述ができるわ。
これもスケジュール欄の「?」を押せばヘルプを確認することができるわ。

本筋とは外れてしまうためここでは具体的な記載方法はヘルプをご確認下さい。例として、「毎週月曜日の9時」というスケジュールは「0 9 * * 1」と記載します。ヘルプの中で以下の点にも注目しましょう。

To allow periodically scheduled tasks to produce even load on the system, the symbol H (for “hash”) should be used wherever possible. For example, using 0 0 * * * for a dozen daily jobs will cause a large spike at midnight. In contrast, using H H * * * would still execute each job once a day, but not all at the same time, better using limited resources.

スケジュールのヘルプより引用

そのため、毎回ちょうどの時間に実行しなければならないといった以外は、「毎週月曜日の9時」といった場合「H 9 * * 1」と記載するべきでしょう。

これで月曜日の9時に実行できるようになったわけですね。

これ以外の設定方法について説明します。

リモートからビルド (例: スクリプトから)
これはジョブ側で任意の認証トークンを設定し、URLのGetパラメータに認証トークン値を加えて呼び出すことで、ジョブが実行できるようになる仕組みです。
ジョブの名称をFreestyleJob、認証トークンをhogeとした場合、

http://[JENKINS_HOST]/job/FreestyleJob/build?token=hoge

とアクセスすると、このジョブは実行されます。ソースコード管理ツールのコミットフックスクリプトとして実行するといった場合利用されるケースが多いと思われます。

GitHub hook trigger for GITScm polling
こちらは「GitHub plugin」をインストールすることで設定ができるようになるビルド・トリガ方法です。
これはGitHub側での設定を行うことで、GitHubの特定のアクションをトリガーとしてビルドが実行されます。アクションとしては「Pull request」といった個別のアクションの設定が可能です。
設定はGitHubのSetting > WebhooksでPayload URLを設定します。

http://[JENKINS_HOST]/github-webhook/

このような形式で指定を行います。

SCMをポーリング
定期的に「ソースコード管理」で関連付けられたSCMのソースコードを確認しに行き、変更があればジョブを実行するビルド・トリガです。
ヘルプにもある様に、ソースコードの変更の有無にかかわらず確認しに行くのでネットワークやバージョン管理システムに負荷がかかる可能性があります。
個別の環境の状況にも依存しますが、可能であればヘルプに記載されているような “push”トリガーの設定を検討をされると良いかと思います。

他プロジェクトの後にビルド
フリースタイルジョブで「ビルドの後にテストを行う」といったワークフローを設定する場合にはこの設定を用います。
バージョン2.0以前のJenkinsを利用されている方は良く設定されている項目かと思います。

ビルドの設定

さて、ここからはビルドの設定を行っていくわ

今回はMavenのプロジェクトなので「Mavenの呼び出し」ですね。

「高度な設定」も利用することでこのようにそれぞれの項目を設定することが可能になるわ。

必要に応じて入力していくわけですね。了解しました。

一旦今回は実行確認をするだけなので、ゴールに「compile」と入れるだけにしましょうか。

「Mavanの呼び出し」以外にもさまざまなことを実行できます。
たとえば「Windowsバッチコマンドの実行」を選択することで、Windowsバッチコマンドを実行する事が可能です。このような形で前回のCI奮闘記で述べたようにプログラムやスクリプトを実行することが可能です。
これ以外にもプラグインを追加することでJenkinsが実行できることが増えていきます。

ビルド後の処理

これでビルドができるようにはなったけど、これで終わりではないわよ。

このビルド後の処理というものですか?

そう、ビルド後の処理自体もプラグインによってできることが増えていくので中でも代表的なものに絞って説明していくわね。

成果物の保存
ビルドを実行した結果、成果物が作成されるものがあります。今回のMavenのビルドは通常jarファイルやwarファイルといった成果物を作成します。

この成果物は保存しないと次のビルドが実施されたタイミングで削除されてしまいます。そうならないために「成果物の保存」をビルド後の処理に追加します。保存するファイルの欄に、成果物として保存したいファイル名を保存します。この設定をすればJenkinsのジョブの履歴に関連付けられて成果物が保存されます。

意図的に削除しない限りは永久に保存されるので、ジョブの実行頻度や成果物のサイズによってはディスクスペースを圧迫します。その場合、「古いビルドの破棄」の設定を行い、定期的にジョブの実行履歴を削除しましょう。
保存された成果物も同時に削除されます。

このように成果物に含まれないファイルを指定した場合、エラーを出力します。

Email通知
ジョブが失敗した際にメールで通知できます。
ただし、Jenkinsがメールサーバーを内包しているわけではありません。メール送信機能を利用する場合、ダッシュボード > Jenkinsの管理 > システムの設定より、STMPサーバーなどの設定を行う必要があります。

メールに限らず、プラグインを利用することによりSlackといったメッセンジャーツールへの通知も可能です。この場合も同様に「システムの設定」でSlackに疎通するための認証情報などの設定が必要です。

ビルド結果の確認

これで設定が完了ね。
定期実行に設定した時間になっても実行はされるけど、今回は直接手動でジョブを実行しましょう。
ジョブの手動実行は「ビルド実行」ボタンで実行できるわ。

お、ビルド履歴が動き出しました。
赤くなりました!

成功した場合は青、失敗した場合は赤で表示されます。

赤いときは失敗ね。ログを見てみましょう。
ログはこの赤い○をクリックや、ビルド番号を選択して「コンソール出力」で確認できるわ。

Mavanのパスが通っていないみたいですね。

じゃあ自動でインストールするようにしましょう。ダッシュボード > Jenkinsの管理 > Global Tool Configurationを開いてみて

このMavenの箇所に設定すればいいんですね。

この設定が完了したら、今設定したMavenを利用するように設定しなおしましょう。
ダッシュボードからジョブを選択して、「設定」を選べばさっきまで設定していた画面に遷移するわ。

「使用するMaven」という項目が増えてますね。

ここでさっき設定したmvn3を選択して保存して、またジョブを実行してみましょう。

お、成功しました!

これで定期的なMavanビルドができるようになったわね。

まとめ

この調子で次にテストのジョブとデプロイのジョブを作ってつなげれば、ビルド後にテスト、デプロイを実行するところまで自動化できますね!

その方法でもできるんだけど、もっと良いやりかたがあるの。それを次回紹介するわね。

今回はJenkinsのフリースタイルジョブでMavenのビルドを実行する方法を説明しました。

同じようにテストのジョブやデプロイ用のジョブを作成して、「他プロジェクトの後にビルド」を組み合わせることで「ビルド→テスト→デプロイ」といった開発フローの自動化が可能になります。

ただ、このようにジョブを作成していくとプロジェクト(リポジトリ)の数と開発フローの数によってはジョブが膨大な数になってしまい管理も大変です。また細かなワークフローの条件設定もできません。単体のビルドやスクリプトの実行としてはフリースタイルジョブは向いているのですが、開発フローを連続して実行するようなワークフローの実行としては不向きです。

そこで次回はより柔軟なワークフローを実現できる「パイプライン」というジョブを紹介します。

CI奮闘記一覧