SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事(AD)

Jenkinsで実現するJava EEアプリケーションの自動ビルドと自動デプロイ

Jenkinsを利用した「WebSphere Application Sever Liberty Core」へのデプロイの定期実行化

  • このエントリーをはてなブックマークに追加

 皆様はJenkinsをご存知でしょうか。「Jenkins」(ジェンキンス)は、CI(継続的インテグレーション)ツールとして有名なHudsonが名前を変えて開発し続けられているものです。本稿では、IBMの軽量Javaアプリケーションサーバー「WebSphere Application Server Liberty Core」の無償評価版を使って、JenkinsでJava EEアプリケーションのビルドおよびデプロイを自動化する手順とポイントを具体的に紹介します。

  • このエントリーをはてなブックマークに追加

CI(継続的インテグレーション)とは

 Jenkinsの前に、まず「CI(継続的インテグレーション)」について説明します。

 CIとは一言で言えば、日々行っていることで自動化できるものは自動化して素早い開発を行おうということです。例えば、次のようなことを毎日行っていないでしょうか?

  • アプリケーションのビルド、およびサーバーへのアプリケーションのデプロイ
  • テストのカバレッジの収集
  • FindBugsやPMDを使用した静的解析、およびレポート作成

 これらは非常に重要なことです。毎日、最新版のアプリケーションをサーバーにデプロイすることで、最新のアプリケーションに対するテストを行えます。テストのカバレッジを毎日収集することで、テストの進捗状況を細かく確認することができます。静的解析を行うことで、手動では見つけにくいバグや品質低下を発見することができます。これらを毎日人力で行うことは非常に手間です。Jenkinsはそれらを自動化する手助けをしてくれます。

Jenkinsとは

 Jenkinsの機能について一言で言えば、高機能なGUIのついたcronです。決められた時間に決まったジョブを定期実行してくれます。

 Jenkins以外にもCI(継続的インテグレーション)ツールはたくさんあり、Jenkins以外を利用するという話もあるかもしれません。なぜJenkinsを使用するのでしょうか。Jenkinsは拡張性に優れています。プラグインを作成、利用することで機能を拡張できます。

 IBMのWebSphere Application SeverではJenkinsの機能拡張を利用し、サーバーへのアプリケーションのデプロイを自動で行える仕組みが提供されています。今回はその機能を利用しアプリケーションのビルドからサーバーへのデプロイまでを自動化し、定期実行できるようにしたいと思います。

環境構築

 ここから環境構築を行っていきます。

使用する環境

 この記事執筆は以下の環境で行っています。

 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を解凍します。

Mavenダウンロード
Mavenダウンロード

環境変数の設定

 環境変数に使用するライブラリの情報をシステム環境変数に追加していきます。

1. JAVA_HOMEを設定します。
JAVA_HOME
JAVA_HOME
2. M2_HOMEを設定します。
M2_HOME
M2_HOME
3. PATHを通します。

 PATHの先頭に「%M2_HOME%¥bin」と「%JAVA_HOME¥bin」を追加してください。

M2_HOME
M2_HOME

 ここまできたらコマンドプロンプトを立ち上げ、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をまだインストールしていない場合は、先にインストールしてください。

LIBERTY_HOME
LIBERTY_HOME

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
mvn package
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. 証明書が不正である旨が表示されますが、気にせず続行します。
証明書取得1
証明書取得1
3. 証明書のエラーの箇所をクリックし、証明書の表示をクリックします。
証明書取得2
証明書取得2
4. 証明書が表示されるので、詳細をクリックし、ファイルにコピーをクリックします。
証明書取得3
証明書取得3
5. 証明書エクスポートウィザードが起動するので、次へをクリックします。
証明書取得4
証明書取得4
6. 次へをクリックします。
証明書取得5
証明書取得5
7. 証明書をエクスポートする先を入力して、次へをクリックします。
証明書取得6
証明書取得6

 エクスポートした証明書は、この後すぐに使用します。

8. 完了をクリックします。
証明書取得7
証明書取得7
9. ブラウザからエクスポートした証明書をJavaのキーストアに取り込みます。

 管理者権限で起動したコマンドプロンプトで以下のコマンドを入力します。

"%JAVA_HOME%\jre\bin\keytool" -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -importcert -alias websphere-liberty-remote -file [先ほどエクスポートした証明書ファイル]

 パスワードの入力を求められるので、「changeit」と入力してください。パスワードを変更している場合は、変更したパスワードを入力してください

 「証明書を信頼しますか」と確認されるのでyを入力し、エラーが出なければ完了です。

証明書取得7
証明書取得7

 管理者権限がないコマンドプロンプトで実行すると、アクセスが拒否されることがあります。その場合は管理者権限でコマンドプロンプトを起動しなおしてください。

 ブラウザからエクスポートした証明書は、この作業が終われば不要なので削除しても大丈夫です。

Jenkinsのインストールと設定(1)

 ここからJenkinsのインストールと設定を行っていきたいと思います。

Jenkinsのダウンロード

 Jenkinsは、http://jenkins-ci.org/からダウンロードできます。画面右側の「Latest and greatest」をクリックすると、jenkins.warファイルがダウンロードされます。

Jenkinsインストール先
Jenkinsインストール先

 warファイルがダウンロードされたことで気が付かれた方もいると思いますが、Jenkins自体がJavaで作成されたWebアプリケーションファイルです。Java EEサーバーにデプロイして動かすこともできます。

 また、Jenkins用のJava EEサーバーを準備しなくてもJenkins内部にJettyが内蔵されており、そのまま起動させることもできます。

 今回は内蔵されたJettyを使用します。

Jenkinsの起動

 ダウンロードしたJenkinsを適切なフォルダに設置してください(筆者の環境では「c:¥jenkins」に配置します)。

 となりに、jenkins.batというファイル名で以下のようなファイルを作成してください。

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を使用しての自動ビルド、自動デプロイの設定はジョブを作成することで行えます。

 ただし、その前に使用するライブラリを指定する必要があるため、先にそれを行います。左のメニューから「Jenkinsの管理」を選択します。

Jenkins設定1
Jenkins設定1

 Jenkinsの管理から「システムの設定」を選択します。

Jenkins設定2
Jenkins設定2

 システムの設定から「JDK追加」を押下し、自動インストールのチェックを外します。名前として、java7 u65を入力し、JAVA_HOMEとしてシステム環境変数に登録したものを入力します。

 また、Maven追加を押下し、自動インストールのチェックを外します。名前として、apache-maven-3.2.2を入力し、M2_HOMEとしてシステム環境変数に登録したものを入力します。

Jenkins設定2
Jenkins設定2

 入力が終わったら、下の「保存」ボタンを押下して完了です。

Jenkinsへのプラグインの追加

 JenkinsにWebSphere Deployer Pluginを導入します。Jenkinsの管理からプラグインの管理を選択してください。

 「利用可能」タブにしてから「WebSphere」で検索を行い、WebSphere Deployer Pluginにチェックを入れ、再起動せずにインストールをクリックします。

プラグインインストール1
プラグインインストール1

 成功すると以下のような画面が表示されます。

プラグインインストール2
プラグインインストール2

 プラグインのインストールに成功したら、Jenkinsをシャットダウンします。jenkins.batを実行した時に表示されているコンソールで、Ctrl+cを押下してください。バッチジョブを終了するか確認されますので、Yを入力し、エンターキーを押下します。

プラグインインストール3
プラグインインストール3

 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のインストールが完了しました。

ジョブの作成

 さて、ここから自動ビルド、自動デプロイの設定を行っていきます。左のメニューから「新規ジョブ作成」を選択してください。

新規ジョブ作成1
新規ジョブ作成1

 ジョブ名にliberty-exampleを入力して、Maven2/3プロジェクトのビルドを選択し、「OK」を押します。

新規ジョブ作成2
新規ジョブ作成2

 ソースコード管理から「Subversion」を選択し、リポジトリURLに「https://github.com/megascus/Liberty-Jenkins/trunk@HEAD」を入力します。

新規ジョブ作成3
新規ジョブ作成3

 ビルドトリガから定期的に実行を選択し、スケジュールとして「H 0 * * *」を入力します。

新規ジョブ作成4
新規ジョブ作成4

 これは設定例だと毎日0時にビルドが行われます。cronに似た書式で自動でのビルド、デプロイ感覚を自由に変更することができます。

 ビルド後の処理の追加からDeploy To IBM WebSphere Liberty Profileを選択します。

新規ジョブ作成5
新規ジョブ作成5

 入力欄に以下のとおり入力していきます。

項目
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!と表示されます。

新規ジョブ作成6
新規ジョブ作成6

 保存をクリックすれば、設定完了です。

ジョブを起動してみる

 毎晩0時に起動するように設定しましたが、0時までは待てませんので、今すぐ起動させます。メニューからビルド実行をクリックしてください。即座にジョブが実行されます。

ビルド1
ビルド1

 ビルドが終わると、下のビルド履歴にジョブの結果が表示されます。ジョブが成功すると青い丸、ジョブが失敗すると赤い丸が表示されます。

ビルド2
ビルド2

 ビルド履歴をクリックすることで、そのジョブの詳細を確認することができます。「Console Output」をクリックすれば、ビルド中に標準出力に出力された内容を確認できます。

ビルド2
ビルド2

 これでJenkinsによる自動ビルドができるようになりました。

まとめ

 Jenkinsを使用した自動ビルドおよびWebSphereへの自動デプロイはいかがだったでしょうか。今回は紹介を見送りましたが、テストの自動実行や、FindBugsやPMDを利用した静的解析やレポートの作成を自動で行うこともできます。Jenkinsは日々の決まったタスクを自動的に実行してくれる便利屋さんです。今回の記事の範囲だけではもったいないので、ぜひJenkinsの効率的な使用方法を考えて実践してください。

Liberty CoreはTomcatとどう違うのか

 本稿で紹介した「Liberty Core」は、開発用途や必要最低限の構成での運用に適した、軽量かつ高速なランタイムですが、そのような場合にApache Tomcatを利用している開発者の方も少なくないと思います。

 

 Liberty CoreとTomcatでは、機能や管理のしやすさ、パフォーマンスの面で、具体的にどのような違いがあるのか。本資料では24ページに渡り、開発者の視点でそれらを検証した結果を詳しく解説しています(※「Liverty Core」は「Libertyプロファイル」の単体製品版です)。

 

 ぜひ詳細をご確認ください。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7929 2014/09/04 13:33

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング