Nuxeoでは、開発者が楽に作業できるように常に努力を重ねています。たとえば、当社のNuxeo Studioを使用すれば、新しいドキュメントタイプ、新しいワークフロー、ルールを定義することで、顧客(およびその開発者)が数回のクリックでビジネスロジックをカスタマイズできます。しかし、ユースケース(適用例)が重要なカスタマイズを必要とする場合、開発者はカスタムコードをJavaで記述し、そのコードを新しいバンドルを通じてNuxeo Platformに展開する必要があります。そのために、市場の展開を非常に簡単にする独自のNuxeoパッケージを提供しています。
当社のブログの読者なら、我々が OpenShift Container Platform に関心があることにお気づきでしょう。展開のことを考えて、OpenShiftも検討しました。OpenShiftで継続的な展開オプションを提供したかったのです。つまり、新しいコードと新しいテストを記述し、コードをGithubにプッシュすると、Nuxeo開発インスタンスに展開されるからです。この展開をどのように実現するのか、詳しく見てみましょう。
OpenShiftのSource To Image
OpenShiftで展開を作成する戦略として、「sourceStrategy」を使用することが考えられます。基本的には、Githubリポジトリがプロジェクトをビルドすることになります。
デフォルトでは、「Dockerfile」を使ってプロジェクトをビルドする方法が提示されますが、プロジェクトのビルド方法、パッケージ方法、プロジェクトを含むDockerイメージの作成方法を提示するビルドイメージを指定することができます。このプロセスは、Source To Imageとして知られています。入力としてコード(Javaなど)がいくつかあり、出力として実行できるDockerイメージが用意されています。
DockerミームのBuild、Ship、Runでは、Source To ImageはBuildの部分を処理します。一旦ビルドされると、画像はOpenShiftでImageStreamとしてプッシュされます。これはShipの部分です。最後に、DeploymentConfigでImageStreamを使用することができます。これはRunの部分です。
Nuxeo S2I イメージ
その完全な展開サイクルを実行できるように、Nuxeoプロジェクトを構築するNuxeo S2I(Source to Image)Dockerイメージを作成して、JDK、Maven、およびNodeツールを提供します。
Nuxeo CLIを利用してダミーのNuxeoプロジェクトを作成しましょう。
# mkdir nuxeo-s2i-sample
# cd nuxeo-s2i-sample
# nuxeo bootstrap single-module
...
info You'll be prompted for generation of:
info nuxeo-s2i-sample-core: single-module
create Generate Module: nuxeo-s2i-sample-core
create Generating Single module
info Parameters: Parent group, Parent artifact, Parent version, Nuxeo version, Project group, Project artifact, Project version, Project description
? Parent Group id (use white space to cancel default value.): org.nuxeo
? Parent Artifact id: nuxeo-addons-parent
? Parent Version: 9.2
? Project Group id: org.nuxeo.sample
? Project Artifact id: nuxeo-s2i-sample
? Project version: 1.0-SNAPSHOT
? Project description: Sample project to demonstrate S2I usage
create pom.xml
create src/main/resources/META-INF/MANIFEST.MF
create src/main/java/org/nuxeo/sample/package-info.java
create src/test/resources/jndi.properties
create src/test/resources/log4j.xml
info You can start editing code or you can continue with calling another generator (nuxeo bootstrap [<generator>..])
しばらくすると、Nuxeoイメージのように実行できる「nuxo-s2i-sample」Dockerイメージが作成されます。
docker run --rm -ti -p 8080:8080 nuxeo-s2i-sample
配信情報の[Admin Center](http://localhost:8080/nuxeo/nxadmin/default/default-domain@view_admin?tabIds=NUXEO_ADMIN%3ASystemInfo%3ANuxeoInfo)で、パッケージが展開されているかどうか確認できます。
OpenShiftでSource to Imageを使用する
OpenShiftは「s2i」の使用方法を知っています。Nuxeo S2Iイメージを参照するリソースを作成するだけでよいのです。この作業はImageStreamを介して行われます。
apiVersion: v1
kind: ImageStream
metadata:
name: nuxeo-s2i
annotations:
openshift.io/display-name: Nuxeo Source to image
spec:
tags:
- name: "latest"
annotations:
openshift.io/display-name: Nuxeo (latest)
description: |
Build and run a Nuxeo application. For more information about using this builder image, see https://github.com/nuxeo-sandbox/nuxeo-s2i
WARNING: By selecting this tag, your application will automatically update to use the latest version of Ruby available on OpenShift, including major versions updates.
iconClass: icon-java
tags: builder, java, nuxeo
supports: nuxeo
sampleRepo: https://github.com/nuxeo/nuxeo-sample-project
from:
kind: ImageStreamTag
name: "9.3-SNAPSHOT"
- name: "9.3-SNAPSHOT"
annotations:
openshift.io/display-name: Nuxeo 9.3-SNAPSHOT
description: |
Build and run a Nuxeo application. For more information about using this builder image, see https://github.com/nuxeo-sandbox/nuxeo-s2i
iconClass: icon-java
tags: builder, java, nuxeo
supports: nuxeo
sampleRepo: https://github.com/nuxeo/nuxeo-sample-project
from:
kind: DockerImage
name: nuxeo/s2i:master
その後、Add projectボタンを使用して、作成されたImageStreamを選択することで、新しいNuxeoプロジェクトを作成することができます。
NuxeoプロジェクトのGithubリポジトリアドレスを参照します。
これでできました!OpenShiftはS2Iイメージを呼び出し、Mavenプロジェクトをビルドし、ターゲットディレクトリ内のアーティファクトを見つけて、Nuxeo Dockerイメージの「bundles」ディレクトリに追加し、イメージをプッシュしてからDeploymentConfigに展開します。
Nuxeo Platformが起動したら、パッケージが「rsh」によってコンテナにインストールされているかどうかをチェックし、「bundles」ディレクトリにインストールされているパッケージをリストすることができます。
# oc get po
NAME READY STATUS RESTARTS AGE
nuxeosample-1-7z7s2 1/1 Running 0 5m
# oc rsh nuxeosample-1-7z7s2
nux...z7s2:/opt/nuxeo/server$ ls /opt/nuxeo/server/nxserver/bundles | grep sample
nuxeo-s2i-sample-1.0-SNAPSHOT.jar
継続的な展開
Nuxeoプロジェクトは空ですので、動作をいくつか追加して、現在のポッドの代わりに展開したいと思います。これを行うために、Githubに変更を適用し、新しいビルドを起動して新たな展開を開始することができます。また、webhookを使用して手動で構築するステップを避けることもできます。
OpenShiftでは、Nuxeoビルドを編集し、詳細設定パネルを開きます。そこで、「Triggers」を探し、GitHub webhookエンドポイントをコピーすることができます。
次に、Githubで、各コミットでそのエンドポイントを対象とするwebhookをセットアップします。
ここで、新しく作成された各ノートの説明を更新するリスナーを作成します。Nuxeoで「Note」文書を作成する際、その説明は「Happily deployed thru s2i(s2iを介して適切に展開)」に更新されます。
# nuxeo bootstrap listener
...
create Generating Listener
info Parameters: Listener package, Listener class name, Trigger on event, Custom events, Is it an asynchronous listener, Is it a post commit listener
? Listener package: org.nuxeo.sample
? Listener class name: NoteCreationListener
? Trigger on events: aboutToCreate
? Is it an asynchronous Listener? No
? Is it a post-commit Listener? No
info Maven dependency: org.nuxeo.runtime:nuxeo-runtime-test:::test
info Maven dependency: org.nuxeo.ecm.platform:nuxeo-platform-test:::test
info Maven dependency: org.nuxeo.ecm.core:nuxeo-core-event
force pom.xml
force src/main/resources/META-INF/MANIFEST.MF
create src/main/java/org/nuxeo/sample/NoteCreationListener.java
create src/test/java/org/nuxeo/sample/TestNoteCreationListener.java
create src/main/resources/OSGI-INF/notecreationlistener-listener-contrib.xml
info You can start editing code or you can continue with calling another generator (nuxeo bootstrap [<generator>..])
次に、「src/main/java/org/nuxeo/sample/NoteCreationListener.java」のJavaコードを編集して、リスナーがドキュメントを更新できるようにします。
public class NoteCreationListener implements EventListener {
@Override
public void handleEvent(Event event) {
EventContext ctx = event.getContext();
if (!(ctx instanceof DocumentEventContext)) {
return;
}
DocumentEventContext docCtx = (DocumentEventContext) ctx;
DocumentModel doc = docCtx.getSourceDocument();
// Add some logic starting from here.
doc.setPropertyValue("dc:description","Happily deployed thru s2i");
}
}
コミットしてGitHubにプッシュすると、OpenShiftビルドが開始され、展開が行われます。それが動作するかどうかを確認するために、テスト用の「Note」ドキュメントを作成すると、これで説明文が更新されます!
S2Iイメージでさらに展開
基本形式では、S2Iイメージは「target」ディレクトリにある任意のJARを取得し、「$NUXEO_HOME/nxserver/bundles」フォルダにコピーします。マルチモジュールプロジェクトがある場合、これは適切でないかもしれません。もっと設定を自由にするために、展開する必要のあるものを指定する「.nuxeo-s2i」マニフェストファイルをプロジェクトのルートに追加することができます。もちろん、Nuxeoパッケージを指定することもできます。サンプルファイルは次のようになります。
# Directory where to find JAR artifacts to deploy
#ARTIFACT_DIR=target
# Nuxeo package to deploy
#NUXEO_PACKAGE=sample-package/target/sample-package-*.zip
# Whether to start Nuxeo in a test phase and do some smoke tests
#NUXEO_SMOKE_TEST=false
これはほんの始まりにすぎません。展開されたNuxeoインスタンスでMaven統合テストを実行するなど、他の機能を追加することができます。お気軽に、ご意見をお送りください!
最後に、「assemble」スクリプトがあなたのニーズに合っていない場合でも、source-to-imageの指示に従って独自のスクリプトを指定することができます。
継続的な開発フロー
S2Iは、コードを実行可能なDockerイメージに変換する非常に簡単なツールと見なすことができます。OpenShiftを使用することで、開発と展開のプロセスを完全に自動化することができます。
Nuxeo S2Iイメージは現在進行中のプログラムです。これをNuxeo Studioと組み合わせると、迅速なアプリケーション開発が継続的に可能になります。今日説明したさまざまな選択肢を使って、あなたの使用事例についてフィードバックをお送りください。