Red Hat で Java 関連を担当している伊藤ちひろです。
前回は、既存のJakarta EEアプリケーションをコンテナ化する方法を紹介しました。既存のJakarta EE アプリケーション(WAR)を JBoss EAP でコンテナ化 - 赤帽エンジニアブログ
また、Helm を使って OpenShift 上にコンテナ化する方法も紹介しました。 既存のJakarta EE アプリケーション(WAR)を JBoss EAP + OpenShift でコンテナ化 -Helm編- - 赤帽エンジニアブログ
今回も昔から運用されている Servlet/JSP で動作する Java EE アプリケーションをコンテナ化してOpenShiftへデプロイする方法を紹介します。 今回は、Source to Image を使用します。
必要な作業は以下の4つです。
- Jakarta EE に対応 (今回は説明を省きます)
- Mavenの導入
- Git対応
- Source to Image
Jakarta EEに対応
アプリケーションを Java EE から Jakarta EE に移行します。 JBoss EAP 8.0 は Jakarta EE 10 に対応しており、Java EE には対応していないためです。 本記事は、この移行が目的ではないため省略します。 この移行を支援するツールとして、Migration Toolkit があります。 Migration Toolkit は Red Hat が提供しているツールです。
Maven の導入
次に、アプリケーションのビルドのため Maven を導入します。 多くのアプリケーションはすでに導入しているでしょう。 しかしながら、一部のアプリケーションは Ant や独自の方法でビルドしているかもしれません。 今回は、最低限必要な Maven の設定を記載しています。 これから Maven を使う場合は、これをベースに依存関係を追加してください。 すでにMavenを使っている場合は、この設定を既存の設定に追加してください。
今回は、 Servlet/JSP を実行可能な、できるだけコンパクトな JBoss EAP をデプロイします。
JBoss EAP はアプリケーションが必要とする機能だけをもつコンパクトな JBoss EAP を作成できます。
この仕組みを Galleon と言います。
Galleon は各機能を Layer として定義しています。
Servlet/JSP を実行できる Layer は web-server
です。
Layer は今回使用しているweb-server
のほかにも、ejb
やjaxrs
などさまざまあります。
他にどのような Layer があるのかは以下に記載されています。
第8章 JBoss EAP for OpenShift の機能のトリム | Red Hat Product Documentation
また、Galleon 自体に興味のある方はこちらをごらん下さい。
今回使用する pom.xml
は以下のとおりです。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>jee-traditional</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <profiles> <profile> <id>openshift</id> </profile> <profile> <id>develop</id> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.bom</groupId> <artifactId>jboss-eap-ee</artifactId> <version>8.0.0.GA-redhat-00009</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <pluginRepositories> <pluginRepository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <repositories> <repository> <id>jboss</id> <url>https://maven.repository.redhat.com/ga/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <build> <finalName>ROOT.war</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.4.0</version> </plugin> <plugin> <groupId>org.jboss.eap.plugins</groupId> <artifactId>eap-maven-plugin</artifactId> <version>1.0.0.Final-redhat-00014</version> <configuration> <channels> <channel> <manifest> <groupId>org.jboss.eap.channels</groupId> <artifactId>eap-8.0</artifactId> </manifest> </channel> </channels> <feature-packs> <feature-pack> <location>org.jboss.eap:wildfly-ee-galleon-pack</location> </feature-pack> <feature-pack> <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location> </feature-pack> </feature-packs> <layers> <layer>web-server</layer> </layers> <runtime-name>ROOT.war</runtime-name> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
Git 対応
アプリケーションは Git リポジトリで管理します。 OpenShift は後に指定する Git リポジトリからアプリケーションのソースコードを取得して、ビルドします。 Git リポジトリは OpenShift からアクセスできればどこでも大丈夫です。 今回は、GitHub 上のリポジトリを用います。
Source to Image (S2I)
最後に、Source to Image (S2I) を使用して アプリケーションを含んだ JBoss EAP を作成します。
S2I は、CLI の oc
コマンドを使います。
まずは、アプリケーションのビルドや JBoss EAP の構築に必要なビルダーを取得します。
> oc import-image jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest --from=registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest --confirm
次に、アプリケーションをビルドします。 これには時間がかかります。
> oc new-build eap8-openjdk17-builder-openshift-rhel8:latest~https://github.com/chiroito/jee-traditional.git --name=myapp-build-artifacts
最後に、作成されたアプリケーションをデプロイし、外部からアクセスできるようにします。
> oc new-app --name=myapp myapp-build-artifacts > oc create route edge --service myappv
これで完了です。
OpenShift で確認
アプリケーションが OpenShift にデプロイされたかを確認します。
開発者向けの表示のBuilds
をクリックします。
Buildsに my-app-build-artifacts
というBuildConfigsができているはずです。
最終実行のステータス
が Complete
になっていればビルドは成功です。
Running
はまだビルドしています。
他のステータスになったら、実行を確認しましょう。
最終実行
のカラムにあるmyapp-build-artifacts-1
をクリックします。
ログのタブをクリックするとログが出力されます。
出力されたログから失敗した原因を確認しましょう。
ビルドが成功したら、アプリケーションがデプロイされています。
左側のメニューのトポロジー
をクリックします。
ここにmyapp
というアイコンができているはずです。
これをクリックすると、右側に詳細が表示されます。
その詳細で、青色の丸の中に1 Pod
と表示されていればアプリケーションが起動しています。
0 Pod
の場合はアプリケーションの起動がまだ終わっていないか、起動に失敗しています。
青丸の上のリソースタブを開き、Podsのログを表示して、失敗の原因を確認しましょう。
確認の最後として、アプリケーションへアクセスしてみましょう。 下のアイコンをクリックすると、アプリケーションへアクセスできます。
サンプルアプリケーションを使用している場合は、index.jsp
の Hello World!
が表示されれば成功です。
いかがでしたでしょうか。 今回は、設定をかなり省略しています。 本番ではもう少しちゃんと設定が必要になります。 とはいえ、既存のアプリケーションをOpenShift上にデプロイする流れをイメージできたのではないでしょうか。