レッドハットのソリューションアーキテクトの森です。
クラウドネイティブなCI/CDを実現する手段として、OpenShift Pipelines(Tekton)という機能が今年の5月にGAとなりました。 Red Hat Decision Manager / Process Automation Manager においても、OpenShift Pipelinesと連携し、CI/CDパイプラインを構築して開発・リリースサイクルの自動化をよりお手軽に行うことが可能となっています。 今回は、OpenShift Pipelines を使用して、デシジョンサービスのデプロイを自動化する仕組みを実際に動かしてみたいと思います。
OpenShift Pipelines の詳細については、こちらの記事も合わせて参照ください。
事前準備
1) 使用するプロジェクトを自分のGithubのリポジトリに Fork する
こちらのリポジトリ から Fork してください。

プロジェクトの構成について
- decisions-showcase: DMN で実装するデシジョンサービス
- business-application-service: SpringBoot で実装されるデシジョンサービスの実行サーバー
- business-application-webclient: デシジョンサービスを実行するためのWebアプリケーション
- cicd: アプリケーションへのデプロイを自動化するためのCI/CDパイプラインを実装するためのリソース
2) Fork したリポジトリを、ローカルPCに Clone する
git clone https://github.com/${yourgithubuser}/business-automation-showcase.git
cd business-automation-showcase
3) シェルスクリプトを実行して、環境をセットアップする
先に oc login コマンドを使用して CLI にログインした状態にしておき、ローカルに Clone したフォルダにある以下のシェルスクリプトを実行してください。
./provision.sh
- namespace
rhdm-kieserver-cicdの作成 - OpenShift Pipelines (Tekton) と リソースのインストール
- Webアプリケーションのデプロイ
が行われます。
以下のような出力が表示されればOKです。 出力される2つのURLは、GithubからのWebhookを受け付けるエンドポイントと、WebアプリケーションへのURLになります。
****************************************************************** Use this URL in your GitHub Webhook configuration for automatic deployment http://el-ba-cicd-event-listener-rhdm-kieserver-cicd.apps.cluster-81aa.81aa.sandbox453.opentlc.com Use this URL to access the front-end application: http://business-application-webclient-rhdm-kieserver-cicd.apps.cluster-81aa.81aa.sandbox453.opentlc.com ****************************************************************** Provisioning done! (Completed in 0 min 25 sec)
Webhook の設定
次に、Github のリポジトリ側で、Webhookの設定を行います。先ほど Fork した自分のGitリポジトリにアクセスし、"Settings" -> "Webhooks" から新規のWebhookを設定します。

以下の情報をフォームに入力します:
- Payload URL:
provision.sh実行後に出力される1つ目のURL (以下のコマンドを実行することで取得も可能oc get route el-ba-cicd-event-listener --template='http://{{.spec.host}}') - Content type:
application/json - Secret:
空欄 - Which events would you like to trigger this webhook?:
Just the push event

パイプラインによるデプロイを試してみる
1) ローカルPCに clone をしたプロジェクトフォルダに、ターミナルからアクセスをします。
2) とりあえず commit をして push をします。必要に応じて、以下の空のコミットサンプルを使用してください.
git commit -m "an empty commit to test the pipeline" --allow-empty git push origin master
3) OpenShfit の Webコンソールを開き、"Developerパースペクティブ" -> "Pipeline" -> "ba-cicd-pipeline の最終実行の Pipeline Run" を開きます。 Webhook の設定が正しくできていれば、Github への push をトリガーにして、パイプラインが実行されているはずです。

※ 初回実行時には、Mavenの必要なプラグインや依存関係で必要なものをダウンロードするため少々時間がかかります。
4) デプロイが完了したら、Webアプリケーションを開き、デシジョン実行サーバのURLと認証情報を入力して接続テストをします。
まずはデシジョン実行サーバのURLを取得します。OpenShfit の Webコンソールを開き、"トポロジー" -> " business-application-service-d" -> "Routes" のURLをコピーしておきます。

次に、Webアプリケーションを開いてください。("トポロジー" -> "business-application-webclient" -> "Routes")
右上の歯車アイコンの設定を開きます。
出てきたフォームに、以下の情報を入力して、接続のテストを行ってください。
Successと表示されればOKです。コピーした実行サーバのURLは、末尾に /rest/server をつけるのを忘れないでください。
- Kie Server Base URL: {route URL}/rest/server
- Kie Server Username: kieserver
- Kie Server Paseeword: kieserver1!

5) それでは、実際にデプロイしたサービスを実行してみましょう。Webアプリケーションの左メニューの Decision Models(DMN) を選択し、Decision Name は car-insurance-premium を選択します。入力データのフォームが表示されるので、試しに以下のように入力してみてください。
- Grade: 7
- Age: 40
- Licence: Gold
- Annual mileage: 8000

入力したら、下部の Submit を入力します。入力したデータと共に、基本保険料、各種割引率と、割引後の保険料が表示されます。

デシジョンの内容を変更してデプロイしてみる
1) 今回の自動車保険の保険料算出のルールを解説していきます。 年齢に応じて基本保険料を決定し、等級や免許証の色(ゴールド免許/ブルー免許)、年間走行距離に応じて割引を行い、割引適用後の保険料を算出します。 (実際のルールは、車種や車両保険有無など、色々な条件がありますが、ここでは簡略化して表現しております)
DMNのダイアグラム

年齢による基本保険料
| 年齢 | 35歳未満 | 35〜49歳 | 50〜54歳 | 55〜59歳 | 60〜65歳 | 65歳以上 |
|---|---|---|---|---|---|---|
| 基本保険料 | 42,000 | 35,000 | 32,000 | 34,000 | 36,000 | 40,000 |
等級による割引率
| 等級 | 1等 | 2等 | 3等 | 4等 | 5等 | 6等 | 7等 | 8等 | 9等 | 10等 | 11等 | 12等 | 13等 | 14等 | 15等 | 16等 | 17等 | 18等 | 19等 | 20等 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 割引率 | +64% | +28% | +12% | -2% | -13% | -19% | -30% | -40% | -43% | -45% | -47% | -48% | -49% | -50% | -51% | -52% | -53% | -54% | -55% | -63% |
免許証の色による割引率
| 免許証の色 | Gold | Blue |
|---|---|---|
| 割引率 | -11% | 0% |
年間走行距離による割引率
| 年間走行距離 | 3,000km以下 | 7,000km以下 | 11,000km以下 | 11,000km以上 |
|---|---|---|---|---|
| 割引率 | -24% | -12% | -6% | 0% |
2) VSCode で Clone したプロジェクトを開き、{$workspace_path}/business-automation-cicd-showcase/decisions-showcase/src/main/resources/com/redhat/demos/dmn フォルダの、car-insurance-premium.dmn を開きます。
※ VSCode で DMN ファイルを編集する方法については、以下の記事を参照してください。
grade discount rate のデシジョンを選択して、編集アイコンをクリックします。

3) 等級に応じた割引率が、デシジョンテーブルで設定されています。7行目の grade(等級)が 7等 の場合の割引率を、 "-0.30" -> "-0.35" に変更をしてみましょう。

4) 変更を保存し、変更内容を commit して push します。デプロイのパイプラインがスタートしますが、テストが失敗してパイプラインの実行が中断してしまいます。

5) 等級による割引率のルールを変更したので、シナリオテストの期待値と結果が不一致となったことでテスト失敗となりました。テストに合格するために、出力の期待値を変更する必要があります。
{$workspace_path}/business-automation-cicd-showcase/decisions-showcase/src/test/resources/com/redhat/demos/tests フォルダ内の、car-insurance-premiumTest.scesim を開きます。

1行目のテストが、grade:"7" を入力としています。テストの1行目の期待値を、変更した内容に応じた出力と一致するように、期待値を変更しましょう。以下のように変更しておきます。
- discounted premium: 17543.68 -> 16290.56
- grade discount rate: -0.30 -> -0.35
6) 変更したら、commit して push します。デプロイのパイプラインがスタートするので、完了まで待ちましょう。

7) 完了したら、Webアプリケーションを開き、先ほどと同じ入力でデシジョンルールを実行してみます。

変更したルールの内容に応じて、出力結果が変わっていることを確認することができます。
終わりに
いかがでしたでしょうか? OpenShift Pipelines で CI/CD開発環境を構築し、デプロイの自動化を行うことで、Red Hat Decision Manager / Process Automation Manager の開発をより効率的に行うことができるようになります。ぜひ試してみてください。