CI(継続的インテグレーション)とは
Jenkinsの前に、まず「CI(継続的インテグレーション)」について説明します。
CIとは一言で言えば、日々行っていることで自動化できるものは自動化して素早い開発を行おうということです。例えば、次のようなことを毎日行っていないでしょうか?
- アプリケーションのビルド、およびサーバーへのアプリケーションのデプロイ
- テストのカバレッジの収集
- FindBugsやPMDを使用した静的解析、およびレポート作成
これらは非常に重要なことです。毎日、最新版のアプリケーションをサーバーにデプロイすることで、最新のアプリケーションに対するテストを行えます。テストのカバレッジを毎日収集することで、テストの進捗状況を細かく確認することができます。静的解析を行うことで、手動では見つけにくいバグや品質低下を発見することができます。これらを毎日人力で行うことは非常に手間です。Jenkinsはそれらを自動化する手助けをしてくれます。
Jenkinsとは
Jenkinsの機能について一言で言えば、高機能なGUIのついたcronです。決められた時間に決まったジョブを定期実行してくれます。
Jenkins以外にもCI(継続的インテグレーション)ツールはたくさんあり、Jenkins以外を利用するという話もあるかもしれません。なぜJenkinsを使用するのでしょうか。Jenkinsは拡張性に優れています。プラグインを作成、利用することで機能を拡張できます。
IBMのWebSphere Application SeverではJenkinsの機能拡張を利用し、サーバーへのアプリケーションのデプロイを自動で行える仕組みが提供されています。今回はその機能を利用しアプリケーションのビルドからサーバーへのデプロイまでを自動化し、定期実行できるようにしたいと思います。
環境構築
ここから環境構築を行っていきます。
使用する環境
この記事執筆は以下の環境で行っています。
- Windows 8.1
- JDK 7 u65
- Maven 3.2.2
- Jenkins 1.573
- TotoiseSVN 1.8.7(+コマンドラインツール)
- WebSphere Application Server Liberty Core 8.5.5.2無償評価版
WebSphere Application Server Liberty Core 8.5.5.2無償評価版のインストール方法については、同じCodeZineの記事である『軽量・高速・安価で、安定性と信頼性も兼ね備えたWebSphere Application Serverの「Liberty Core」を使ってみた』を参照してください。
JDK 7 u65とTotoiseSVN 1.8.7(+コマンドラインツール)については導入が容易なため、説明を割愛します。JDK 7は「C:¥Program Files¥Java¥jdk1.7.0_65」に導入されているものとしています。より新しいUpdateを使用する場合は、導入ディレクトリに読みかえてください。
ここでは「Mavenのインストール」から説明します。
なぜ「Java SE 8」ではなく「Java SE 7」なのか
2014年3月にJava SE 8がリリースされていますので、現時点での最新版ということであれば、JDK 8を利用することになります。なぜJDK 7を利用するのかというと、本記事執筆時点(2014年7月)ではJava SE 8に完全対応したJava EEサーバーが存在しないからです。WebSphereだけでなく、WebLogicやJBossASについても不具合が発生します。WebSphere Application Server Liberty Coreも、公開されている次期ベータ版からJDK 8対応が行われているのですが、この記事で使用する8.5.5.2ではJDK 7を使用する必要があります。
Mavenのインストール
Mavenはビルドツールのデファクトスタンダードです。コマンドラインで実行することができ、jarの依存性を自動的に解消してくれる非常に便利なツールです。Eclipseを使用している場合はm2eプラグインを使用することで、Mavenでビルドができるようになります。
Mavenはhttp://maven.apache.org/からダウンロードできます。左のメニューから「Get Maven」-「download」をクリックしてダウンロード画面に移動し、「Maven 3.2.2 (Binary zip)」をダウンロードします。ダウンロード後は任意の場所にzipを解凍します。
環境変数の設定
環境変数に使用するライブラリの情報をシステム環境変数に追加していきます。
1. JAVA_HOMEを設定します。
2. M2_HOMEを設定します。
3. PATHを通します。
PATHの先頭に「%M2_HOME%¥bin」と「%JAVA_HOME¥bin」を追加してください。
ここまできたらコマンドプロンプトを立ち上げ、java -versionの結果がjava version "1.7.0_65"になっていることと、mvnのコマンドが見つかることを確認してください。
Java SE 8のインストーラーがjavaコマンドをシステム領域にコピーするため、PATHは先頭に追加しないとJava SE 7ではなくJava SE 8が起動してしまいます。
4. LIBERTY_HOMEを設定します。
必須ではないですが、ツールのパスが固定できるため、WebSphere Application Server Liberty Coreをインストールしたフォルダを設定します。
WebSphere Application Server Liberty Coreをまだインストールしていない場合は、先にインストールしてください。
Mavenの動作確認
Mavenの設定が正しく行われていることを確認します。Subversionを利用して
https://github.com/megascus/Liberty-Jenkins/trunk/@HEAD
からチェックアウトを行ってください。
コマンドラインでは以下のように入力します。
svn co https://github.com/megascus/Liberty-Jenkins/trunk/@HEAD
チェックアウトを行ったらコマンドプロンプトからpom.xmlが入っているフォルダにアクセスします。
その後、以下のコマンドを入力してください。
mvn package
BUILD SUCCESSFULと表示されれば成功です。targetというフォルダに、liberty.warが作成されています。この後の手順では、このファイルを使用して動作確認を行います。
今回のアプリケーションは、Java EE 6開発に必要な最低限の依存関係のみを定義したものとなっています。雛形としてEclipse上で開きたい場合は以下のコマンドを実行することでEclipse用のプロジェクトファイルが生成され、Eclipseで開けるようになります。
mvn eclipse:eclipse
Java EE 5までは、EJBを含める場合にearファイルの作成が必須でした。しかし、Java EE 6からはwarファイルにEJBを含められるようになっています。今後はearファイルを作成しない方向になっていくでしょう。
サーバーの追加
自動デプロイを行うサーバーを作成します。以下のコマンドを入力してください。
%LIBERTY_HOME%\bin\server create liberty
「%LIBERTY_HOME%¥usr¥servers¥liberty」フォルダが作成されます。
サーバーへのアプリケーションのデプロイ
先ほど作成したliberty.warを「%LIBERTY_HOME%¥usr¥servers¥liberty¥dropins」に配置します。配置後、以下のコマンドを実行することでアプリケーションが起動します。
%LIBERTY_HOME%\bin\server start liberty
ブラウザで http://localhost:9080/libertyにアクセスをし、起動していることを確認してください。
Windows 8でJDK 7 u65を使用すると起動に失敗します。JDK 7 u65においてシステム環境変数のos.nameが違う値を返すようになっていることによる問題です。JDK 7 u25など、古いバージョンではこの問題は発生しません。
この問題を解決するためのファイルをjvm.optionsとして用意しました。rawボタンを右クリックして「リンク先を保存」を選択することでファイルをダウンロードできます。「%LIBERTY_HOME%¥usr¥servers¥liberty¥jvm.options」として保存してください。保存後、もう一度コマンドを実行すればアプリケーションが起動するはずです。
起動後は以下のコマンドを実行することでアプリケーションが終了します。
%LIBERTY_HOME%\bin\server stop liberty
これで動作確認が終わり、環境構築が完了しました。
自動デプロイの前準備
先程はローカルでコマンドを実行してデプロイをしていました。WebSphere Application Server Liberty Coreではリモートデプロイできる仕組みが準備されており、Jenkinsからデプロイする場合はその仕組みを使用します。
ここからは、WebSphere Application Server Liberty Coreに対してリモートデプロイの設定を行います。
この記事では同じマシーンにある場合の検証のみ行っていますが、実際にはこの設定はJenkinsとWebSphere Application Server Liberty Coreが別マシーンにある場合にも使用できます。
WebSphere Application Server Liberty Coreへリモートデプロイを受け入れる設定の追加
「%LIBERTY_HOME%¥usr¥servers¥liberty¥server.xml」を編集します。
1. restConnector-1.0を有効にするため、server.xmlに以下の記載を追加します。
<featureManager> <feature>restConnector-1.0</feature> </featureManager>
2. quickStartSecurityタグを追加します。
<quickStartSecurity userName="bob" userPassword="bobpassword" />
3. remoteFileAccessタグを追加します。
<remoteFileAccess> <readDir>${server.output.dir}/dropins</readDir> <writeDir>${server.output.dir}/dropins</writeDir> </remoteFileAccess>
4. httpEndpointタグにhost="*"属性を追加します。
<httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443" />
5. SSL証明書の作成
以下のコマンドを実行し、SSL証明書を作成します。
%LIBERTY_HOME%\bin\securityUtility createSSLCertificate --server=liberty --password=[パスワード]
「パスワード」には自由な値を設定してください。後ほどJenkinsの画面で入力する必要があるので、忘れないようにしてください。
証明書の作成に成功するとserver.xmlに追加する内容が表示されるので、表示された内容をそのまま追加します。
また、実行結果の1行目に表示されている「key.jksファイル」は、Jenkinsの設定で必要となるファイルです。jenkinsをインストールするマシーンにファイルをコピーします。
最後にserver.xmlを反映させるために再起動を行います。
%LIBERTY_HOME%\bin\server stop liberty %LIBERTY_HOME%\bin\server start liberty
ここまでくればWebSphereの設定は終わりです。
JavaのKeyStoreへの証明書のインストール
この設定はJenkinsを動かすマシーンへ行います。
1. ブラウザからWebSphereにhttpsでアクセスします。
https://localhost:9443/
ポート番号はserver.xmlのhttpEndpointタグに記載されているhttpsPort属性の値です。host名は実際にWebSphereが動いている名前で読み替えてください。
2. 証明書が不正である旨が表示されますが、気にせず続行します。
3. 証明書のエラーの箇所をクリックし、証明書の表示をクリックします。
4. 証明書が表示されるので、詳細をクリックし、ファイルにコピーをクリックします。
5. 証明書エクスポートウィザードが起動するので、次へをクリックします。
6. 次へをクリックします。
7. 証明書をエクスポートする先を入力して、次へをクリックします。
エクスポートした証明書は、この後すぐに使用します。
8. 完了をクリックします。
9. ブラウザからエクスポートした証明書をJavaのキーストアに取り込みます。
管理者権限で起動したコマンドプロンプトで以下のコマンドを入力します。
"%JAVA_HOME%\jre\bin\keytool" -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -importcert -alias websphere-liberty-remote -file [先ほどエクスポートした証明書ファイル]
パスワードの入力を求められるので、「changeit」と入力してください。パスワードを変更している場合は、変更したパスワードを入力してください
「証明書を信頼しますか」と確認されるのでyを入力し、エラーが出なければ完了です。
管理者権限がないコマンドプロンプトで実行すると、アクセスが拒否されることがあります。その場合は管理者権限でコマンドプロンプトを起動しなおしてください。
ブラウザからエクスポートした証明書は、この作業が終われば不要なので削除しても大丈夫です。
Jenkinsのインストールと設定(1)
ここからJenkinsのインストールと設定を行っていきたいと思います。
Jenkinsのダウンロード
Jenkinsは、http://jenkins-ci.org/からダウンロードできます。画面右側の「Latest and greatest」をクリックすると、jenkins.warファイルがダウンロードされます。
warファイルがダウンロードされたことで気が付かれた方もいると思いますが、Jenkins自体がJavaで作成されたWebアプリケーションファイルです。Java EEサーバーにデプロイして動かすこともできます。
また、Jenkins用のJava EEサーバーを準備しなくてもJenkins内部にJettyが内蔵されており、そのまま起動させることもできます。
今回は内蔵されたJettyを使用します。
Jenkinsの起動
ダウンロードしたJenkinsを適切なフォルダに設置してください(筆者の環境では「c:¥jenkins」に配置します)。
となりに、jenkins.batというファイル名で以下のようなファイルを作成してください。
set JENKINS_HOME=%~dp0\home java -jar jenkins.war --httpPort=18080
作成したjenkins.batを実行することでコンソールが立ち上がり、jenkinsが起動します。
コンソールにログが流れますので、ログが流れ終わったら、http://localhost:18080にアクセスしてみてください。Jenkinsが起動していることを確認できます。
JENKINS_HOMEの配下にJenkinsの設定が展開されます。指定しない場合はユーザーのホームフォルダの下に.jenkinsというフォルダが作成されます。
Jenkinsの設定
Jenkinsを使用しての自動ビルド、自動デプロイの設定はジョブを作成することで行えます。
ただし、その前に使用するライブラリを指定する必要があるため、先にそれを行います。左のメニューから「Jenkinsの管理」を選択します。
Jenkinsの管理から「システムの設定」を選択します。
システムの設定から「JDK追加」を押下し、自動インストールのチェックを外します。名前として、java7 u65を入力し、JAVA_HOMEとしてシステム環境変数に登録したものを入力します。
また、Maven追加を押下し、自動インストールのチェックを外します。名前として、apache-maven-3.2.2を入力し、M2_HOMEとしてシステム環境変数に登録したものを入力します。
入力が終わったら、下の「保存」ボタンを押下して完了です。
Jenkinsへのプラグインの追加
JenkinsにWebSphere Deployer Pluginを導入します。Jenkinsの管理からプラグインの管理を選択してください。
「利用可能」タブにしてから「WebSphere」で検索を行い、WebSphere Deployer Pluginにチェックを入れ、再起動せずにインストールをクリックします。
成功すると以下のような画面が表示されます。
プラグインのインストールに成功したら、Jenkinsをシャットダウンします。jenkins.batを実行した時に表示されているコンソールで、Ctrl+cを押下してください。バッチジョブを終了するか確認されますので、Yを入力し、エンターキーを押下します。
Jenkinsがシャットダウンされました。
Jenkinsのインストールと設定(2)
Jenkinsへのライブラリの追加
WebSphere Deployer Pluginには一部追加でのライブラリが必要となっています。
ライブラリについてはWebSphere Application Server「Liberty Core」に含まれています。
以下のファイルを「%JENKINS_HOME%¥plugins¥websphere-deployer¥WEB-INF¥lib」にコピーします。
- %LIBERTY_HOME%¥dev¥api¥ibm¥com.ibm.websphere.appserver.api.basics_*.jar
- %LIBERTY_HOME%¥dev¥api¥ibm¥com.ibm.websphere.appserver.api.endpoint_*.jar
- %LIBERTY_HOME%¥dev¥api¥ibm¥com.ibm.websphere.appserver.api.restConnector_*.jar
- %LIBERTY_HOME%¥clients¥restConnector.jar
ファイルをコピーしたらJenkinsを起動します。jenkins.batを実行してください。
これでWebSphere Deployer Pluginのインストールが完了しました。
ジョブの作成
さて、ここから自動ビルド、自動デプロイの設定を行っていきます。左のメニューから「新規ジョブ作成」を選択してください。
ジョブ名にliberty-exampleを入力して、Maven2/3プロジェクトのビルドを選択し、「OK」を押します。
ソースコード管理から「Subversion」を選択し、リポジトリURLに「https://github.com/megascus/Liberty-Jenkins/trunk@HEAD」を入力します。
ビルドトリガから定期的に実行を選択し、スケジュールとして「H 0 * * *」を入力します。
これは設定例だと毎日0時にビルドが行われます。cronに似た書式で自動でのビルド、デプロイ感覚を自由に変更することができます。
ビルド後の処理の追加からDeploy To IBM WebSphere Liberty Profileを選択します。
入力欄に以下のとおり入力していきます。
項目 | 値 |
---|---|
WebSphere Liberty IP/DNS | WebSphereが動作しているPC名(今回はlocalhost) |
Port | server.xmlのhttpEndpointタグで指定したhttpsのポート番号 |
UserName | server.xmlのquickStartSecurityタグで指定したユーザー名 |
Password | server.xmlのquickStartSecurityタグで指定したパスワード |
Client Truststore File Path | WebSphereで生成したSSL証明書(key.jksファイル)のパス |
Client Truststore Password | SSL証明書作成時に入力したパスワード |
入力し終わった後に「Test Connection」をクリックすると、Connection Successful!と表示されます。
保存をクリックすれば、設定完了です。
ジョブを起動してみる
毎晩0時に起動するように設定しましたが、0時までは待てませんので、今すぐ起動させます。メニューからビルド実行をクリックしてください。即座にジョブが実行されます。
ビルドが終わると、下のビルド履歴にジョブの結果が表示されます。ジョブが成功すると青い丸、ジョブが失敗すると赤い丸が表示されます。
ビルド履歴をクリックすることで、そのジョブの詳細を確認することができます。「Console Output」をクリックすれば、ビルド中に標準出力に出力された内容を確認できます。
これでJenkinsによる自動ビルドができるようになりました。
まとめ
Jenkinsを使用した自動ビルドおよびWebSphereへの自動デプロイはいかがだったでしょうか。今回は紹介を見送りましたが、テストの自動実行や、FindBugsやPMDを利用した静的解析やレポートの作成を自動で行うこともできます。Jenkinsは日々の決まったタスクを自動的に実行してくれる便利屋さんです。今回の記事の範囲だけではもったいないので、ぜひJenkinsの効率的な使用方法を考えて実践してください。
本稿で紹介した「Liberty Core」は、開発用途や必要最低限の構成での運用に適した、軽量かつ高速なランタイムですが、そのような場合にApache Tomcatを利用している開発者の方も少なくないと思います。
Liberty CoreとTomcatでは、機能や管理のしやすさ、パフォーマンスの面で、具体的にどのような違いがあるのか。本資料では24ページに渡り、開発者の視点でそれらを検証した結果を詳しく解説しています(※「Liverty Core」は「Libertyプロファイル」の単体製品版です)。
ぜひ詳細をご確認ください。