はじめに
ここではzAppBuildが提供するビルド・スクリプトについて見ていきます。
※当記事はzAppBuild V3.1.0をベースにしています。
関連記事
DBB/zAppBuildについてのメモ - (1)概要
DBB/zAppBuildについてのメモ - (2)zAppBuildプロパティー・ファイル
DBB/zAppBuildについてのメモ - (3)zAppBuildビルド・スクリプト
DBB/zAppBuildについてのメモ - (4)Metadata Store構成
zAppBuild全体像
ここでは上の赤字部分に着目してみます。
ビルド・スクリプトの確認
スクリプトの基本的なフローを大まかに追ってみます。
build.groovy
build.groovyがzAppBuildが提供する大元のスクリプトで、これがまず最初に実行されます。ここから、必要に応じて各言語ごとのビルド・スクリプトが実行されるという流れになっています。
1.initialize
メソッドinitializeBuildProcess
にて必要な変数設定などを行います。
1-(1) parse incoming options and arguments
ここでは、スクリプト実行時の引数の解析が行われます。引数の解析にはCliBuilderクラスが使用されています。
参考: Class CliBuilder
1-(2) populate build properties
ここでは、build-confのプロパティー・ファイル、application-confのプロパティー・ファイルをそれぞれ読み込み、スクリプトの引数と合わせてプロパティーの設定を行います。
1-(3) create metadata store for this script
User Build以外の場合にmetadata storeのセットアップを行います。(User Buildの場合はmetadata storeは使用されない)
1-(4) handle -r,--reset option
resetオプションが指定された場合、metadata storeから情報を削除します。
1-(5) verify/create/clone the collections for this build
metadata store上にCollectionが無ければ作成します。
(UserBuildの場合はMetadata Storeが作成されていないのでCollectionも作成されません。)
2.create build list
ここでは、指定したオプションに応じたビルド対象となるプログラムのリストを作成します。
オプション等によってビルド対象のプログラムが変わってきます。例えば、User Buildの場合特定のプログラムをビルドすることになるので、引数で指定したプログラムがビルド対象になりますし、Full Buildの場合は含まれる全てのソースがビルド対象になります(application.propertiesのexcludeFileListに指定されたファイルは除外される)。
上のコードは、Full Buildの場合のビルド対象プログラム抽出部分です。
上のコードで、ビルド対象ソースのファイル名のリストを書き出し(⇒buildList.txt)を行っています。
上のコードで、fullBuildの場合にソースをスキャンしてcollectionをUpdateしています。
3.build programs in the build list
2.で作成したビルド対象のプログラムのリスト(buildList)に基づき、実際にビルドのスクリプトを実行していきます。
application-confのapplication.propertiesで指定したbuildOrderの順番に、ビルド用のスクリプトを実行していきます。
メソッドScriptMappings.getMappedList()
を使って、buildListから実行しようとしているスクリプトに該当するプログラムのみ抽出します。たとえばCOBOL用のビルド・スクリプトを実行する際には、buildListからCOBOLソースのみを抽出します。
メソッドrunScript()
を使用して、各言語ごとのビルド・スクリプト(Cobol.groovyなど)を実行します。
※ScriptMappings.getMappedList()
、runScript()
はDBBによって提供されるメソッドです。
参考: DBB APIs - Build properties
Cobol.groovy
ビルド対象のアプリケーションの中にCOBOLのソースが含まれている場合、build.groovyからCobol.groovyが呼び出されることになります。
ここではCOBOL用のビルド・スクリプトであるCobol.groovyの中身を追ってみたいと思います。
1.create language datasets
各言語ごとに必要なPDSデータセットを作成します。例えばソース配置用、ロード・モジュール配置用などです。
ここではDBB提供のCreatePDS()
というメソッドが使用されています。これは、データセットが存在しない場合にのみ新規で作成されることになります。
参考: CreatePDS
2.sort the build list based on build file rank if provided
ここでは、1で作成されたビルド対象ソースのリストについて、ランクに応じてソートします(ランクはプロパティーcobol_fileBuildRank
で指定されます)。
TreeMap
オブジェクトでランクごとのファイルのリストを保持するようにしていますが、TreeMapに追加された値は内部で自動的に昇順ソートされます。
つまり、ランクの数値が低いソースほど優先度が高くなります。ランク付けされていないファイルはリストの最後にAppendされますので優先度は最下位となります。
3.iterate through build list
ここがソースをビルドする本体部分となります。以下のビルド処理を対象のソース・ファイルごとに実行することになります。
3-(1) configure dependency resolution
ソースと直接的な依存関係を持つファイル(COPYBOOKなど)を調べるためのResolverを作成します。
参考: How to manage build dependencies
3-(2) copy build file and dependency files to data sets
ターゲットのソースと、そのソースに直接的に依存関係のあるファイル(COPYBOOKなど)をzFSからPDSにコピーします。
VS CodeによるUserBuildの場合は、VS Code側で対象ソースの依存関係をサーチしてそのリストを作成し、それを引数で渡した上でzAppBuildを呼び出します。そのため、その受け渡されたファイル(userBuildDependencyFile)から依存関係のあるファイルを判別して、PDSにコピーすることになります。
FullBuildの場合は、各対象のソースごとにDBB提供のDependency Scanner機能を使ってソースをサーチして依存関係のあるファイル(COPYBOOKなど)を判別し、PDSにコピーすることになります。
PDSへのコピーは、DBB提供のCopyToPDSクラスが使用されます。
参考: z/OS commands
3-(3) Get logical file
コンパイル対象のソースについてのLogicalFileを生成します。LogicalFileというのは、そのソースファイルの属性情報を以下のような構造で保持しているオブジェクトです。言語、ファイルパス、依存関係のあるファイル、などの情報を含みます。
{
"cics": false,
"dli": false,
"file": "ISEConf2023_MySampleDBB01\/cobol\/TSUB03.cbl",
"language": "COB",
"lname": "TSUB03",
"logicalDependencies": [
{
"category": "COPY",
"library": "SYSLIB",
"lname": "CPPARM03"
}
],
"mq": false,
"sql": false
}
3-(4) create mvs commands
コンパイル対象のソースをPDSにコピーし、コンパイル用、および、リンク・エディット用のコマンド(JCLステップ相当)を生成します。
コンパイル・コマンドの生成
リンク・エディット・コマンド生成
※コンパイル・オプションについて
コンパイル・コマンド生成の中では、以下の関数でCOBOLのコンパイル・オプションがセットされます。
ターゲットのソースがCICSアプリ(isCICSがtrue)の場合はCICS用のオプションが追加され、SQLを含むアプリ(isSQLがtrue)の場合はSQL用のオプションが追加されます。
つまり、CICS提供のトランスレーターやDb2提供のプリコンパイラを使う構成になっている訳ではなく、言語環境提供の統合トランスレーターが使われることになります。
3-(5) execute mvs commands in a mvs job
JOBを開始します。以降のステップを1つのJOBとして実行します。
3-(6) compile the cobol program
先に生成したコンパイル・コマンドを実行します。
3-(7) link/edit
リンク・エディット対象のソースの場合、コンパイルに続けてリンク・エディット・コマンドを実行します。
(他のモジュールに静的リンクしたいソースについては、cobol_linkEditプロパティーでリンク対象外として設定しておくことで、リンク・エディットのステップをスキップできます)
3-(8) perform Db2 Bind only on User Build and perfromBindPackage property
Db2バインド処理対象のものについてはバインド処理を行います。
3-(9) clean up passed DD statements
JOBの終了処理を行います。ここまでのステップが1つのJOBとして実行されることになります。