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 ImageBuildの部分を処理します。一旦ビルドされると、画像はOpenShiftでImageStreamとしてプッシュされます。これはShipの部分です。最後に、DeploymentConfigImageStreamを使用することができます。これは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と組み合わせると、迅速なアプリケーション開発が継続的に可能になります。今日説明したさまざまな選択肢を使って、あなたの使用事例についてフィードバックをお送りください