DBB/zAppBuildについてのメモ - (1)概要

# はじめに
メインフレーム(z/OS)のアプリケーション開発プロセスについても、オープン系でも使われている技術を取り込んだ仕組みが取り込まれてきています。
VS Code、IDz、Git、Jenkinsなどとの連携についての記事など書いてきましたが、このような新しい開発プロセスを考える上で重要になるのが**DBB**(Dependency Based Build)という有償製品、および、**zAppBuild**という無償提供のフレームワークです。別の記事でもこれらについては触れていましたが、Updateもあったりするのでここで改めて整理しようと思います。

当記事は、2023年5月時点の情報をベースに記載しています。
[IBM DBB V2.0](https://www.ibm.com/docs/en/dbb/2.0.0)
[zAppBuild V3.1.0](https://github.com/IBM/dbb-zappbuild/releases/tag/3.1.0)

## 関連記事

[DBB/zAppBuildについてのメモ - (1)概要](https://qiita.com/tomotagwork/items/d3b08b10137a0d87416d)
[DBB/zAppBuildについてのメモ - (2)zAppBuildプロパティー・ファイル](https://qiita.com/tomotagwork/items/e6988a708a57d7296350)
[DBB/zAppBuildについてのメモ - (3)zAppBuildビルド・スクリプト](https://qiita.com/tomotagwork/items/f4df3965f62236689584)
[DBB/zAppBuildについてのメモ - (4)Metadata Store構成](https://qiita.com/tomotagwork/items/126907b52c3c8a5ec88d)

# DBB(Dependency Based Build)概要

参考:
[IBM DBB V2.0](https://www.ibm.com/docs/en/dbb/2.0.0)
[GitHub - DBB sample](https://github.com/IBM/dbb)

アプリケーションのビルド(コンパイル/リンク)をサポートする機能を提供する有償製品です。基本的にはz/OS上にインストールして使用するものです。他のz/OS上のプロダクトと同様、SMP/Eで導入できます。
Wazi as a Service提供のStock Imageや、ZD&T提供のADCDにはDBBがインストールされた状態で提供されます。

DBBは主に2つの機能から構成されます。

**(1) DBB Tookit**
DBB Toolkitと呼ばれるコンポーネントがz/OS関連操作(コンパイラ実行、ソースコピーなど)を行うためのJava APIを提供しています。これにより、Groovyでビルド用のスクリプトを記述することができます。
DBB Toolkitが提供するのは基本的にAPIやGroovy関連のライブラリなので、必ずしもz/OS側で何らかのサーバー機能を常駐させておく必要はありません。ただ、これらはJVM上で動くことになりJVMの起動には一般的に大きなコストがかかります。このJVM起動に関するパフォーマンスを改善させるために、DBB Daemonを常駐させておいてビルド指示の度にJVM起動が走ることを回避する、といった使い方をすることもできます。その場合はDBB Daemonの構成をしてDaemonを起動させておく必要があります。
参考: [Improving performance with ZD&T or Java startup by using DBB daemon](https://www.ibm.com/docs/en/dbb/2.0.0?topic=improving-performance-by-using-dbb-daemons)
※特にZD&TのようなIntelベースのCPUを使用した仮想z/OS環境の場合、Java系のパフォーマンスはかなり厳しいものがあるので、このようなJVM再利用などの仕組みを検討する必要があります。

**(2) Metadata Store**
DBBでは、もう一つの主要な機能として、依存関係のメタデータやビルド結果の管理をする機能があります。DBB V1.xではDBB Server(実体はLiberty + Derby/Db2)というコンポーネントをLinux上に立てて、そこでビルドに関するデータを管理していました。DBB V2.0ではこのDBBサーバーは廃止され、Db2(z/OS or LUW)もしくはUSSのディレクトリに、それらのデータを保持することになります。
参考: [Setting up Db2 as the build metadata database](https://www.ibm.com/docs/en/dbb/2.0.0?topic=customization-database-setup)
>The DBB metadata store APIs can create and store build metadata on the z/OS® UNIX file system without needing any customization for prototyping or POC projects when testing with DBB. However, to run in production, it is recommended that you configure an IBM Db2® database to store build metadata.

参考: [Metadata store](https://www.ibm.com/docs/en/dbb/2.0.0?topic=apis-metadata-store)
>Build metadata is information that DBB creates and stores during the build process both for use in future build processes as well as reporting the results of a build. Beginning in DBB v2.0.0, the Liberty Web Application that was used to access the build metadata in earlier DBB versions and its corresponding RepositoryClient toolkit APIs have been replaced with the new MetadataStore toolkit APIs. These new toolkit APIs now directly access the DBB build metadata that is stored either in Db2® databases or on the z/OS® UNIX System Services (USS) file system without the need of an intermediate web application connection. 
...
z/OS UNIX file system metadata store connection
DBB provides an "out of the box" implementation for early prototyping and testing DBB. The z/OS UNIX file system metadata store eliminates the need to set up an IBM Db2 database and instead stores DBB metadata and query indexes on the z/OS UNIX file system in JSON files.
IMPORTANT: NOT TO BE USED FOR PRODUCTION. It does not scale well for applications larger than 1000 source files. The Db2 metadata store is recommended when DBB is used in production.

※上の記載の通り、大量のソースを扱う場合はDb2 Metadata Storeの利用が推奨となります。


# zAppBuild概要

参考: [GitHub - dbb-zappbuild](https://github.com/IBM/dbb-zappbuild)

DBBという製品は、VSCodeやEclipseなどオープン系の開発ツールと連携しやすいように、Groovyでビルドのスクリプトを書ける仕組みを提供してくれています。ただ、それはつまり、これまでJCLで書いていたコンパイル/リンクなどの一連の操作を別のスクリプトで書かないといけないということになります。一からそのようなスクリプトを作るのは大変なので、zAppBuildという汎用的に使えるビルドのスクリプトやプロパティー・ファイルの雛形を提供してくれています。つまり、DBBの拡張ユーティリティーといったような位置づけと考えてよいでしょう。

zAppBuildはGitHubで公開されておりダウンロードして自由に利用可能(Apache-2.0 License)です。基本的にはz/OSのUSS上に展開して利用します。
zAppBuildは、主にプロパティー・ファイルとGroovyのスクリプト群から構成されます。環境やアプリの特性はプロパティー・ファイルでカスタマイズし、汎用的に使えるビルド用のGroovyスクリプトを用いてビルド操作が行われます。
ビルド用のGroovyスクリプトは、COBOL、PL/I、Assemblerや、BMS、MFSなどのソースにも対応したものが提供されています。
参考: [https://github.com/IBM/dbb-zappbuild/blob/main/languages/README.md](https://github.com/IBM/dbb-zappbuild/blob/main/languages/README.md)


【Groovyスクリプト】
dbb-zappbuild/build.groovy : メインとなる汎用ビルド・スクリプトです。
dbb-zappbuild/languages/ : 言語ごとのビルド・スクリプトが配置されています(Cobol.groovy, PLI.groovyなど)。

【プロパティー・ファイル】
大きく以下のカテゴリのプロパティー・ファイルが提供されています。
- **build-conf**: z/OS環境に依存する情報を設定するプロパティー・ファイル(言語環境やミドルウェアのHLQなど)
- **application-conf**: アプリケーションに関連するプロパティー・ファイル(ファイルの特性やビルドに関連する情報など)

zAppBuildが提供するファイル群の配置場所イメージは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d121ac85-cdd0-49cf-3bc8-41d747563056.png)
赤の点線で囲われたファイル群がzAppBuildに関連するものです。

zAppBuildは基本的にはGitで管理されているアプリケーションをビルドすることを想定して各種機能が提供されています。application-confで指定するプロパティーはアプリケーション側、つまり、Gitのリポジトリ上のビルド対象のソースと合せて管理される想定になっています。


zAppBuildを使用したアプリケーションのビルド手順としては、ざっくりと言うとプロパティー・ファイルをカスタマイズしてbuild.groovyを呼び出す、ということになります。
プロパティー・ファイルとしてビルドの特性を指定する以外にも、ビルド実行時(build.groovy呼び出し時)の引数として各種オプションを指定することができます。例えば、以下のようなビルド特性を指定するオプションがあります。

- **--userbuild**: 指定した特定のプログラムをビルドする
- **--fullbuild**: アプリケーションに含まれる全てのソースをビルドする
- **--impactbuild**: 変更があったものと、それに依存するソースのみビルドする

フェーズや用途に応じてこのようなオプションを使い分けることになります。
※ちなみにuserbuildの場合はDBBのMetadata storeは使用されません。

# DBB/zAppBuild利用シナリオの全体像

DBB/zAppBuildが利用される場面としては、主に以下の2つのフェーズがあります。
(1) UTフェーズ: 個別のバグ修正や機能追加など特定のソースを修正してビルドする。(User Buildと呼ばれる)
(2) ITフェーズ: ある程度蓄積された修正を一括でビルドする。(Full Buildと呼ばれる)

活用例の全体像を以下に示します。赤枠で示されたものがDBB/zAppBuildに関わるコンポーネントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5fba1e1e-ee05-b58e-cf68-71a6bf7923bb.png)


具体的なDBB/zAppBuild利用のシナリオは、以下の記事もご参照ください。

[VSCodeを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/4bdd0b5a7284b5102d10)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/da039208be2f77c21285)
[Jenkins - z/OS連携: (5) Pipeline+Git+DBBの利用](https://qiita.com/tomotagwork/items/0b25bbb9a72e37f4d98c)
[Jenkins - z/OS連携: (6) Jenkins Pipeline利用シナリオ](https://qiita.com/tomotagwork/items/9d2b3f697f31f23fd682)


# 基本セットアップ

## DBB

DBB本体は他のz/OSのS/Wと同様にSMP/Eを使用してインストール可能です。
参考: [Installing and configuring the DBB toolkit on z/OS](https://www.ibm.com/docs/en/dbb/2.0.0?topic=SS6T76_2.0.0/setup_dbb_toolkit.htm)

また、必要に応じてメタデータ格納用のDb2をセットアップします。
参考: [Setting up Db2 as the build metadata database](https://www.ibm.com/docs/en/dbb/2.0.0?topic=customization-database-setup)

詳細はここでは割愛します。

## zAppBuild
GitHubリポジトリ: [dbb-zappbuild](https://github.com/IBM/dbb-zappbuild)


### USS上にzAppBuildをクローン
GiHubに提供されている上のリポジトリをz/OSのUSS上にクローンします。

例

```
git clone https://github.com/IBM/dbb-zappbuild.git
```

ここでは、`/u/ibmuser/dbb-zappbuild`にクローンするものとします。
(USS上にGit Clientが無い場合や、直接GitHubにアクセスできない場合は、PC経由などでファイル転送して上のリポジトリの内容をUSS上に配置できればOK)

build-conf以下のプロパティー・ファイルを環境に合わせてカスタマイズします。

### application-conf

zAppBuildで提供されるapplication-conf以下のサンプル・プロパティー・ファイルを、ビルド対象のアプリケーションを管理しているGitリポジトリのトップ・レベルにコピーしカスタマイズします。

プロパティー・ファイルについては後続記事にて補足します。