z/OS利用時の文字コード変換 - 動作検証(3) DBBユーザー・ビルド時のコード変換

# はじめに
VS Code/IDzとz/OS上のDBB(Dependency Based Build)という製品を使ってユーザー・ビルドを行う際に、PC⇔z/OS間でコード変換が行われることになります。動作検証(1)で見てきた文字列を含むCOBOLソースについて、コード変換の状況を見てみます。

この記事ではコード変換に着目します。DBBユーザー・ビルドの具体的な構成やフローについての詳細は以下の記事もご参照ください(バージョンが異なるので今回のテスト環境と細かい部分での差分はありますが)。
[VSCodeを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/4bdd0b5a7284b5102d10)
[Eclipseを使用したメインフレーム・アプリケーション開発 - (4)ソース管理ツール/ビルドツール連携](https://qiita.com/tomotagwork/items/da039208be2f77c21285)

## 関連記事

[z/OS利用時の文字コード変換 - 動作検証(1) 各ツールでの文字列表示](https://qiita.com/tomotagwork/items/3960cd4d8c16a0092670)
[z/OS利用時の文字コード変換 - 動作検証(2) Git利用時のコード変換](https://qiita.com/tomotagwork/items/83896dcf83239cc2e4af)
[z/OS利用時の文字コード変換 - 動作検証(3) DBBユーザー・ビルド時のコード変換](https://qiita.com/tomotagwork/items/15e848ca296ece336f18)
[z/OS利用時の文字コード変換 - 動作検証(4) カタカナ系文字コードにおけるPDSメンバー名](https://qiita.com/tomotagwork/items/183b4109ec1f9ae49de4)

# 環境情報

z/OS V2.4
DBB V2.0
Windows11
PCOM V14
VS Code V1.77.3
Zowe Explorer V2.7
IBM Z Open Editor V3.1.1

# 動作検証

動作検証(1),(2)で試した文字列を含むCOBOLソースをビルドしてみることにします。

VS Code/IDzでユーザー・ビルドを実行する場合、Gitでも使われる.gitattributesファイルの情報をベースにコード変換されます。つまり、z/OS ⇒ GitHub ⇒ LocalPC とリポジトリを持ってきた場合に引き継がれてきた.gitattributesの情報を、DBBでのビルド時にもそのまま使ってコード変換することになります。なかなかよくできています。


## (1)VS Codeからのユーザー・ビルド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cf71f545-e9f8-93b1-2fbc-c61dd7acfacc.png)

### 設定

#### コード変換用設定

今回使用する.gitattributesの例です。

```.gitattributes
# line endings
* text eol=lf

# file encodings
.gitattributes zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.cpy zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.cbl zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.bms zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.pli zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.mfs zos-working-tree-encoding=ibm-1399 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
*.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
*.asm zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.jcl zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.mac zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.json zos-working-tree-encoding=utf-8 git-encoding=utf-8

```

COBOLのソース(*.cbl)が対象なので、*.cblはz/OS上ではIBM-1399で扱うように指定しています。

#### z/OS接続用プロファイル
Zowe Explorerからz/OSに対する接続構成として、z/OSMFでの接続、および、SSHでの接続が必要になるのでそれぞれプロファイルを作成しておきます。

```json:zowe.config.json抜粋
...
        "isecloud_wazi01": {
            "properties": {
                "host": "wazi01",
                "rejectUnauthorized": false
            },
            "profiles": {
                "zosmf": {
                    "type": "zosmf",
                    "properties": {
                        "port": 10443,
                        "encoding": "IBM-1399"
                    }
                },
                "ssh": {
                    "type": "ssh",
                    "properties": {
                        "port": 22,
                        "privateKey": "C:\\Users\\A00527JP6\\.ssh\\ISECloud2023\\id_rsa_wazi"
                    }
                }
            },
            "secure": [
                "user",
                "password"
            ]
        },
...
```

ここでz/OSMF接続構成のencodingとして"IBM-1399"を指定しています。

#### DBB関連設定 (環境情報)

VS Codeのワークスペースの設定で、ユーザービルド用にDBB関連の設定、および、Zopeneditor:Zoweの設定を行っておきます。

```json:xxx.code-workspace抜粋
...
	"settings": {
		"zopeneditor.userbuild.userSettings": {
			"dbbWorkspace": "/u/TAGUCHI/projects",
			"dbbHlq": "TAGUCHI.DBB",
			"dbbLogDir": "/u/TAGUCHI/projects/logs",
			"dbbDefaultZappProfile": "dbb-userbuild"
		},
		"zopeneditor.zowe": {
			"defaultCliProfile": "isecloud_wazi01.zosmf",
			"defaultSshCliProfile": "isecloud_wazi01.ssh"
		}
	}
...
```

ここでは、先に設定した接続先z/OSに対するz/OSMF用のプロファイルとSSHプロファイルをデフォルトのプロファイルとして設定しています。ここで指定したプロファイルがユーザービルド時に使用されます。つまりここでビルドする環境が決まります。

#### DBB関連設定 (ビルド関連情報)

アプリケーション依存の情報は、Gitリポジトリに含まれるzappファイル

```yaml:zapp.yaml
################################################################
# LICENSED MATERIALS - PROPERTY OF IBM
# "RESTRICTED MATERIALS OF IBM"
# (C) COPYRIGHT IBM CORPORATION 2020, 2022. ALL RIGHTS RESERVED
# US GOVERNMENT USERS RESTRICTED RIGHTS - USE, DUPLICATION,
# OR DISCLOSURE RESTRICTED BY GSA ADP SCHEDULE
# CONTRACT WITH IBM CORPORATION
################################################################

name: VSCode01
description: For IBM Z Open Editor 3.0.0 or newer. Wazi's code samples with COBOL, PL/I, and HLASM applications
version: 3.0.0
author:
  name: IBM CORPORATION

propertyGroups:
  - name: cobol-copybooks
    language: cobol
    libraries:
      - name: syslib
        type: local
        locations:
          - "**/copybook"
profiles:
  - name: dbb-userbuild
    type: dbb
    settings:
      application: zosgittest01
      command: $DBB_HOME/bin/groovyz
      buildScriptPath: /u/ibmuser/dbb-zappbuild/build.groovy
      buildScriptArgs:
        - --userBuild
        - --workspace ${zopeneditor.userbuild.userSettings.dbbWorkspace}
        - --application ${application}
        - --hlq ${zopeneditor.userbuild.userSettings.dbbHlq}
        - --outDir ${zopeneditor.userbuild.userSettings.dbbLogDir}
        - --dependencyFile ${dependencyFile}
      additionalDependencies:
        - application-conf
      logFilePatterns:
        - ${buildFile.basename}.log
        - BuildReport.*
```


### ビルド実行

VS CodeからUser Buildを実行すると、指定したソースがz/OSに転送されて、ビルド(コンパイル/リンク)のスクリプトが流れます。

VS Code上に表示されるビルド時のログを確認します。

```xxx:UserBuildログ抜粋
Checking if SSH profile isecloud_wazi01.ssh can connect:
Connected successfully.

Executing SSH command: 
mkdir -p '/u/TAGUCHI/projects/zosgittest01/cobol'
$
Uploading file c:\y\VSCode_workspace\ISEConf2023_wazi_local\zosgittest01\cobol\TSUB04.cbl to /u/TAGUCHI/projects/zosgittest01/cobol/TSUB04.cbl with encoding ibm-1399
Using ssh profile isecloud_wazi01.ssh
Executing SSH command: 
chtag -tc ibm-1399 '/u/TAGUCHI/projects/zosgittest01/cobol/TSUB04.cbl'

...

Executing SSH command: 
$DBB_HOME/bin/groovyz /u/ibmuser/dbb-zappbuild/build.groovy --userBuild --workspace /u/TAGUCHI/projects --application zosgittest01 --hlq TAGUCHI.DBB --outDir /u/TAGUCHI/projects/logs --dependencyFile /u/TAGUCHI/projects/logs/.userbuilddependencies '/u/TAGUCHI/projects/zosgittest01/cobol/TSUB04.cbl'
$ 
** Build start at 20230422.060516.005
** Build output located at /u/TAGUCHI/projects/logs
** Adding /u/TAGUCHI/projects/zosgittest01/cobol/TSUB04.cbl to Building build list
** Writing build list file to /u/TAGUCHI/projects/logs/buildList.txt
** Invoking build scripts according to build order: Assembler.groovy,Cobol.groovy,PLI.groovy
** Building files mapped to Cobol.groovy script
*** Building file zosgittest01/cobol/TSUB04.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 Sat Apr 22 18:05:22 JST 2023
** Build State : CLEAN
** Total files processed : 1
** Total build time  : 6.007 seconds
** Build finished

```

ログを確認すると、USS上にCOBOLのファイルが転送され、その後ビルド用のスクリプトが実行されている様子が分かります。メッセージからファイル転送時はIBM-1399でコード変換されていることがわかります。

最終的にはPDSメンバーとしてソースがコピーされているので、転送された先のメンバーを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c1e6d48c-f47d-c1e5-f64b-05166557becd.png)

意図した通りに変換されているようです。

## (2)IDzからのユーザー・ビルド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f093adf0-73b5-30ec-1436-ce1607e1b1b6.png)


### 設定

#### z/OSとの接続設定

リモート・システムビューから、z/OS接続設定以下のMVSファイルを右クリック - プロパティーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3306a8ce-c919-9499-2648-af9d38a4cf13.png)
ここで、ホスト・コード・ページ: IBM-1399、ローカル・コード・ページ: UTF-8を指定します。

#### コード変換用設定

今回使用する.gitattributesの例です。

```.gitattributes
# line endings
* text eol=lf

# file encodings
.gitattributes zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.cpy zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.cbl zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.bms zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.pli zos-working-tree-encoding=ibm-1399 git-encoding=utf-8
*.mfs zos-working-tree-encoding=ibm-1399 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
*.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
*.asm zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.jcl zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.mac zos-working-tree-encoding=ibm-1047 git-encoding=utf-8
*.json zos-working-tree-encoding=utf-8 git-encoding=utf-8
                                                           
```

COBOLのソース(*.cbl)が対象なので、*.cblはz/OS上ではIBM-1399で扱うように指定しています。

#### DBB関連設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0bfb70db-ed17-cf57-b0f4-43d87b18dfdf.png)

コード変換に使用するファイル(.gitattributes)を指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cf2f9299-8c7d-88e0-8119-0ed1131f904d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0aa6e72c-1ba8-8b24-9cc1-151a025a24b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6331fa44-4045-ff4d-741e-9d41a01a68a0.png)


ここで、"ファイル転送情報の表示"にチェックを入れると、ファイル転送に使用されるコードページ情報も確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8df81d62-aa4c-4a2d-d29e-11bd5bb5b9b6.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0bdf1b03-b82b-4db8-05ab-71636b690a10.png)


### ビルド実行

IDzからビルド実行を行うと、PDSメンバーにソースがコピーされてビルド(コンパイル/リンク)が行われます。ビルド時に転送されたPDSメンバーを参照してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bfbed61b-803b-31f4-300a-5c56a06079ad.png)

意図した通りに変換されているようです。