OpenShift Pipeline で行うデシジョンサービスのデプロイの自動化

レッドハットのソリューションアーキテクトの森です。

クラウドネイティブなCI/CDを実現する手段として、OpenShift Pipelines(Tekton)という機能が今年の5月にGAとなりました。 Red Hat Decision Manager / Process Automation Manager においても、OpenShift Pipelinesと連携し、CI/CDパイプラインを構築して開発・リリースサイクルの自動化をよりお手軽に行うことが可能となっています。 今回は、OpenShift Pipelines を使用して、デシジョンサービスのデプロイを自動化する仕組みを実際に動かしてみたいと思います。

OpenShift Pipelines の詳細については、こちらの記事も合わせて参照ください。

rheb.hatenablog.com

rheb.hatenablog.com

事前準備

1) 使用するプロジェクトを自分のGithubのリポジトリに Fork する

こちらのリポジトリ から Fork してください。

f:id:ka_mori:20210906152046p:plain:w800

プロジェクトの構成について
  • 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を設定します。

f:id:ka_mori:20210906152314p:plain:w800

以下の情報をフォームに入力します:

  • 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

f:id:ka_mori:20210906152404p:plain:w800

パイプラインによるデプロイを試してみる

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 をトリガーにして、パイプラインが実行されているはずです。

f:id:ka_mori:20210906152427p:plain:w800 f:id:ka_mori:20210906152443p:plain:w600

※ 初回実行時には、Mavenの必要なプラグインや依存関係で必要なものをダウンロードするため少々時間がかかります。

4) デプロイが完了したら、Webアプリケーションを開き、デシジョン実行サーバのURLと認証情報を入力して接続テストをします。

まずはデシジョン実行サーバのURLを取得します。OpenShfit の Webコンソールを開き、"トポロジー" -> " business-application-service-d" -> "Routes" のURLをコピーしておきます。

f:id:ka_mori:20210906152512p:plain:w800

次に、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!

f:id:ka_mori:20210906152539p:plain:w800

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

  • Grade: 7
  • Age: 40
  • Licence: Gold
  • Annual mileage: 8000

f:id:ka_mori:20210906152557p:plain:w800

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

f:id:ka_mori:20210906152619p:plain:w400

デシジョンの内容を変更してデプロイしてみる

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

DMNのダイアグラム

f:id:ka_mori:20210906152641p:plain:w600

年齢による基本保険料
年齢 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 ファイルを編集する方法については、以下の記事を参照してください。

rheb.hatenablog.com

grade discount rate のデシジョンを選択して、編集アイコンをクリックします。

f:id:ka_mori:20210906152715p:plain:w600

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

f:id:ka_mori:20210906152732p:plain:w300

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

f:id:ka_mori:20210906152752p:plain:w800 f:id:ka_mori:20210906152807p:plain:w600

5) 等級による割引率のルールを変更したので、シナリオテストの期待値と結果が不一致となったことでテスト失敗となりました。テストに合格するために、出力の期待値を変更する必要があります。

{$workspace_path}/business-automation-cicd-showcase/decisions-showcase/src/test/resources/com/redhat/demos/tests フォルダ内の、car-insurance-premiumTest.scesim を開きます。

f:id:ka_mori:20210906152835p:plain:w800

1行目のテストが、grade:"7" を入力としています。テストの1行目の期待値を、変更した内容に応じた出力と一致するように、期待値を変更しましょう。以下のように変更しておきます。

  • discounted premium: 17543.68 -> 16290.56
  • grade discount rate: -0.30 -> -0.35

6) 変更したら、commit して push します。デプロイのパイプラインがスタートするので、完了まで待ちましょう。

f:id:ka_mori:20210906152858p:plain:w800

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

f:id:ka_mori:20210906152916p:plain:w300

変更したルールの内容に応じて、出力結果が変わっていることを確認することができます。

終わりに

いかがでしたでしょうか? OpenShift Pipelines で CI/CD開発環境を構築し、デプロイの自動化を行うことで、Red Hat Decision Manager / Process Automation Manager の開発をより効率的に行うことができるようになります。ぜひ試してみてください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。