nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

JBoss ASのマイナーバージョンアップを簡単に行う

あけおめ。

新年一発目はJBoss ASの環境構築と、バージョンアップのTipsについて書きます。コミュニティ版のJBoss ASは機能開発を主な目的としているのでマイナーバージョンアップリリースはあまりされないのですが、JBoss EAP (Enterprise Application Platform) というエンタープライズ版のほうは3-6ヶ月くらいの周期でパッチバージョンが提供されていきます。例えば、JBoss EAP 4.3.0.GA_CP09というようなバージョンがリリースされています。これはコミュニティ版のJBoss AS 4.2系から1200件ほどの問題を修正したバージョンです。修正にはセキュリティ修正や、重要なバグフィックス、パフォーマンス改善、細かいバグフィックスなどが含まれます。

JBoss ASは設定ファイル数が少し多めなので、全部マニュアルでファイルコピーや設定ファイルの変更の適用などのバージョンアップ作業をやろうとすると、とても長大な手順書ができることになりますし、実際にやるのも大変です。というわけで、マイナーバージョンアップは基本的にはrsyncやdiffとpatchコマンドを利用してやってしまいます。ここで言っているマイナーバージョンアップというのは4.xから5.xなどメジャーバージョンアップは含みません。メジャーバージョンアップでは設定ファイルなどの構成が変わるのでマニュアルでやったほうが無難です。

具体的に見ていきましょう。JBoss AS 5.0.1.GAのdefault設定をベースにmyappという設定を作成してカスタマイズし、アプリケーションとしてJBoss SeamのBooking Exampleをデプロイします。そしてそれをJBoss AS 5.1.0.GAへバージョンアップする、というユースケースをやってみましょう。

JBoss AS 5.0.1.GAを展開してdefault設定をmyapp設定にコピーする

$ unzip jboss-5.0.1.GA.zip
$ cd jboss-5.0.1.GA
$ cp -rp ./server/default ./server/myapp

これで$JBOSS_HOME/server/myapp/が出来ます。

myapp設定をお好みでカスタマイズし、JBoss Seam Booking Exampleをデプロイして動作確認する

要らないものを消したり、設定を変えたりしましょう。

$ cd $JBOSS_HOME/server/myapp/
$ rm -rf ROOT.war admin-console.war ejb3-timerservice-jboss-beans.xml jbossws.sar jms-ra.rar jmx-remoting.sar
  jsr88-service.xml mail-ra.rar mail-service.xml management messaging monitoring-service.xml 
  profileservice-secured.jar properties-service.xml quartz-ra.rar schedule-manager-service.xml scheduler-service.xml
  sqlexception-service.xml uuid-key-generator.sar xnio-provider.jar
$ vi jbossweb.sar/server.xml # maxThreads="400"とか書き足したりする

これでJBoss AS 5.0.1.GA上での環境構築は終わりです。引き続きバージョンアップ。

JBoss ASのバージョンアップをする

移行先となる新しいバージョン、JBoss AS 5.1.0.GAをどこかに展開したら、あとはこんなスクリプトで料理します。

#!/bin/sh

OLD_JBOSS_HOME=/home/nekop/tmp/jboss-5.0.1.GA
ORIG_JBOSS_PROFILE=default
INUSE_JBOSS_PROFILE=myapp
NEW_JBOSS_HOME=/home/nekop/tmp/jboss-5.1.0.GA

# clean old profile

rm -rf $OLD_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE/data
rm -rf $OLD_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE/log
rm -rf $OLD_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE/work
rm -rf $OLD_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE/tmp

# create new profile

cp -rp $NEW_JBOSS_HOME/server/$ORIG_JBOSS_PROFILE $NEW_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE

# sync non-existing files

rsync -r --ignore-existing --del $OLD_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE/ $NEW_JBOSS_HOME/server/$INUSE_JBOSS_PROFILE/

# get diff for modified existing files in old, apply it to new profile

(cd $OLD_JBOSS_HOME; diff -ru ./server/$ORIG_JBOSS_PROFILE ./server/$INUSE_JBOSS_PROFILE > $NEW_JBOSS_HOME/$INUSE_JBOSS_PROFILE.patch)
(cd $NEW_JBOSS_HOME; patch -p0 < $NEW_JBOSS_HOME/$INUSE_JBOSS_PROFILE.patch)

echo "Done."

rsyncは便利ですね。--ignore-existingをこのように使うと、OLDで追加されているファイル(アプリケーションやJDBCドライバなど)はそのままNEWへコピーされ、OLDで削除されているファイル(使わないので消したJBossのサービスなど)はNEWでも削除される、というファイルの追加削除だけを反映する同期処理を行います。設定ファイルの変更については、テキストベースであるので、diffを取ってpatchでマージします。これによりアプリケーションで加えた設定の変更と、バージョンアップによる設定の変更、両方が自動的にマージされたものが残ることになります。コンフリクトしたらマニュアルでチェックしてください。

このスクリプトではbinディレクトリについては移行してないので、bin/run.confに設定しているJAVA_OPTSなどは手動で移行する必要があります。それが終わったらバージョンアップは完了です。バージョンアップ作業自体はたぶん10分もあれば終わるでしょう。

追記。エンタープライズ版ではJBoss ONというオプションのJBossの管理ツール製品を使ってGUIでパッチの適用もできます。GUIは柔軟性がどうしても無くなってしまうというところがイヤなので、個人的には使うことはないのですが、プログラミングやCUI運用の知識がない人(rsyncとか理解するのが難しい人)が運用をするときは有効です。