VSCodeを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携

# はじめに
メインフレームのアプリケーションについても、オープン系のアプリケーションで使われているような作法で、ソース管理やビルドのツールを利用することができます。
ここでは、Gitを使ったソース管理とDBB(Dependency Based Build)という有償のツールを使用したビルドをVSCodeから行う方法について記載します。

## 関連記事
[VSCodeを使用したメインフレーム・アプリケーション開発 - (1)概要](https://qiita.com/tomotagwork/items/085b91098fce3aabaeaf)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (2)z/OS基本操作](https://qiita.com/tomotagwork/items/9496dbc121cc5bf17b29)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (3)ソース編集](https://qiita.com/tomotagwork/items/f4008d1ead61e8a263ae)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/4bdd0b5a7284b5102d10)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (5)デバッガーの利用](https://qiita.com/tomotagwork/items/2ce806f5747bc72f9474)
[VSCodeを使用したメインフレーム・アプリケーション開発 - (6)FTP経由での接続](https://qiita.com/tomotagwork/items/a2f82db16d18a8fd9d21)


# 全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4abc4d1d-b147-84c7-c627-56f9535e1456.png)

オープン系で使われているような作法と同じように、以下のような手順でソースの編集が行えます。ここで主にターゲットとしているシチュエーションとしては、Small Scale User Buildと呼ばれているようなもので、個別のバグフィックスなど1～2つのソースを修正するようなケースです。

(1) **clone/pull**: リモートのリポジトリの内容ををローカル・リポジトリーに取り込みます。
(2) **編集**: VSCode上でCOBOL, PL/Iなどのソースを編集します(前の関連記事のイメージ)。
(3) **ビルド**: z/OS上に変更したソースを転送してコンパイル/リンクします。
(4) **テスト**: 修正が正しく行われたかどうか単体テストします。
(5) **push**: 修正が完了したら修正内容をGit Serverのリポジトリーに反映させます。

(2)～(4)を回してソースの修正を行うことになると思いますが、「(4)テスト」の部分はz/OSアプリの場合一工夫必要になります。ここは言語(COBOL, PL/I, ASM)、利用するミドルウェア(CICS、Db2、IMS、MQ、...)、テスト対象のプログラムの呼び出し形態(バッチ実行、3270画面経由、サブルーチンコール、API、...)などによってテストのやり方が異なるからです。
テスト部分については用途に応じたテストツールが色々と提供されていたり、デバッガーなどを用いたトライ&エラーを行いたい場合があったりと、バリエーションも豊富なのでこの記事では取り上げません。例えばPCOM経由でこれまでと同じような手法で単体テストしたり、別途テストツールを用いてテストする、あるいは自動化してビルドスクリプトに組み込む、といったことが考えられますが、ここでは一旦なにかしらの方法で単体テストをするステップが入るものと考えておいてください。

## ソース管理
これは一般的なオープン系アプリケーションのソース管理で利用されている、VSCodeが元々持っているGit連携機能をそのまま使います。GitHubなどのGitサーバーと連携してソース管理が行えますので、COBOLやPL/Iなどz/OS向けのアプリケーションのソースもこれで管理しましょう、ということです。
これはz/OS特有の話ではないのでVSCodeとGit連携そのものについてはここでは深くは触れませんが、以下参考程度に。

PC上にGitを導入しておく必要があります。
[git for Windows](https://gitforwindows.org/)
Windowsであれば上のサイトからV2.30.1をダウンロードしてインストール(設定はデフォルト)

```
c:\>git --version
git version 2.30.1.windows.1
```


VSCodeではGit連携の基本的な機能は元々提供されているようですが、より便利に扱えるようにするためのGit関連のExtensionがいくつか提供されているようです。Git Historyというのが便利そうなので入れてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ee6eb989-4bf0-399d-358d-d1849060455d.png)


## ビルド
オープン系のアプリケーションの場合、Javaやnodejsなどはローカルの環境でビルドやテストがある程度できたりしますが、z/OSアプリケーション(COBOL, PL/I, ASM,...)の場合はコンパイル/リンク、テストはz/OS上で実行する必要があります。そのためには、必要なファイル群をz/OS上に転送しソースにあったJCLを実行する、といったことをする必要があります。この辺りの操作を簡素化する仕組みを、DBBを中心とした機能で提供してくれています。

関連する要素技術を補足します。

### DBB(Dependency Based Build)
参考:
[IBM Dependency Based Build](https://www.ibm.com/docs/en/dbb/1.1.0)
[GitHub - DBB sample](https://github.com/IBM/dbb)

アプリケーションのビルドをサポートする機能を提供する有償製品です。基本的にはz/OS上にインストールして使用するものです。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/1.1.0?topic=improving-performance-by-using-dbb-daemon)

DBBではもう一つDBB Serverというコンポーネントも提供しています。これはz/OSではなくLinux上に立てるサーバー(実体はLiberty)で実装される機能で、ソースの依存関係のメタデータを管理したりビルド結果を管理させることができます。当記事ではこの部分については触れません。

ちなみにWazi Developer for Red Hat CodeReady Workspacesという製品にはDBBが含まれています。

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

DBBという製品は、VSCodeやEclipseなどオープン系の開発ツールと連携しやすいように、Groovyでビルドのスクリプトを書ける仕組みを提供してくれています。ただ、それはつまり、これまでJCLで書いていたコンパイル/リンクなどの一連の操作を別のスクリプトで書かないといけないということになります。一からそのようなスクリプトを作るのは大変なので、zAppBuildという汎用的に使えるビルドのスクリプトやプロパティーファイルの雛形を提供してくれています。これはGitHubで公開されておりダウンロードして自由に利用可能です( Apache-2.0 License)。
これは、z/OSのUSS上に展開して利用します。

### Z Open Editor Extension
参考: 
[IBM Z Open Editor Documentation](https://ibm.github.io/zopeneditor-about/Docs/introduction.html#key-capabilities)
[IBM Z Open Editor概要](https://qiita.com/tomotagwork/items/f4008d1ead61e8a263ae#ibm-z-open-editor%E6%A6%82%E8%A6%81)

Z Open Editor Extensionは前の関連記事でも書きましたが、VSCode上でCOBOLやPL/Iなどのソース編集をサポートしてくれる機能が提供されます。ただ、それだけではなく、このExtensionではDBBとの連携機能も提供されており、VSCodeからz/OSに対してビルド指示を行うことが出来るようになっています。
VSCodeからDBBへの連携の際は内部的にZowe CLIが使われますが、z/OSMFとの接続だけではなくSSH接続も必要なため、Zowe CLIのssh-profileも作成しておく必要があります。

# 構成(事前準備)

## z/OS側
DBB toolkitとzAppBuildの構成は基本的に環境毎に1度実施すれば複数ユーザーで共有して利用できます。

### DBB toolkit
DBB toolkitをz/OS上にインストールしてセットアップする必要があります。
ここでは詳細は割愛します。

参考: [Installing and configuring the DBB toolkit on z/OS](https://www.ibm.com/docs/en/dbb/1.1.0?topic=dbb-installing-configuring-toolkit-zos)

### zAppBuild
zAppBuildの構成としては、GitHubで提供されているファイル群をUSS上に展開し、環境依存の情報をプロパティ・ファイルに設定する、ということを行います。

#### ファイルの展開
USS上にもGitのクライアントを導入することができますので、USS上にGitクライアントがあってGitHubと接続できる環境であれば、直接USS上にzAppBuildのファイル群をCloneすることができます。
ただ、z/OSから直接外部のGitHubに接続できる環境を整えるのは難しいことも多いと思いますので、ここでは、一旦PC上にCloneをしてそれをz/OSにz/OSMF経由(Zowe CLI経由)で転送する方法でやってみます(以下のイメージ)。
※せっかくなのでここでもVSCodeやZowe CLIが活用できるのでそれでやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e921f51b-e30f-2330-f8df-f48a7322f10e.png)

適当なワークスペースを作成し、そこでコマンドパレット(Ctrl+Shft+P)からGit Cloneを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9b21f819-3525-ed7e-1621-70782870934a.png)

zAppBuildのリポジトリのURLを指定します。(https://github.com/IBM/dbb-zappbuild.git)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2d441136-bf22-48ee-d0b4-14fc829d9877.png)

クローン先のローカルのディレクトリを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c796d4b2-994b-bbd6-6f7b-5f755855f3b0.png)

クローンされたディレクトリをワークスペースに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5db816a2-0c1f-3499-5b9e-8d8c60e5a69e.png)

dbb-zappbuildがローカルにクローンされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/78fdc2e2-d362-d0f1-bc73-4dd1cb0ef3b3.png)

このdbb-zappbuild以下をUSS上に転送しますが、ここではzowe cliのコマンドを使用してみます。
参考: [zowe › zos-files › upload › dir-to-uss](https://docs.zowe.org/stable/web_help/index.html?p=zowe_zos-files_upload_dir-to-uss)

まず、ファイル転送の仕方を指定するために、dbb-zappbuildディレクトリ直下に、.zosattributesというファイルを新規作成し、以下のように編集します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/887e15bf-356d-f259-9bfb-8883e0185a2f.png)

```txt:dbb-zappbuild/.zosattributes
# Don't upload
**/.git/** -
# pattern local-encoding remote-encoding
*.* UTF-8 1399
```

USS上に、ファイル転送先のディレクトリを作成しておきます。こでは、`/u/dbb_common/dbb-zappbuild`とします。

```
TAGUCHI:/u/dbb_common: >ls -la
total 48
drwxr-xr-x   3 TAGUCHI  SYS1        8192 Feb 21 13:56 .
drwxrwxr-x  28 OMVSKERN SYS1        8192 Feb 20 20:44 ..
drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 dbb-zappbuild
```

次にPC上でコマンドプロンプトを開いて、Cloneを作成したディレクトリに移動し、以下のコマンドでdbb-zappbuild以下を転送します。

```
C:\y\VSCode_workspace\WaziTest03>zowe zos-files upload dir-to-uss "dbb-zappbuild" "/u/dbb_common/dbb-zappbuild" --recursive --zosmf-profile prof_Wazi01
success: true
from:    C:\y\VSCode_workspace\WaziTest03\dbb-zappbuild
to:      /u/dbb_common/dbb-zappbuild

Directory uploaded successfully.
```

一通りファイルが転送されたら、必要に応じて権限設定を行います。ここでは複数ユーザーで共有する想定なので、同一グループメンバーが編集できるように、group属性にwrite権限を付与します。

```
TAGUCHI:/u/dbb_common: > chmod -R g+w dbb-zappbuild
```

<details><summary><font color="blue">USS上に展開されたディレクトリ、ファイル一覧</font></summary><div>

```
TAGUCHI:/u/dbb_common: >ls -laTR

.:
total 48
                    drwxr-xr-x   3 TAGUCHI  SYS1        8192 Feb 21 13:56 .
                    drwxrwxr-x  28 OMVSKERN SYS1        8192 Feb 20 20:44 ..
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 dbb-zappbuild

./dbb-zappbuild:
total 256
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 .
                    drwxr-xr-x   3 TAGUCHI  SYS1        8192 Feb 21 13:56 ..
                    drwxrwxr-x   2 TAGUCHI  SYS1           0 Feb 21 13:56 .git
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        4882 Feb 21 14:09 BUILD.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1144 Feb 21 14:09 CONTRIBUTIONS.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1553 Feb 21 14:09 DCO1.1.txt
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1236 Feb 21 14:09 INSTALL.md
t ISO8859-1   T=on  -rw-rw-r--   1 TAGUCHI  SYS1       11355 Feb 21 14:09 LICENSE
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        5391 Feb 21 14:09 README.md
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 13:56 build-conf
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       19738 Feb 21 14:09 build.groovy
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:07 languages
                    drwxrwxr-x   4 TAGUCHI  SYS1        8192 Feb 21 14:07 samples
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:09 utilities

./dbb-zappbuild/.git:
total 16
                    drwxrwxr-x   2 TAGUCHI  SYS1           0 Feb 21 13:56 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 ..

./dbb-zappbuild/build-conf:
total 256
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 13:56 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         824 Feb 21 14:06 ACBgen.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1766 Feb 21 14:06 Assembler.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         893 Feb 21 14:06 BMS.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        2838 Feb 21 14:06 Cobol.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1304 Feb 21 14:06 DBDgen.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1086 Feb 21 14:06 LinkEdit.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         979 Feb 21 14:06 MFS.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1696 Feb 21 14:06 PLI.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1294 Feb 21 14:06 PSBgen.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       15155 Feb 21 14:06 README.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         938 Feb 21 14:06 ZunitConfig.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        4524 Feb 21 14:06 build.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1456 Feb 21 14:06 datasets.properties

./dbb-zappbuild/languages:
total 256
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:07 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        8863 Feb 21 14:07 Assembler.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        6211 Feb 21 14:07 BMS.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       14803 Feb 21 14:07 Cobol.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        7319 Feb 21 14:07 DBDgen.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        5005 Feb 21 14:07 LinkEdit.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        6338 Feb 21 14:07 MFS.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       11248 Feb 21 14:07 PLI.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       10992 Feb 21 14:07 PSBgen.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1470 Feb 21 14:07 README.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        7709 Feb 21 14:07 ZunitConfig.groovy

./dbb-zappbuild/samples:
total 64
                    drwxrwxr-x   4 TAGUCHI  SYS1        8192 Feb 21 14:07 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 ..
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 MortgageApplication
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:07 application-conf

./dbb-zappbuild/samples/MortgageApplication:
total 128
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 .
                    drwxrwxr-x   4 TAGUCHI  SYS1        8192 Feb 21 14:07 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         464 Feb 21 14:08 README.md
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 application-conf
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 bms
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 cobol
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 copybook
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 link

./dbb-zappbuild/samples/MortgageApplication/application-conf:
total 176
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         566 Feb 21 14:08 Assembler.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         511 Feb 21 14:08 BMS.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1289 Feb 21 14:08 Cobol.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         667 Feb 21 14:08 LinkEdit.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         529 Feb 21 14:08 PLI.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        9661 Feb 21 14:08 README.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        2163 Feb 21 14:08 application.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         821 Feb 21 14:08 file.properties

./dbb-zappbuild/samples/MortgageApplication/bms:
total 64
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        6526 Feb 21 14:08 epsmlis.bms
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        2619 Feb 21 14:08 epsmort.bms

./dbb-zappbuild/samples/MortgageApplication/cobol:
total 416
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        8775 Feb 21 14:08 epscmort.cbl
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1      132337 Feb 21 14:08 epscsmrd.cbl
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        2166 Feb 21 14:08 epscsmrt.cbl
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        7888 Feb 21 14:08 epsmlist.cbl
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        5854 Feb 21 14:08 epsmpmt.cbl
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        6723 Feb 21 14:08 epsnbrvl.cbl

./dbb-zappbuild/samples/MortgageApplication/copybook:
total 128
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         577 Feb 21 14:08 epsmortf.cpy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         104 Feb 21 14:08 epsmtcom.cpy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         333 Feb 21 14:08 epsmtinp.cpy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         399 Feb 21 14:08 epsmtout.cpy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         386 Feb 21 14:08 epsnbrpm.cpy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         534 Feb 21 14:08 epspdata.cpy

./dbb-zappbuild/samples/MortgageApplication/link:
total 48
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:08 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:08 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1          70 Feb 21 14:08 epsmlist.lnk

./dbb-zappbuild/samples/application-conf:
total 272
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:07 .
                    drwxrwxr-x   4 TAGUCHI  SYS1        8192 Feb 21 14:07 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         256 Feb 21 14:07 ACBgen.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1130 Feb 21 14:07 Assembler.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         515 Feb 21 14:07 BMS.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1997 Feb 21 14:07 Cobol.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         673 Feb 21 14:07 DBDgen.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         671 Feb 21 14:07 LinkEdit.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         535 Feb 21 14:07 MFS.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        1311 Feb 21 14:07 PLI.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         676 Feb 21 14:07 PSBgen.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       13016 Feb 21 14:07 README.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         394 Feb 21 14:07 ZunitConfig.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        3505 Feb 21 14:07 application.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         820 Feb 21 14:07 bind.properties
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         810 Feb 21 14:07 file.properties

./dbb-zappbuild/utilities:
total 208
                    drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 14:09 .
                    drwxrwxr-x   7 TAGUCHI  SYS1        8192 Feb 21 14:09 ..
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         232 Feb 21 14:09 ADMIN.pw
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        3847 Feb 21 14:09 BindUtilities.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       10991 Feb 21 14:09 BuildUtilities.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1        8247 Feb 21 14:09 GitUtilities.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1       17942 Feb 21 14:09 ImpactUtilities.groovy
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         826 Feb 21 14:09 README.md
t IBM-1399    T=on  -rw-rw-r--   1 TAGUCHI  SYS1         862 Feb 21 14:09 ScannerUtilities.groovy

```

</div></details>


#### プロパティ・ファイルの設定

USS上に展開されたファイルのうち、`dbb-zappbuild/build-conf/dataset.properties`を編集して、環境依存のデータセットの情報(LEや各ミドルウェアのライブラリの情報など)を指定します。

```properties:dbb-zappbuild/build-conf/dataset.properties設定例
# Dataset references
# Build properties for Partition Data Sets (PDS) used by zAppBuild build scripts.
# Please provide a fully qualified DSN for each build property below.
# Ex:
# MACLIB=SYS1.MACLIB

# z/OS macro library. Example: SYS1.MACLIB
MACLIB=SYS1.MACLIB

# Assembler macro library. Example: CEE.SCEEMAC
SCEEMAC=CEE.SCEEMAC

# LE (Language Environment) load library. Example: CEE.SCEELKED
SCEELKED=CEE.SCEELKED

# High Level Assembler (HLASM) load library. Example: ASM.SASMMOD1
SASMMOD1=HLA.SASMMOD1

# Cobol Compiler Data Sets. Example: COBOL.V4R1M0.SIGYCOMP
SIGYCOMP_V4=
SIGYCOMP_V6=IGY630.SIGYCOMP

# PL/I Compiler Data Sets.  Example: PLI.V5R2M0.SIBMZCMP
IBMZPLI_V52=IEL530.SIBMZCMP
IBMZPLI_V51=

# CICS Macro Library. Example: CICSTS.V3R2M0.CICS.SDFHMAC
SDFHMAC=DFH550.CICS.SDFHMAC

# CICS Load Library. Example: CICSTS.V3R2M0.CICS.SDFHLOAD
SDFHLOAD=DFH550.CICS.SDFHLOAD

# CICS COBOL Library. Example: CICSTS.V3R2M0.CICS.SDFHCOB
SDFHCOB=DFH550.CICS.SDFHCOB

# MQ COBOL Library. Example: CSQ.V9R1M0.SCSQCOBC
SCSQCOBC=CSQ911.SCSQCOBC

# MQ Load Library. Example: CSQ.V9R1M0.SCSQLOAD
SCSQLOAD=CSQ911.SCSQLOAD

# DB2 Load Library. Example: DB2.V9R1M0.SDSNLOAD
SDSNLOAD=DSNC10.SDSNLOAD

# IMS Macro Library. Example: DFS.V11R1M0.SDFSMAC
SDFSMAC=DFSF10.SDFSMAC

# IMS RESLIB. Example: DFS.V11R1M0.SDFSRESL
SDFSRESL=DFSF10.USER.SDFSRESL

# User generated library for DB/DC and DC installations. Example: DFS.V11R1M0.REFERAL
REFERAL=DFSF10.REFERAL

# IBM Debug Library containing Exits
SEQAMOD=EQAF00.SEQAMOD

# Optional IDz Load Library. Example: FEL.V14R0M0.SFELLOAD
SFELLOAD=FELE20.SFELLOAD

# Optional IDZ zUnit / WAZI VTP library containing necessary copybooks. Example : FEL.V14R2.SBZUSAMP
SBZUSAMP=
```

### USS上のディレクトリの作成

DBBとの連携では、ローカルのPCからファイルをUSS上に転送し、USS上で各種操作が行われます。そのためのディレクトリを作成しておく必要があります。ここでは以下のようにディレクトリを作成することにします。
このディレクトリは、ユーザー単位で設定しておくのがよさそうです。

**DBBワークスペース用ディレクトリ**: /u/TAGUCHI/projects
**ログ用ディレクトリ**: /u/TAGUCHI/projects/logs

基本的には、SSHで接続するユーザーのアクセス権があればよいです。ただ、DBBのShared Daemonという機能を使う場合は、ログ用のディレクトリについてはDBB Shared Daemonがの実行ユーザーからログの書き込みが行われるので、DBB Shared Daemon実行ユーザーのwrite権限も必要になります。
(今回試した環境では、SSHユーザーとDBB Shared Daemonユーザーのグループを同じにし、グループに対してwrite権限も付与しています)

```
TAGUCHI:/u/TAGUCHI/projects: >ls -la
total 1008
drwxr-xr-x   6 TAGUCHI  SYS1        8192 Feb 21 13:16 .
drwxr-xr-x   8 TAGUCHI  SYS1        8192 Feb 22 10:54 ..
drwxrwxr-x   2 TAGUCHI  SYS1        8192 Feb 21 13:39 logs
...
```

### 環境変数設定
DBBを使用する場合以下の環境変数の指定が必要になります。ssh接続ユーザーのホームの`.profile`もしくは`/etc/profile`に以下を指定します。

```/u/TAGUCHI/.profile
export DBB_HOME=/usr/lpp/IBM/dbb
export JAVA_HOME=/usr/lpp/java/J8.0_64
```

### その他
Zowe CLI経由でVSCodeとz/OSを接続するため、z/OS側ではz/OSMF(もしくはRSE API)、および、SSHが稼働している必要があります。

## PC側

### インストール
PC側では、以下をインストールしておく必要があります。

- Git
- Zowe CLI
- VSCode + Zowe Explorer Extention + Z Open Editor Extention + (Git History)

Gitについては情報がたくさん出回っていますので割愛。Zowe CLI, VSCode周りは前の関連記事で紹介しているのでそちらをご参照ください。

### Zowe CLI: z/OSとの接続構成

Zowe CLI, VSCode周りはこれまでの関連記事で示した設定がそのまま有効です。おさらいするとこんな感じです。

- Zowe CLI: z/OSMF接続プロファイル設定
- VSCodeにZowe Explorere Extension, Z Open Editor Extensionを追加インストール

DBBと連携する場合、Zowe CLIの設定として、SSH用の接続プロファイルというのを追加してSSH接続できるようにしておく必要があります。
以下のコマンドでSSH接続用のプロファイルを作成します。

```
C:>zowe profiles create ssh-profile ssh_Wazi01 --host OCPW01 --port 31175 --user TAGUCHI --password xxx
Profile created successfully! Path:
C:\Users\TomohiroTaguchi\.zowe\profiles\ssh\ssh_Wazi01.yaml

host:     OCPW01
port:     31175
user:     TAGUCHI
password: managed by @zowe/secure-credential-store-for-zowe-cli

Review the created profile and edit if necessary using the profile update command.
```

オプション補足

- **ssh_Wazi01**: 作成するSSH用のプロファイル名(任意の名前を指定)
- **--host OCPW01**: 接続先z/OSのホスト名指定(もしくはIPアドレスの指定)
- **--port 31175**: 接続先z/OSのSSHがListenしているポート(デフォルトだと22)
- **--user TAGUCHI**: SSH接続で使用するユーザー
- **--pasword xxx**: SSH接続で使用するパスワード

Zowe CLIのSSH関連コマンドを実行して、このプロファイルを使用して接続できるかどうか確認します。
参考: [Zowe CLI: zowe › zos-uss › issue › ssh](https://docs.zowe.org/stable/web_help/index.html?p=zowe_zos-uss_issue_ssh)

```
C:>zowe zos-uss issue ssh pwd --ssh-profile ssh_Wazi01

$ pwd
/u/TAGUCHI
```

上の例は、プロファイル"ssh_Wazi01"で指定した接続先に対してssh経由で "pwd"コマンドを実行する例です。TAGUCHIユーザーで接続しているので、接続先z/OSのUSS上のホームディレクトリが表示されたのが確認できます。

<font color="red">※注意！
SSHプロファイルの作成に失敗した場合(例えばポート番号の指定を間違えるなど)、削除して作成し直したり`zowe profiles update`コマンドで一部のパラメータのみ修正したりすることができます。ただし、一度作成をミスしたプロファイル名のまま修正を行うと、後続のDBB連携の際にうまく動かない場合があります。プロファイル作成時にミスした場合や設定変更を行いたい場合は、それまで使ったことのない**新規の別名**でSSHプロファイルを作成しなおすようにしてください。
</font>

### VSCodeのプロパティ設定

ファイル - ユーザー設定 - 設定を選択し、ユーザータブを選択します。
zoweで検索して拡張機能以下のIBM Z Open Editorを選択すると、"Zopeneditor: Zowe"という項目が表示されます。
ここに、以下のようにパラメーターを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/50759066-66b3-6b2c-30b6-cd34e067be4f.png)

- **defaultCliProfile**: Zowe CLIに定義したz/OSMF用プロファイル
- **defaultSshProfile**: Zowe CLIに定義したSSH用プロファイル

同様に設定画面で、user buildで検索すると、"Userbuild: User Setting"という項目が表示されます。これはVSCode上ユーザー単位でもワークスペース単位でも指定できます。(ここで言っているワークスペースというのはVSCodeの概念の話です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c1c498af-a1b8-2d33-443e-7c730e26c8e0.png)

- **dbbWorkspace**: USS上のDBBワークスペース用ディレクトリ(事前作成しておく)
- **dbbLogDir**: USS上のログ用ディレクトリ(事前作成しておく)
- **dbbHLQ**: ビルド時に使用するHLQ(データセットの事前作成は不要。ユーザー・ビルドを行うと、このHLQで自動でデータセットが作成される)


# 使用例

上の手順で、一通りの下準備は完了です。次に、サンプルを使って具体的な操作を試していきます。
使用するのはGitHubに提供されている以下のサンプルです。
[GitHub: zoepneditor-sample](https://github.com/IBM/zopeneditor-sample)

VSCode上に適当なワークスペースを作成して上のUser Buildの設定を行っている状態、という想定です。
また、接続先のz/OSは実際のz/OS環境ではなくWazi DeveloperのSandbox(OpenShiftクラスター上に構成したz/OSエミュレーター)を使用するものとします。

## サンプルのクローン
VSCodeでUser Buildの設定を行っているワークスペースを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9eceb6e3-a88a-8bee-2377-43a3891ce4b2.png)

Ctrl+Shift+Pでコマンドパレットを開き、Git:Cloneを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d21146d2-61e0-7767-7c29-6c3165b3c9fc.png)

CloneしたいgitリポジトリのURLを指定します。(`https://github.com/IBM/zopeneditor-sample.git`)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/669e1a5f-3603-b02e-c84b-56c38eddf95f.png)

適当なフォルダを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5f1c55d7-cb44-e08b-5df8-230f8dec1213.png)

"ワークスペースに追加"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/40a182e7-945b-235c-e69c-3a59806f4ed5.png)

これで、指定したフォルダにサンプルのプロジェクトがクローンされ、VSCodeのワークスペースから管理できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6c5b1849-b32a-4784-fca3-9b6bbf63c5a5.png)

ただ、デフォルトだと"master"ブランチを参照している状態になっています。今回、接続先はWazi DeveloperのSandboxを使って試していますが、このサンプルではWazi環境用にカスタマイズされたブランチが提供されているので、そちらのブランチに切り替えます。

左側のメニューからソース管理を選択して、zopeneditor-sampleの横のmaster部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f36c4566-1861-7195-2e3d-94124ecde28f.png)

ブランチの候補が出力されるので、"origin/wazi-master"ブランチを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6c1de2c3-c082-6dc4-e2d9-2e3bb9a14225.png)

これでwazi-masterのブランチに切り替わった状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8e5d6d10-13df-6465-a1bb-7cb3c0ee21ca.png)

## ZAPPファイルの編集
参考: [Experimental: Configure your applications with ZAPP files](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=code-experimental-configure-your-applications-zapp-files)

関連記事でも紹介したように、言語の関連付けやCOBOLのCopybookの探索先などの情報はVSCodeのプロパティで設定することができます。ただし、このような属性はアプリケーションのプロジェクト毎に設定すべきもので、VSCodeのプロパティで保持していると都合が悪い場合があります。そこで、プロジェクト単位に管理したい情報(ソース編集やビルドに関連する情報)を、VSCodeのプロパティではなく別ファイルで管理できる仕組みが提供されています。それがZAPPファイルと呼ばれるものです(詳細は上のリンクを参照のこと)。Experimental(試験的)という但し書きがついているのでまだ過渡期の仕組みですが、欠かせない機能だと思いますので使用してみます。

ZAPPファイルは、VSCodeのプロパティで指定していたことをプロジェクト単位にjsonまたはyaml形式で指定できます。サンプルとしてzapp-example.json, zapp-example.yamlが提供されています。ここではJSON形式のファイルを使いたいと思います。
zapp-example.jsonを、zapp.jsonという名前で同フォルダ(zopeneditor-sample直下)にコピーして編集します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/543a6baf-e36f-76d6-a2c4-ea7d6cf1ee8e.png)

※ここに、property-groupsの指定などがあるので、この指定に基づいてCOPYBOOKの探索などができるようになります。

このサンプルの最下部を、環境に合わせて編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c663cfce-5669-e176-761d-3e925836d583.png)


```json:zapp.json
...
  "profiles": [
    {
      "name": "dbb-userbuild",
      "type": "dbb",
      "settings": {
        "command": "$DBB_HOME/bin/groovyz",
        "buildScriptPath": "/u/dbb_common/dbb-zappbuild/build.groovy",
        "buildScriptArgs": [
          "-DBB_DAEMON_HOST 127.0.0.1",
          "-DBB_DAEMON_PORT 7380",
          "--userBuild",
          "--workspace ${zopeneditor.userbuild.userSettings.dbbWorkspace}",
          "--application zopeneditor-sample",
          "--hlq ${zopeneditor.userbuild.userSettings.dbbHlq}",
          "--outDir ${zopeneditor.userbuild.userSettings.dbbLogDir}"
        ],
        "additionalDependencies": [
          "application-conf"
        ]
      }
    }
  ]
...
```

上の例では以下の箇所を変更しています。

- **buildScriptPath**: zAppBuildをセットアップした先のbuild.groovyのパスを指定します。
- **buildScriptArgs**:
    - **-DBB_DAEMON_HOST, -DBB_DAEMON_PORT**: DBB Shared Daemonを使用する場合のオプションを追記しています(具体的な値は管理者に要確認)。使用しない場合は追記不要。
    - - **--outDir**: USS上に作成したログ用ディレクトリのパスを指定します。上の例ではVSCodeのプロパティで指定したdbbLogDirの値を参照するようにしています(/u/TAGUCHI/projects/logs)。

※実際に運用する場合は、このZAPPファイルも含めて環境に合わせてカスタマイズした状態のものをGit Server上に管理しておく、ということになると思います。今回はサンプルを使っているのでこのファイルを修正していますが、実際にはこの辺を意識させずに必要なソースのみ編集できればいいように環境を整えておくことはできると思います。

## .gitattributesファイルの確認
ビルドを実行する際は、対象のファイルをPC上からターゲットのz/OSのUSSファイルに一旦転送されます。この時コード変換が行われますが、この時使用される文字コードを.gitattributesファイルで指定することができます。このファイルはリポジトリのトップに配置する必要があります。サンプルで提供されている.gitattributesファイルは以下の通りです。

```xxx:.gitattributes
*.cpy zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.cbl zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.jcl zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.bms zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.pli zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.inc zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.asm zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.mfs zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.bnd zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.lnk zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.rex zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.txt zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.groovy zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.sh zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.properties zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.rexx zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.config zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
```

参考: [Setting up the user build - Configuring encoding on USS](https://www.ibm.com/docs/en/wdfrhcw/1.2.0?topic=code-setting-up-user-build)

※日本語文字列を含むファイルは、ここに日本語のencoding(例えばibm-1399など)を指定しても正しくコード変換されないという不具合がありましたが、それは2021/08/19にリリースされたZ Open Editor V1.2.6で修正されています。

参考: [IBM Z Open Editor - What's New - IBM Z Open Editor Releases 1.2.6 - 2021/08/19](https://ibm.github.io/zopeneditor-about/Blog/new-releases.html#_1-2-6-2021-08-19)
>Fixed an issue in User Build that prevented the use of the correct encoding as defined in `.gitattributes` to files uploaded via z/OSMF or RSE API profiles.

## ビルド実行

編集したいソースを開きます。ここではCOBOL以下のSAM1.cblを選択します。
(ここではビルドの手順を確認したいので、特に修正などは行いません。)

ZAPPファイルが有効であれば、COPYBOOKの参照などが有効になっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d7f9df55-ad1d-3d89-2b6a-2c6527f6a1d6.png)

エディター部分を右クリックして、"Run Setup for IBM User Build"を選択し、ビルドの前提となるセットアップの処理を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ff578a04-2a41-3820-df2b-50ada82e50fa.png)

IBM User Buildの出力画面が開いて、ログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4db9976d-e6d9-17af-c258-332afe8c7818.png)

<details><summary><font color="blue">Run Setupのログ出力例</font></summary><div>

```
=====================
Running setup for user build...
Setup will upload files or folders defined in your ZAPP file or in .vscode/settings.json under "zopeneditor.userbuild.userSettings.additionalDependencies".
Checking ZAPP file or workspace settings...
DBB ZAPP or workspace settings should be defined in either your repository's zapp.yaml, zapp.json or .vscode/settings.json file.
    command: $DBB_HOME/bin/groovyz
    buildScriptArgs: -DBB_DAEMON_HOST 127.0.0.1,-DBB_DAEMON_PORT 7380,--userBuild,--workspace /u/TAGUCHI/projects,--application zopeneditor-sample,--hlq TAGUCHI.DBB,--outDir /u/TAGUCHI/projects/logs
    buildScriptPath: /u/dbb_common/dbb-zappbuild/build.groovy
    additionalDependencies: application-conf
---------------------
Checking user settings...
User settings should be defined in your VS Code or Theia Settings under zopeneditor.userbuild.userSettings
    localWorkspacePath: **Optional setting is missing**
    dbbWorkspace: /u/TAGUCHI/projects
    dbbHlq: TAGUCHI.DBB
    dbbLogDir: /u/TAGUCHI/projects/logs
---------------------
Using ssh profile ssh_Wazi01
Using zowe profile profile prof_Wazi01
Identified local root workspace path as c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample
Running setup to build c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\COBOL\SAM1.cbl program.
Executing ssh command: 
mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample'
$ mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample'
Uploading additional dependencies...
Uploading c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\application-conf
Executing ssh command: 
mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample/application-conf'
$ mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample/application-conf'
User build setup FINISHED.
```

</div></details>

続いて、ビルドを実行します。
エディター部分を右クリックして、"Run IBM User Build with full upload"を選択し、ビルドの処理を実施します。
※この操作を行うと、必要なファイルをz/OSに転送してコンパイル/リンクを実施するスクリプトが流れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7510dff9-ca81-de79-3ef7-cd43eb8843a1.png)

ビルド(コンパイル/リンク)が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2b51a2c1-efb2-696f-d441-88c194e9b31b.png)

<details><summary><font color="blue">Run IBM User Buildのログ出力例</font></summary><div>

```
=====================
Running user build...
Identified local root workspace path as c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample
---------------------
Checking ZAPP file or workspace settings...
DBB ZAPP or workspace settings should be defined in either your repository's zapp.yaml, zapp.json or .vscode/settings.json file.
    command: $DBB_HOME/bin/groovyz
    buildScriptArgs: -DBB_DAEMON_HOST 127.0.0.1,-DBB_DAEMON_PORT 7380,--userBuild,--workspace /u/TAGUCHI/projects,--application zopeneditor-sample,--hlq TAGUCHI.DBB,--outDir /u/TAGUCHI/projects/logs
    buildScriptPath: /u/dbb_common/dbb-zappbuild/build.groovy
    additionalDependencies: application-conf
---------------------
Checking user settings...
User settings should be defined in your VS Code or Theia Settings under zopeneditor.userbuild.userSettings
    localWorkspacePath: **Optional setting is missing**
    dbbWorkspace: /u/TAGUCHI/projects
    dbbHlq: TAGUCHI.DBB
    dbbLogDir: /u/TAGUCHI/projects/logs
---------------------
Using ssh profile ssh_Wazi01
Using zowe profile profile prof_Wazi01
Executing ssh command: 
mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample/COBOL'
$ mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample/COBOL'
Uploading c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\COBOL\SAM1.cbl program.
Found total of 2 local include files:
c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\COPYBOOK\CUSTCOPY.cpy
c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\COPYBOOK\TRANREC.cpy
Executing ssh command: 
mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample/COPYBOOK'
$ mkdir -p '/u/TAGUCHI/projects/zopeneditor-sample/COPYBOOK'
Uploading c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\COPYBOOK\CUSTCOPY.cpy
Uploading c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\COPYBOOK\TRANREC.cpy
---------------------
Executing ssh command: 
$DBB_HOME/bin/groovyz /u/dbb_common/dbb-zappbuild/build.groovy -DBB_DAEMON_HOST 127.0.0.1 -DBB_DAEMON_PORT 7380 --userBuild --workspace /u/TAGUCHI/projects --application zopeneditor-sample --hlq TAGUCHI.DBB --outDir /u/TAGUCHI/projects/logs /u/TAGUCHI/projects/zopeneditor-sample/COBOL/SAM1.cbl
$ $DBB_HOME/bin/groovyz /u/dbb_common/dbb-zappbuild/build.groovy -DBB_DAEMON_H
$
$ bb-zappbuild/build.groovy -DBB_DAEMON_HO                                    <ST 127.0.0.1 -DBB_DAEMON_PORT 7380 -
$
$ _HOST 127.0.0.1 -DBB_DAEMON_PORT 7380 --                                    <userBuild --workspace /u/TAGUCHI/pro
$
$  --userBuild --workspace /u/TAGUCHI/proj                                    <ects --application zopeneditor-sampl
$
$ rojects --application zopeneditor-sample                                    < --hlq TAGUCHI.DBB --outDir /u/TAGUC
$
$ ple --hlq TAGUCHI.DBB --outDir /u/TAGUCH                                    <I/projects/logs /u/TAGUCHI/projects/
$
$ UCHI/projects/logs /u/TAGUCHI/projects/z                                    <openeditor-sample/COBOL/SAM1.cbl
** Build start at 20210224.103644.036
** Build output located at /u/TAGUCHI/projects/logs
** Adding /u/TAGUCHI/projects/zopeneditor-sample/COBOL/SAM1.cbl to Building build list
** Writing build list file to /u/TAGUCHI/projects/logs/buildList.txt
** Invoking build scripts according to build order: BMS.groovy,Cobol.groovy,Assembler.groovy,PLI.groovy,LinkEdit.groovy
** Building files mapped to Cobol.groovy script
*** Building file zopeneditor-sample/COBOL/SAM1.cbl
** Writing build report data to /u/TAGUCHI/projects/logs/BuildReport.json
** Writing build report to /u/TAGUCHI/projects/logs/BuildReport.html
** Build ended at Wed Feb 24 22:37:20 GMT 2021
** Build State : CLEAN
** Total files processed : 1
** Total build time  : 35.904 seconds
__RC=0__
** Build finished
Looking for user-build logs in "/u/TAGUCHI/projects/logs".
Downloading logs to c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\logs
Downloading log file /u/TAGUCHI/projects/logs/buildList.txt. Binary: false
Downloading log file /u/TAGUCHI/projects/logs/SAM1.log. Binary: false
Downloading log file /u/TAGUCHI/projects/logs/BuildReport.json. Binary: true
Downloading log file /u/TAGUCHI/projects/logs/BuildReport.html. Binary: true
Downloading of 4 log files to c:\y\VSCode_workspace\WaziTest03\zopeneditor-sample\logs finished successfully.
```

</div></details>

コンパイル/リンクの結果はローカルのlogディレクトリ下に`<src>.log`というファイルで生成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0bad3f8d-30c0-abbe-276f-4a1881d6d9cf.png)


<details><summary><font color="blue">COBOLコンパイル結果例</font></summary><div>

```
PP 5655-EC6 IBM Enterprise COBOL for z/OS  6.3.0 P200319                 Date 02/22/2021  Time 13:05:46   Page     1

Invocation parameters:
 LIB

        IGYOS4090-I   The "LIB" option specification is no longer required.  COBOL library processing is always in effect.


Options in effect:
 NOADATA
   ADV
   AFP(NOVOLATILE)
   QUOTE
   ARCH(8)
   ARITH(COMPAT)
 NOAWO
 NOBLOCK0
   BUFSIZE(4096)
 NOCICS
   CODEPAGE(1140)
 NOCOMPILE(S)
 NOCOPYLOC
 NOCOPYRIGHT
 NOCURRENCY
   DATA(31)
   DBCS
 NODECK
 NODEFINE
 NODIAGTRUNC
   DISPSIGN(COMPAT)
 NODLL
 NODUMP
 NODYNAM
 NOEXIT
 NOEXPORTALL
 NOFASTSRT
   FLAG(I,I)
 NOFLAGSTD
   HGPR(PRESERVE)
 NOINITCHECK
 NOINITIAL
   INLINE
   INTDATE(ANSI)
 NOJTC
   LANGUAGE(EN)
   LINECOUNT(60)
 NOLIST
   LP(32)
 NOMAP
   MAXPCF(100000)
 NOMDECK
 NONAME
   NSYMBOL(NATIONAL)
 NONUMBER
 NONUMCHECK
   NUMPROC(NOPFD)
   OBJECT
 NOOFFSET
   OPTIMIZE(0)
   OUTDD(SYSOUT)PP 5655-EC6 IBM Enterprise COBOL for z/OS  6.3.0 P200319                 Date 02/22/2021  Time 13:05:46   Page     2

 NOPARMCHECK
   PGMNAME(COMPAT)
   QUALIFY(COMPAT)
   RENT
   RMODE(AUTO)
 NORULES
 NOSERVICE
   SEQUENCE
   SOURCE
   SPACE(1)
 NOSQL
   SQLCCSID
 NOSQLIMS
 NOSSRANGE
 NOSTGOPT
   SUPPRESS
 NOTERM
 NOTEST(NODWARF,NOSOURCE,NOSEPARATE)
 NOTHREAD
   TRUNC(STD)
 NOVBREF
   VLR(STANDARD)
   VSAMOPENFS(COMPAT)
 NOWORD
   XMLPARSE(XMLSS)
   XREF(FULL)
   ZONEDATA(PFD)
   ZWBPP 5655-EC6 IBM Enterprise COBOL for z/OS  6.3.0 P200319       SAM1      Date 02/22/2021  Time 13:05:46   Page     3
  LineID  PL SL  ----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-|--+----8 Map and Cross Reference

  000001               ****************************************************************
  000002               * LICENSED MATERIALS - PROPERTY OF IBM
  000003               * "RESTRICTED MATERIALS OF IBM"
  000004               * (C) COPYRIGHT IBM CORPORATION 2018, 2019. ALL RIGHTS RESERVED
  000005               * US GOVERNMENT USERS RESTRICTED RIGHTS - USE, DUPLICATION,
  000006               * OR DISCLOSURE RESTRICTED BY GSA ADP SCHEDULE
  000007               * CONTRACT WITH IBM CORPORATION
  000008               ****************************************************************
  000009               * PROGRAM:  SAM1
  000010               *
  000011               * AUTHOR :  Doug Stout
  000012               *
  000013               * READS A SEQUENTIAL TRANSACTION FILE AND MAKES UPDATES
  000014               * TO A SORTED SEQUENTIAL CUSTOMER FILE
  000015               *
  000016               * A GOOD CASE FOR DEBUGGING LAB - INDEED
  000017               *
  000018               * CAN BE MADE TO ABEND WITH BAD INPUT DATA FOR FAULT ANALYSIS LAB
  000019               *****************************************************************

...(省略)...



1SAVE OPERATION SUMMARY:

    MEMBER NAME         SAM1
    LOAD LIBRARY        TAGUCHI.DBB.LOAD
    PROGRAM TYPE        PROGRAM OBJECT(FORMAT 5 OS COMPAT LEVEL z/OS V1R8 )
    VOLUME SERIAL       B4USR1
    DISPOSITION         REPLACED
    TIME OF SAVE        13.06.08  FEB 22, 2021


1SAVE MODULE ATTRIBUTES:

    AC                  000
    AMODE                31
    COMPRESSION         BINDER DATA
    DC                  NO
    EDITABLE            YES
    EXCEEDS 16MB        NO
    EXECUTABLE          YES
    LONGPARM            NO
    MIGRATABLE          NO
    OL                  NO
    OVLY                NO
    PACK,PRIME          NO,NO
    PAGE ALIGN          NO
    REFR                NO
    RENT                YES
    REUS                YES
    RMODE               ANY
    SCTR                NO
    SIGN                NO
    SSI
    SYM GENERATED       NO
    TEST                NO
    XPLINK              NO
    MODULE SIZE (HEX)   0000424C
    DASD SIZE (HEX)     0000A000


1 ENTRY POINT AND ALIAS SUMMARY:

  NAME:            ENTRY TYPE AMODE C_OFFSET CLASS NAME        STATUS

  SAM1              MAIN_EP      31 00000000 C_CODE

                          *** E N D   O F   O P E R A T I O N   S U M M A R Y   R E P O R T ***




1z/OS V2 R4 BINDER     13:06:06 MONDAY FEBRUARY 22, 2021
 BATCH EMULATOR  JOB(TAGUCHI1) STEP(*OMVSEX ) PGM= IEWBLINK
 IEW2008I 0F03 PROCESSING COMPLETED.  RETURN CODE =  0.



1----------------------
 MESSAGE SUMMARY REPORT
 ----------------------
  TERMINAL MESSAGES      (SEVERITY = 16)
  NONE

  SEVERE MESSAGES        (SEVERITY = 12)
  NONE

  ERROR MESSAGES         (SEVERITY = 08)
  NONE

  WARNING MESSAGES       (SEVERITY = 04)
  NONE

  INFORMATIONAL MESSAGES (SEVERITY = 00)
  2008  2278


  **** END OF MESSAGE SUMMARY REPORT ****
```

</div></details>

今回の例はCOBOLのSAM1.cblをビルド(コンパイル/リンク)した例ですが、結果としてはVSCodeのプロパティのdbbHLQで指定したHLQ以下のLOAD(今回の例ではTAGUCHI.DBB.LOAD)に実行モジュールが生成される、ということになります。

# おわりに
今回は、ビルドに関してベースとなる手順の部分のみを実施してみました。
実際の開発プロセスを回す場合は、アプリケーション用のリポジトリを別途作成してそれを使用し、ソース編集/ビルド/UT を回して確定したら変更をcommitしてpushというような流れになると思います。
テスト部分については冒頭でも示したように、変更対象のソースの形態に依存するので、やり方はまちまちです。テスト支援ツールと組み合わせれば、UT部分もUser Buildのスクリプトに組み込んである程度自動化する、ということも可能にはなると思います。