IBM i MerlinをOpenShift 3ノードクラスターに導入してみる

本記事ではIBM iアプリケーションの開発とモダナイゼーションの環境である[IBM i Merlin](https://www.ibm.com/jp-ja/products/ibm-i-merlin) をオンプレのOpenShift 3ノードクラスターに導入したときの手順を紹介します。

OpenShift 3ノードクラスターの導入は以下の記事を参考にしてください。
https://qiita.com/mmitsugiw/items/9c82bff35a24a1654d39

# IBM i Merlin Operatorの導入
まずOpenShift上にIBM i MerlinのOperatorを導入します。
導入のためにはライセンスキーとなるentitlement keyが必要になりますので事前に取得しておきます。

IBM i Merlinのためのプロジェクトを作成します。今回はOpenShift Webコンソールから作成します。
ホーム -> プロジェクト -> プロジェクトの作成
から作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/41367f9e-01a7-81c0-5fdd-894065b445c6.png)
entitlement keyをOpenShiftに登録します。こちらはOpenShift CLIにてbastionノードなどから作業していきます。下記にbastionノードで作業する場合の例を示します。
登録はentitlement keyをOpenShiftのglobal pullsecretに追加することで行います。
現在のglobal pullsecretを取得します。
```
# export KUBECONFIG=/root/config/auth/kubeconfig
# oc extract secret/pull-secret -n openshift-config --to=.
```
entitlement keyをbase64にてエンコードします。出力を控えておきます。
```
# printf “cp:<entitlementkey>” | base64
```
控えた出力を.dockerconfigjsonに以下の内容で追加します。 
```
"cp.icr.io": {
"auth": "控えたentitlement keyのbase64エンコード",
"email": "IBM IDに登録されているメールアドレス"
}
```
編集した.dockerconfigjsonをOpenShiftに反映させます。
```
# oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson
```
この後、OpenShiftの各ノードが自動でrestartします。`oc get nodes`などでrestartが完了したことを確認します。

次にOperatorを導入するためのカタログソースを追加します。OpenShift Webコンソールから
管理 -> カスタムリソース定義 -> CatalogSource -> インスタンスタブ -> CatalogSourceの作成
で作成します。
* カタログソース名: ibm-operator-catalog
* イメージURL: icr.io/cpopen/ibm-operator-catalog:latest
* 高可用性: クラスタースコープのカタログソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/98f2feef-1053-2dbb-b9f5-3344c0702502.png)

最後にOperatorHubからOperatorを導入します。OpenShift Webコンソールから
Operator -> OperatorHub -> "merlin"と入力して検索を行い、
IBM i Modernization Engine For Lifecycle Integration
を選択し、Installボタンをクリックすると以下のような画面となりますのでnamespaceに先ほど作成してプロジェクトを選択してインストールを実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/972b2caf-7f5d-6cd8-e362-5ab91c53d500.png)
無事インストールが終了すると以下の画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/bb7311b9-7426-5f11-72ca-33997565e691.png)

# IBM i Merlinインスタンスの作成

OpenShift WebコンソールからIBM i Merlinインスタンスを作成します。
プロジェクトとして作成したプロジェクトを選択した状態で
Operator -> インストール済みOperator
に行き、
IBM i Modernization Engine For Lifecycle Integration
クリックします。Merlinタブを選択し、Merlinの作成をクリックします。
以下の画面でインスタンス名を入力、ライセンスの確認を行った後に作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/05024a80-7072-38fa-c93a-7e0d22d61e05.png)
再度Merlinタブを確認し、ステータスが以下のようにCondition:Reconciledとなっていれば作成完了となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/ca037193-d0bb-9b95-8f6e-dbea26b14977.png)
作成したインスタンスをクリックすると、以下のようにIBM i MerlinのURLが表示されるのでアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/96f92ac4-de68-20c9-a48a-e67089717797.png)
管理者のユーザー名 (デフォルトはadmin)とパスワードはOpenShift Webコンソールの
ワークロード -> シークレット -> merlin-credential-secret
のADMIN_USERNAMEとADMIN_PASSWORDで確認できます。

# IBM i Merlinを使用するための証明書のセットアップ

IBM i MerlinをWebブラウザにて使用するためには使用しているブラウザに応じて証明書の設定が必要となります。使用しているブラウザに応じて、下記のARCAD Softwareの動画を参照して設定してください。
https://www.youtube.com/playlist?list=PLPELYviDwCnY6L5r5ZnmCneqhakLcB7ko

# IBM i Merlinの初期設定

無事Merlinにログインできたら、Merlinの初期設定を行なっていきます。

初期設定は、@koga39chan さんと @meo_kawa さんの下記記事を参照して設定してください。
https://qiita.com/koga39chan/items/90638f30f65c62177967

ポイントは以下となるかと思います。
* 初期設定で行うVaultのセットアップのシークレットとトークンは必ず控えておく
  (OpenShiftの再起動等の後に入力を求められる場合があります)
* IBM i Developerは使用するユーザーごとにインストールを行う
* IBM i CI/CDのインストールは使用するJenkinsの単位で行うので、管理者のみインストールを行う
* IBM i Merlinのユーザー管理はLDAP連携も可能 (未検証)
* IBM i の接続およびtemplate実行にはIBM i側にsshおよびyumの設定が必要

# IBM i Developerのセットアップ

まずIBM i Developerを使用したいユーザーにアクセス権限を追加します。
許可 -> 許可の管理
にてIBM i Developerのインストール時に指定したプロジェクトに各ユーザーのEDITアクセス権限
を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/52743d3b-dc14-ae7e-fb56-0414768c8f71.png)
その後IBM i Developerを使用したいユーザーでMerlinにログインし直すと、
ログイン後の画面に以下のようにIBM i Developerへの起動リンクが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/9f3f4e3b-ef3a-cb27-d8d1-6e8aff7a1737.png)
IBM i Develoerを起動する前に、IBM iへの接続を上記と同じ手順で各ユーザー側でも作成しておきます。
接続 -> 在庫
でIBM iのホスト名(もしくはIPアドレス)を定義
接続 -> Credentials
でアクセス情報
接続 -> テンプレート
で両者の紐付けをしておきます。

この後、先ほどの起動リンクからIBM i Developerの起動をします。
Create Workspaceにてワークスペースを作成します。
Quick Addタブでサンプルを選ぶか、Git Repo URLを指定する
もしくはCustom Workspaceでワークスペースを作成します。
今回はGit Repo URLを指定したのですが、GitHub上のDevfileのraw URLを指定する必要がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/529baad9-d86d-e474-2187-79985ab3af80.png)
以下のようにIBM i Developerの画面が表示されます。
GitHubの認証情報等が必要な場合は認証のプロンプトが上部に表示されるため、認証情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/90da7dbb-6afa-2437-c8ff-f1da92ce7d36.png)
下記のリンクのようにSSH KeyをGitHubに登録することも可能です。
https://ibm.github.io/merlin-docs/#/./guides/crw/main?id=connecting-to-git-repositories
Gitの操作はワークスペース上のSourceControlビューで行うか、画面右側のtheiaコンテナ上のNew terminalからコマンド操作で行うことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/8682cb07-1fca-28ae-6958-d41dd793350a.png)
使用するIBM iへの接続は以下のリンクの手順で行います。この際、先ほど作成したテンプレートを指定するようにします。
https://ibm.github.io/merlin-docs/#/./guides/crw/main?id=connecting-to-a-remote-system

プロジェクトのビルドは
View -> Find Command
でIBM i Developer: Build Projectにて実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/d6896461-d77d-5652-3661-18a6c317c7b0.png)
各プログラムのデバッグも
IBM I PROJECT EXPLORER -> IBM i -> Object Libraries
などから指定のプログラムを選択し、Debug As Batchをクリックすることで実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/665cd526-601a-e30d-0139-53af750066d5.png)
BreakpointやWatchの設定も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/98dea158-485d-5f11-e4b7-8a4e45f63200.png)

# IBM i CI/CDのセットアップ
IBM i CI/CDはビルドやデプロイの自動化を行い、CI/CDのフローを実現することが可能となります。
CI/CDのセットアップはadminにて行います。
MerlinのWeb画面のホームからIBMi CI/CDをクリックし起動します。

Jenkinsの構成 -> Jenkinsサーバー
にてCI/CDで使用するJenkinsのセットアップを行います。
Jenkinsサーバーは内部で自動生成させるか、外部のサーバーを参照するか選択できます。

今回は以下の手順でbastionノードにJenkinsサーバーを構築しました。
Jenkinsを以下のコマンドでインストールします。
```
# dnf -y install java-11-openjdk java-11-openjdk-devel
# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# dnf -y install jenkins
```
`/usr/lib/systemd/system/jenkins.service`を編集し以下の環境変数を追加します。
```
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el8_7.ppc64le"
Environment="JENKINS_JAVA_CMD=/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el8_7.ppc64le/bin/java"
Environment="JENKINS_PORT=8100"
```
Jenkinsサーバーを起動します。
```
# firewall-cmd --add-port=8100/tcp --zone=public --permanent
# firewall-cmd --reload
# systemctl enable jenkins
# systemctl start jenkins
```
`http://(bastion IP):8100`にアクセスしてJenkinsのセットアップを完了させます。

IBM i CI/CDのJenkinsの初期化処理に上記Jenkinsサーバーの情報を入力して、初期化を完了させます。
初期化が完了すると以下の画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/c6513492-2c30-f3a3-d092-19128ac4de35.png)
上記に画面にあるとおり、外部Jenkinsサーバーを使用する場合はibmiplugin.jarをダウンロードして/home/merlin/resources以下に配置しておく必要があります。このjarにJekinsからアクセスできるように必要に応じてアクセス権限も変更しておきます。

次に必要なJenkinsのプラグインをインストールします。
Jenkinsの構成 -> Jenkinsプラグイン
にて欠落しているプラグインが表示されるので、これらのプラグインをJenkinsにインストールします。

これでCI/CDのタスクが実行できる準備ができたので、
タスク管理 -> 新規タスクの作成
にて自動化タスクを作成します。
例として以下のようなタスクを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/c71e401d-eb1d-4321-0a75-4f3e8ca996e6.png)
ビルド部分はCLコマンドでの実行が可能です。
(今回はテストのCLコマンドを入れています)

タスク管理 -> タスク・ダッシュボード
でタスクを選択し、右クリック -> タスクの実行で実行を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/10d84f22-cb24-9149-ab6a-c409a239ba31.png)
実行したタスクは
Jenkinsの構成 -> Jenkinsジョブの管理
にて一覧を見ることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/034878e8-1bdd-df5a-8bdb-6bcceb267914.png)
Jenkinsサーバー側で詳細のジョブの詳細を確認することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419719/06558be0-5329-fce6-9ce3-81b524330a7c.png)
作成したジョブはJenkins側で追加設定を行うことで定期実行やGitHubとの連携実行も可能となります。