DBB/zAppBuildについてのメモ - (4)Metadata Store構成

# はじめに
ここでは、Metadata StoreとしてDb2 for z/OSを使用する場合の構成を行ってみます。

## 関連記事

[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)

# z/OS Unix File Systemを使用する場合

Metadata Storeとして Unix System Service上のファイル・システム(zFS)を使用する場合についての使用例を示します。

## 構成
特別な構成は不要です。
Metadata Storeとして使用されるディレクトリが含まれるzFSのサイズ、アクセス権にご注意ください。

## zAppBuildでの使用例

Metadata Storeの種類の選択は、`build-conf/build.properties`のプロパティーで指定します。Metadata StoreとしてUSSのファイルを使用する場合は、以下のプロパティーを指定します。

https://github.com/IBM/dbb-zappbuild/blob/5a649f0a591625be0bfe39dd880ef1d43ba8272f/build-conf/build.properties#LL137C1-L141C4

- **metadataStoreType=file**: Metadata StoreとしてUSSファイルを使用することを宣言しています。
- **metadataStoreFileLocation=xxx**: Metadataを格納するディレクトリを指定します。

metadataStoreFileLocationを指定しない場合、デフォルトでは$USER(ユーザーのホームディレクトリ)となります。
デフォルト設定の場合、例えばJENKIN1というユーザーを使用する場合、/u/JENKIN1がホームディレクトリだったとすると、/u/JENKIN1/.dbb/以下にメタデータが管理されます。

<details><summary><font color="blue">metadataディレクトリ/ファイル構造例</font></summary><div>
.dbb/metadata以下に作成されるディレクトリ、ファイルの例です

```
metadata
├── ISEConf2023_Jenkins01-main
│   └── buildresults
│       ├── build.20230314.210710.007
│       │   ├── attachments
│       │   │   ├── SAM1.log
│       │   │   └── SAM2.log
│       │   └── buildResult.json
│       ├── build.20230315.013654.036
│       │   ├── attachments
│       │   │   ├── SAM1.log
│       │   │   └── SAM2.log
│       │   └── buildResult.json
│       └── buildResults.json
├── ISEConf2023_MySampleDBB01-main
│   └── buildresults
│       ├── build.20230316.035546.055
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230316.035619.056
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230316.224132.041
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230327.213205.032
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230426.002832.028
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230426.013217.032
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230428.025801.058
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230430.060058.000
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230430.063537.035
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230510.210017.000
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230510.211034.010
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230510.211244.012
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230511.035332.053
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230511.035507.055
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230511.035745.057
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230511.040010.000
│       │   ├── attachments
│       │   └── buildResult.json
│       └── buildResults.json
├── ISEConf2023_VSCode01-main
│   └── buildresults
│       ├── build.20230315.013811.038
│       │   ├── attachments
│       │   └── buildResult.json
│       ├── build.20230316.035252.052
│       │   ├── attachments
│       │   └── buildResult.json
│       └── buildResults.json
└── dbb_default
    └── collections
        ├── ISEConf2023_Jenkins01-main
        │   ├── ISEConf2023_Jenkins01
        │   │   ├── ASM
        │   │   │   └── ASAM1.asm.json
        │   │   ├── COBOL
        │   │   ├── COPYBOOK
        │   │   ├── COPYLIB
        │   │   ├── COPYLIB-MVS
        │   │   ├── INCLUDELIB
        │   │   ├── INCLUDELIB-MVS
        │   │   ├── INCLUDES
        │   │   ├── JCL
        │   │   │   ├── DEBUG.jcl.json
        │   │   │   └── RUN.jcl.json
        │   │   ├── PLI
        │   │   │   ├── PSAM1.pli.json
        │   │   │   └── PSAM2.pli.json
        │   │   ├── RESOURCES
        │   │   ├── REXX
        │   │   │   └── FIB.rexx.json
        │   │   ├── REXXINC
        │   │   ├── REXXLIB
        │   │   ├── ansible
        │   │   │   └── templates
        │   │   ├── groovy
        │   │   ├── multiroot
        │   │   │   └── sam
        │   │   ├── zapp.yaml.json
        │   │   └── zowe
        │   ├── collection.json
        │   ├── logicalfiles.json
        │   └── references.json
        ├── ISEConf2023_Jenkins01-main-outputs
        │   ├── ISEConf2023_Jenkins01
        │   │   └── ASM
        │   ├── collection.json
        │   ├── logicalfiles.json
        │   └── references.json
        ├── ISEConf2023_MySampleDBB01-main
        │   ├── ISEConf2023_MySampleDBB01
        │   │   ├── cobol
        │   │   ├── copybook
        │   │   ├── images
        │   │   └── logs
        │   ├── collection.json
        │   ├── logicalfiles.json
        │   └── references.json
        ├── ISEConf2023_MySampleDBB01-main-outputs
        │   ├── ISEConf2023_MySampleDBB01
        │   ├── collection.json
        │   ├── logicalfiles.json
        │   └── references.json
        ├── ISEConf2023_VSCode01-main
        │   ├── ISEConf2023_VSCode01
        │   │   ├── cobol
        │   │   ├── copybook
        │   │   ├── images
        │   │   └── zapp.yaml.json
        │   ├── collection.json
        │   ├── logicalfiles.json
        │   └── references.json
        └── ISEConf2023_VSCode01-main-outputs
            ├── ISEConf2023_VSCode01
            │   └── cobol
            ├── collection.json
            ├── logicalfiles.json
            └── references.json
```

</div></details>

# Db2 for z/OSを使用する場合

Metadata Storeとして Unix System Service上のファイル・システム(zFS)を使用する場合について構成例、使用例を示します。

## 構成例
基本的には以下のガイドに従います。
[Setting up Db2 as the build metadata database](https://www.ibm.com/docs/en/dbb/2.0.0?topic=customization-database-setup)

前提として、使用するDb2サブシステム自体は構成され、稼働しているものとします。また、JDBC Type4 Driverでの接続が行える状態になっていることを前提とします。

### 0. 事前準備
Db2 for z/OS上にMetadataを格納するためのテーブルなどを作成する必要があります。ここでは、Db2 for z/OSの操作をWindows上のData Studioから行うことを想定しているので、Data StudioからDb2 for z/OSへの接続構成を行っておきます(Data Studioの構成自体は割愛します)。

ここでは、Wazi as a ServiceのStock Imageに含まれるDb2 for z/OSへの接続例を示します。Wazi as a Serviceへの接続の際はAT-TLSが使われることになりますので、TLS通信のための設定も必要になります。

#### (1)Db2接続情報確認
接続に必要な情報を確認します。

<details><summary><font color="blue">参考: DISPLAY DDF</font></summary><div>
`DISPLAY DDF`コマンドで情報確認

```
-DBD1 DISPLAY DDF                                                     
DSNL080I  -DBD1 DSNLTDDF DISPLAY DDF REPORT FOLLOWS: 019              
DSNL081I STATUS=STARTD                                                
DSNL082I LOCATION           LUNAME            GENERICLU               
DSNL083I DBD1LOC            EXPNET.DBD1LU1    -NONE                   
DSNL084I TCPPORT=8102  SECPORT=8102  RESPORT=8101  IPNAME=-NONE       
DSNL085I IPADDR=::10.1.1.2                                            
DSNL086I SQL    DOMAIN=wazi01                                         
DSNL105I CURRENT DDF OPTIONS ARE:                                     
DSNL106I PKGREL = COMMIT                                              
DSNL106I SESSIDLE = 001440                                            
DSNL099I DSNLTDDF DISPLAY DDF REPORT COMPLETE                         
IEA631I  OPERATOR IBMUSER  NOW INACTIVE, SYSTEM=VS01    , LU=81293903 
```

</div></details>

LOCATION名: DBD1LOC
TCPPORT: 8102

#### (2)CA証明書入手

AT-TLSで使用するCA証明書をData Studioから接続するWindowsにコピーします。
ここでは、`common_cacert.cer`というファイル名で保存するものとします。

#### (3)トラスト・ストアの作成

上のCA証明書を取り込んだトラスト・ストアをkeytoolコマンドで作成します。

<details><summary><font color="blue">keytoolコマンド実行例</font></summary><div>

※途中パスワードを聞かれるのでパスワードを指定します。

```
C:\xxx\wazi01_Cert> keytool -import -file .\common_cacert.cer -alias waziCA -keystore waziTrustStore.jks
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
所有者: CN=STOCK_SELF_SIGNED_CERT, OU=ZOSVSI, O=International Business Machines, C=US
発行者: CN=STOCK_SELF_SIGNED_CERT, OU=ZOSVSI, O=International Business Machines, C=US
シリアル番号: 0
有効期間の開始日: Mon Feb 27 13:00:00 JST 2023終了日: Mon Feb 05 12:59:59 JST 2024
証明書のフィンガプリント:
         SHA1: 71:4B:28:D2:1E:5B:59:D2:97:B1:03:63:0F:69:FC:07:AA:EA:D4:07
         SHA256: F5:D1:0F:70:68:AD:C6:91:51:9E:E7:46:25:FC:A2:BA:B5:9A:88:E2:5F:F2:8E:21:DD:C3:DC:D7:40:F2:DE:9B
署名アルゴリズム名: SHA256withRSA
サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵
バージョン: 3

拡張:

#1: ObjectId: 2.16.840.1.113730.1.13 Criticality=false
0000: 16 30 47 65 6E 65 72 61   74 65 64 20 62 79 20 74  .0Generated by t
0010: 68 65 20 53 65 63 75 72   69 74 79 20 53 65 72 76  he Security Serv
0020: 65 72 20 66 6F 72 20 7A   2F 4F 53 20 28 52 41 43  er for z/OS (RAC
0030: 46 29                                              F)


#2: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
  Non_repudiation
  Key_Encipherment
  Data_Encipherment
  Key_CertSign
  Crl_Sign
]

#4: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 79 F8 5E E5 81 32 F4 1B   24 92 6D 60 86 BB 4A 33  y.^..2..$.m`..J3
0010: 16 2B EA 96                                        .+..
]
]

この証明書を信頼しますか。 [いいえ]:  y
証明書がキーストアに追加されました
```

</div></details>

#### (5) DataStudio上での接続構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3d149f89-a5dc-ad6f-34f5-083388686cca.png)

### 1.データベースの作成

ストレージ・グループ、データベースを作成し、ユーザーに対してアクセス権を付与します。ここでは、ユーザー`JENKIN1`をDb2接続ユーザーとして使用することを想定しています。

SQL実行例

```sql
CREATE STOGROUP DBBSTG VOLUMES ('*') VCAT DBD1 ;

CREATE DATABASE DBBZ001 STOGROUP DBBSTG BUFFERPOOL BP16K0 CCSID UNICODE;
COMMIT;

GRANT USE OF STOGROUP DBBSTG TO JENKIN1;
GRANT DBADM ON DATABASE DBBZ001 TO JENKIN1;
```

上のsQLでは、ストレージ・グループ`DBBSTG`、データベース`DBBZ001`を作成し、`JENKIN1`ユーザーに権限付与しています。

### 2.テーブルの作成

/usr/lpp/IBM/idz/usr/lpp/IBM/dbb/ddl/create_DB2z.sqlに提供されるサンプルを使用して、各種テーブル類を作成します。

<details><summary><font color="blue">create_DB2z.sql</font></summary><div>

```sql:
/*******************************************************************************
 * Licensed Materials - Property of IBM
 * (c) Copyright IBM Corporation 2019, 2022. All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * Use, duplication or disclosure restricted by GSA ADP Schedule
 * Contract with IBM Corp.
 *******************************************************************************/
--<ScriptOptions statementTerminator=";"/>
SET SCHEMA DBBZ;

CREATE TABLE LOGICAL_FILE (
                C_ID BIGINT NOT NULL,
                LF_FILE VARCHAR(1024) NOT NULL,
                LF_LNAME CHARACTER(32) NOT NULL,
                LANG_ID BIGINT,
                LF_CICS CHAR(1) NOT NULL,
                LF_SQL CHAR(1) NOT NULL,
                LF_DLI CHAR(1) NOT NULL,
                LF_MQ CHAR(1) NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX LF_FILE_NDX ON LOGICAL_FILE (LF_FILE ASC);
ALTER TABLE LOGICAL_FILE ADD CONSTRAINT LF_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE LOGICAL_DEPENDENCY (
                C_ID BIGINT NOT NULL,
                C_LNAME CHARACTER(32) NOT NULL,
                CATEGORY_ID BIGINT,
                LIBRARY_ID BIGINT
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX LD_C_LNAME_NDX ON LOGICAL_DEPENDENCY (C_LNAME ASC);
CREATE INDEX LD_ALL_NDX ON LOGICAL_DEPENDENCY (C_LNAME ASC, CATEGORY_ID ASC, LIBRARY_ID ASC);
ALTER TABLE LOGICAL_DEPENDENCY ADD CONSTRAINT LD_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE COLLECTION (
                C_ID BIGINT NOT NULL,
                C_CREATED TIMESTAMP NOT NULL WITH DEFAULT,
                C_CREATED_BY CHARACTER(30),
                C_LAST_UPDATED TIMESTAMP NOT NULL WITH DEFAULT,
                C_LAST_UPDATED_BY CHARACTER(30),
                C_NAME CHARACTER(128) NOT NULL,
                PERMISSIONS_C_ID BIGINT
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
ALTER TABLE COLLECTION ADD CONSTRAINT COL_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE LF_LANGUAGES (
                C_ID BIGINT NOT NULL,
                C_LANGUAGE CHARACTER(32) NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX LANG_LANGUAGE_NDX ON LF_LANGUAGES (C_LANGUAGE ASC);
ALTER TABLE LF_LANGUAGES ADD CONSTRAINT LANG_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE LD_LIBRARIES (
                C_ID BIGINT NOT NULL,
                C_LIBRARY CHARACTER(44) NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX LIB_LIBRARY_NDX ON LD_LIBRARIES (C_LIBRARY ASC);
ALTER TABLE LD_LIBRARIES ADD CONSTRAINT LIB_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE LD_CATEGORIES (
                C_ID BIGINT NOT NULL,
                C_CATEGORY CHARACTER(32) NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX CAT_CATEGORY_NDX ON LD_CATEGORIES (C_CATEGORY ASC);
ALTER TABLE LD_CATEGORIES ADD CONSTRAINT CAT_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE DBB_TABLE_VERSIONS (
                DBB_TBL_NAME VARCHAR(50) NOT NULL,
                DBB_TBL_VERSION int
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE UNIQUE INDEX DBB_TBL_NAME_NDX ON DBB_TABLE_VERSIONS (DBB_TBL_NAME ASC);
ALTER TABLE DBB_TABLE_VERSIONS ADD CONSTRAINT DBB_TBL_NAME_NDX PRIMARY KEY (DBB_TBL_NAME);

CREATE TABLE BUILD_RESULT (
                C_ID BIGINT NOT NULL,
                C_CREATED TIMESTAMP NOT NULL WITH DEFAULT,
                C_CREATED_BY CHARACTER(30),
                BR_GROUP CHARACTER(128) NOT NULL,
                BR_LABEL CHARACTER(128) NOT NULL,
                BR_STATUS SMALLINT,
                BR_STATE SMALLINT,
                C_LAST_UPDATED TIMESTAMP NOT NULL WITH DEFAULT,
                C_LAST_UPDATED_BY CHARACTER(30),
                PERMISSIONS_C_ID BIGINT
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX BR_GROUP_NDX ON BUILD_RESULT (BR_GROUP ASC);
ALTER TABLE BUILD_RESULT ADD CONSTRAINT BR_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE BUILD_RESULT_PROPERTY (
                C_ID BIGINT NOT NULL,
                PROPERTY_NAME CHARACTER(128) NOT NULL,
                PROPERTY_VALUE VARCHAR(1024) NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX PROPERTY_NAME_NDX ON BUILD_RESULT_PROPERTY (PROPERTY_NAME ASC);
CREATE INDEX PROPERTY_VALUE_NDX ON BUILD_RESULT_PROPERTY (PROPERTY_VALUE ASC);
ALTER TABLE BUILD_RESULT_PROPERTY ADD CONSTRAINT PROPERTY_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE ARTIFACT (
                C_ID BIGINT NOT NULL,
                A_CHECKSUM BIGINT,
                A_TYPE VARCHAR(256) NOT NULL,
                A_NAME CHARACTER(128) NOT NULL,
                A_SIZE BIGINT
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX A_NAME_TYPE_NDX ON ARTIFACT (A_NAME ASC, A_TYPE ASC);
CREATE INDEX A_NAME_NDX ON ARTIFACT (A_NAME ASC);
ALTER TABLE ARTIFACT ADD CONSTRAINT A_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE ARTIFACT_CONTENT (
                C_ID BIGINT NOT NULL,
                CONTENT_DATA BLOB(100M)
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
ALTER TABLE ARTIFACT_CONTENT ADD CONSTRAINT CONTENT_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE PERMISSIONS (
                C_ID BIGINT NOT NULL,
                P_MANAGED_ID BIGINT NOT NULL,
                P_OWNER CHARACTER(30) NOT NULL,
                P_PERMISSION int,
                P_TEAM CHARACTER(30)
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
ALTER TABLE PERMISSIONS ADD CONSTRAINT P_CID_NDX PRIMARY KEY (C_ID);

CREATE TABLE LF_DEP_MAPPING (
                LF_ID BIGINT NOT NULL,
                DEP_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX LF_DEP_MAP_LFID_NDX ON LF_DEP_MAPPING (LF_ID ASC);
CREATE INDEX LF_DEP_MAP_DEPID_NDX ON LF_DEP_MAPPING (DEP_ID ASC);
ALTER TABLE LF_DEP_MAPPING ADD CONSTRAINT LF_DEP_MAP_NDX PRIMARY KEY (LF_ID, DEP_ID);

CREATE TABLE COL_LF_MAPPING (
                COLLECTION_ID BIGINT NOT NULL,
                LF_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX COL_LF_MAP_COLID_NDX ON COL_LF_MAPPING (COLLECTION_ID ASC);
CREATE INDEX COL_LF_MAP_LFID_NDX ON COL_LF_MAPPING (LF_ID ASC);
ALTER TABLE COL_LF_MAPPING ADD CONSTRAINT COL_LF_MAP_NDX PRIMARY KEY (COLLECTION_ID, LF_ID);

CREATE TABLE BR_REPORT_MAPPING (
                BR_ID BIGINT NOT NULL,
                REP_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX BR_REP_MAP_BRID_NDX ON BR_REPORT_MAPPING (BR_ID ASC);
CREATE INDEX BR_REP_MAP_REPID_NDX ON BR_REPORT_MAPPING (REP_ID ASC);
ALTER TABLE BR_REPORT_MAPPING ADD CONSTRAINT BR_REP_MAP_NDX PRIMARY KEY (BR_ID, REP_ID);

CREATE TABLE BR_REPORT_DATA_MAPPING (
                BR_ID BIGINT NOT NULL,
                REP_D_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX BR_REP_D_MAP_BRID_NDX ON BR_REPORT_DATA_MAPPING (BR_ID ASC);
CREATE INDEX BR_REP_D_MAP_REPDID_NDX ON BR_REPORT_DATA_MAPPING (REP_D_ID ASC);
ALTER TABLE BR_REPORT_DATA_MAPPING ADD CONSTRAINT BR_REP_D_MAP_NDX PRIMARY KEY (BR_ID, REP_D_ID);

CREATE TABLE BR_ATTACHMENT_MAPPING (
                BR_ID BIGINT NOT NULL,
                ATTACHMENT_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX BR_ATTACHMENT_MAP_BRID_NDX ON BR_ATTACHMENT_MAPPING (BR_ID ASC);
CREATE INDEX BR_ATTACHMENT_MAP_ATTACHMENTID_NDX ON BR_ATTACHMENT_MAPPING (ATTACHMENT_ID ASC);
ALTER TABLE BR_ATTACHMENT_MAPPING ADD CONSTRAINT BR_ATTACHMENT_MAP_NDX PRIMARY KEY (BR_ID, ATTACHMENT_ID);

CREATE TABLE BR_PROP_MAPPING (
                BR_ID BIGINT NOT NULL,
                PROP_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX BR_PROP_MAP_BRID_NDX ON BR_PROP_MAPPING (BR_ID ASC);
CREATE INDEX BR_PROP_MAP_PROPID_NDX ON BR_PROP_MAPPING (PROP_ID ASC);
ALTER TABLE BR_PROP_MAPPING ADD CONSTRAINT BR_PROP_MAP_NDX PRIMARY KEY (BR_ID, PROP_ID);

CREATE TABLE A_CONTENT_MAPPING (
                A_ID BIGINT NOT NULL,
                CONTENT_ID BIGINT NOT NULL
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
CREATE INDEX A_CONTENT_MAP_AID_NDX ON A_CONTENT_MAPPING (A_ID ASC);
CREATE INDEX A_CONTENT_MAP_CONTENTID_NDX ON A_CONTENT_MAPPING (CONTENT_ID ASC);
ALTER TABLE A_CONTENT_MAPPING ADD CONSTRAINT A_CONTENT_MAP_NDX PRIMARY KEY (A_ID, CONTENT_ID);

ALTER TABLE COLLECTION ADD CONSTRAINT UNQ_COLLECTION_0 UNIQUE (C_NAME);
ALTER TABLE BUILD_RESULT ADD CONSTRAINT UNQ_BUILD_RESULT_0 UNIQUE (BR_GROUP, BR_LABEL);

ALTER TABLE PERMISSIONS ADD CONSTRAINT UNQ_PERMISSIONS_0 UNIQUE (P_MANAGED_ID);
ALTER TABLE COLLECTION ADD CONSTRAINT CLLCTONPRMSSONSCID FOREIGN KEY (PERMISSIONS_C_ID) REFERENCES PERMISSIONS (C_ID);
ALTER TABLE BUILD_RESULT ADD CONSTRAINT BLDRSLTPRMSSONSCID FOREIGN KEY (PERMISSIONS_C_ID) REFERENCES PERMISSIONS (C_ID);

ALTER TABLE LOGICAL_FILE ADD CONSTRAINT LOGICALFILELANG_ID FOREIGN KEY (LANG_ID) REFERENCES LF_LANGUAGES (C_ID);
ALTER TABLE LOGICAL_DEPENDENCY ADD CONSTRAINT LGCLDPNDENCYLBRRYD FOREIGN KEY (LIBRARY_ID) REFERENCES LD_LIBRARIES (C_ID);
ALTER TABLE LOGICAL_DEPENDENCY ADD CONSTRAINT LGCLDPNDENCYCTGRYD FOREIGN KEY (CATEGORY_ID) REFERENCES LD_CATEGORIES (C_ID);
ALTER TABLE LF_DEP_MAPPING ADD CONSTRAINT LFDEPMAPPINGDEP_ID FOREIGN KEY (DEP_ID) REFERENCES LOGICAL_DEPENDENCY (C_ID);
ALTER TABLE LF_DEP_MAPPING ADD CONSTRAINT LFDEP_MAPPINGLF_ID FOREIGN KEY (LF_ID) REFERENCES LOGICAL_FILE (C_ID);
ALTER TABLE COL_LF_MAPPING ADD CONSTRAINT CLLFMPPINGCLLCTNID FOREIGN KEY (COLLECTION_ID) REFERENCES COLLECTION (C_ID);
ALTER TABLE COL_LF_MAPPING ADD CONSTRAINT COLLF_MAPPINGLF_ID FOREIGN KEY (LF_ID) REFERENCES LOGICAL_FILE (C_ID);
ALTER TABLE BR_REPORT_MAPPING ADD CONSTRAINT BRRPORTMAPPINGRPID FOREIGN KEY (REP_ID) REFERENCES ARTIFACT (C_ID);
ALTER TABLE BR_REPORT_MAPPING ADD CONSTRAINT BRREPORTMAPPINGBRD FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE BR_REPORT_DATA_MAPPING ADD CONSTRAINT BRRPRTDTMPPINGRPDD FOREIGN KEY (REP_D_ID) REFERENCES ARTIFACT (C_ID);
ALTER TABLE BR_REPORT_DATA_MAPPING ADD CONSTRAINT BRRPRTDTMAPPINGBRD FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE BR_ATTACHMENT_MAPPING ADD CONSTRAINT BRATTACHMENTMAPPINGATTACHMENT_ID FOREIGN KEY (ATTACHMENT_ID) REFERENCES ARTIFACT (C_ID);
ALTER TABLE BR_ATTACHMENT_MAPPING ADD CONSTRAINT BRATTACHMENT_MAPPINGBR_ID FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE BR_PROP_MAPPING ADD CONSTRAINT BRPROPMAPPINGPRPID FOREIGN KEY (PROP_ID) REFERENCES BUILD_RESULT_PROPERTY (C_ID);
ALTER TABLE BR_PROP_MAPPING ADD CONSTRAINT BRPROPMAPPINGBR_ID FOREIGN KEY (BR_ID) REFERENCES BUILD_RESULT (C_ID);
ALTER TABLE A_CONTENT_MAPPING ADD CONSTRAINT CNTNTMAPPINGCNTNTD FOREIGN KEY (CONTENT_ID) REFERENCES ARTIFACT_CONTENT (C_ID);
ALTER TABLE A_CONTENT_MAPPING ADD CONSTRAINT ACONTENTMAPPINGAID FOREIGN KEY (A_ID) REFERENCES ARTIFACT (C_ID);

CREATE TABLE DBB_SEQ_TABLE (
                DBB_SEQ_NAME VARCHAR(50) NOT NULL,
                DBB_SEQ_VALUE DECIMAL(15),
                PRIMARY KEY (DBB_SEQ_NAME)
        )
        DATA CAPTURE NONE
        IN DATABASE DBBZ001;
INSERT INTO DBB_SEQ_TABLE(DBB_SEQ_NAME, DBB_SEQ_VALUE) values ('DBB_ID_SEQ', 0);

INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('COLLECTION', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('LOGICAL_FILE', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('LOGICAL_DEPENDENCY', 1);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('ARTIFACT', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('BUILD_RESULT', 2);
INSERT INTO DBB_TABLE_VERSIONS(DBB_TBL_NAME, DBB_TBL_VERSION) VALUES ('PERMISSIONS', 2);
```

</div></details>

上で作成されたテーブルに対して、特定のユーザーのアクセス権を付与します。/usr/lpp/IBM/idz/usr/lpp/IBM/dbb/ddl/grant_DB2z.sqlにサンプルが提供されています。

<details><summary><font color="blue">grant_DB2z.sql</font></summary><div>

```sql
/*******************************************************************************
 * Licensed Materials - Property of IBM
 * (c) Copyright IBM Corporation 2022. All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * Use, duplication or disclosure restricted by GSA ADP Schedule
 * Contract with IBM Corp.
 *******************************************************************************/
--<ScriptOptions statementTerminator=";"/>
SET SCHEMA DBBZ;
GRANT DELETE, INSERT, SELECT, UPDATE
    ON TABLE
         A_CONTENT_MAPPING,
         ARTIFACT,
         ARTIFACT_CONTENT,
         BR_ATTACHMENT_MAPPING,
         BR_PROP_MAPPING,
         BR_REPORT_DATA_MAPPING,
         BR_REPORT_MAPPING,
         BUILD_RESULT,
         BUILD_RESULT_PROPERTY,
         COL_LF_MAPPING,
         COLLECTION,
         DBB_SEQ_TABLE,
         DBB_TABLE_VERSIONS,
         LD_CATEGORIES,
         LD_LIBRARIES,
         LF_DEP_MAPPING,
         LF_LANGUAGES,
         LOGICAL_DEPENDENCY,
         LOGICAL_FILE,
         PERMISSIONS
    TO JENKIN1;
COMMIT ;
```

※この襟では、ユーザー`JENKIN1`に対して権限を付与しています。

</div></details>

### 3.JDBC Driverの確認
ここでは、JDBC Type4 Driverを使用する想定なので、Type4 Driverのjarのパスを確認しておきます。

```
TAGUCHI : /u/TAGUCHI : > ls -la /usr/lpp/db2d10/jdbc/classes/
total 27040
drwxr-xr-x   3 BPXROOT  2611        8192 Dec 27 15:54 .
drwxr-xr-x   7 BPXROOT  2611        8192 Jun 14  2022 ..
drwxr-xr-x   2 BPXROOT  2611        8192 Jun 14  2022 IBM
-rwxr-xr-x   2 BPXROOT  2611     3814648 Jun 14  2022 db2jcc.jar
-rwxr-xr-x   2 BPXROOT  2611     6634906 Dec 27 15:54 db2jcc4.jar
-rwxr-xr-x   2 BPXROOT  2611       23709 Jun 14  2022 db2jcc_javax.jar
-rwxr-xr-x   2 BPXROOT  2611        2755 Jun 14  2022 db2jcc_license_cisuz.jar
-rwxr-xr-x   2 BPXROOT  2611     1629165 Jun 14  2022 sqlj.zip
-rwxr-xr-x   2 BPXROOT  2611     1668961 Dec 27 15:54 sqlj4.zip
```

`db2jcc4.jar` および `db2jcc_license_cisuz.jar` が `/usr/lpp/db2d10/jdbc/classes/`以下にあることを確認します。

### 4.TLS通信用のトラスト・ストア作成

TLS通信に使用するCA証明書を入手します。ここでは`common_cacert`とします。このCA証明書を取り込んだトラスト・ストアをkeytoolコマンドで作成します。

<details><summary><font color="blue">keytoolコマンド実行例</font></summary><div>

※途中パスワードを聞かれるのでパスワードを指定します。

```
JENKIN1 : /u/JENKIN1/DBB : > cat create_trustStore.sh
#!/bin/sh

keytool -import -file common_cacert -alias waziCA -keystore waziTrustStore_JENKIN1.jks

JENKIN1 : /u/JENKIN1/DBB : > ./create_trustStore.sh
Enter keystore password:

Re-enter new password:

Owner: CN=STOCK_SELF_SIGNED_CERT, OU=ZOSVSI, O=International Business Machines, C=US
Issuer: CN=STOCK_SELF_SIGNED_CERT, OU=ZOSVSI, O=International Business Machines, C=US
Serial number: 0
Valid from: 2/27/23 1:00 PM until: 2/5/24 12:59 PM
Certificate fingerprints:
         MD5:  38:0A:AE:A3:E7:00:BB:E5:13:CA:E8:E6:91:58:EA:49
         SHA1: 71:4B:28:D2:1E:5B:59:D2:97:B1:03:63:0F:69:FC:07:AA:EA:D4:07
         SHA256: F5:D1:0F:70:68:AD:C6:91:51:9E:E7:46:25:FC:A2:BA:B5:9A:88:E2:5F:F2:8E:21:DD:C3:DC:D7:40:F2:DE:9B
         Signature algorithm name: SHA256withRSA
         Version: 3

Extensions:

#1: ObjectId: 2.16.840.1.113730.1.13 Criticality=false
瑞瑞噫走盗楳抹銘抹桝楳抹又逗摩凰逗楳仙ﾁ>ﾁﾊ/ﾈﾁﾀﾂ`ﾈ諮髄椙迄抹逗蕪抹俣斧侭楳凰逗蕪抹摩ﾇﾁ・ﾄﾍﾊﾑﾈ`・ﾊﾎ諮瑞噫抹逗末姪逗/ﾃ氾蕪逗・斧泊箔ﾁﾊﾃ?ﾊ:|・ 芬瑞盗噫薄凰緕

#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
  Non_repudiation
  Key_Encipherment
  Data_Encipherment
  Key_CertSign
  Crl_Sign
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 79 f8 5e e5 81 32 f4 1b  24 92 6d 60 86 bb 4a 33  y....2....m...J3
0010: 16 2b ea 96                                        ....
]
]

#4: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]

Trust this certificate? [no]:  y
Certificate was added to keystore


89 directories, 53 files
```

</div></details>


### 5.環境変数設定

```sh:/etc/profile抜粋
...
export DBB_HOME=/usr/lpp/IBM/dbb
export DBB_CONF=/etc/dbb
...
```

dbbenv.shにて、JDBC DriverのjarをCLASSPATHに指定します。

```/etc/dbb/dbbenv.sh
#! /bin/sh
#
# Licensed materials - Property of IBM
# 5655-AC5 Copyright IBM Corp. 2018, 2022
# All rights reserved
# US Government users restricted rights  -  Use, duplication or
# disclosure restricted by GSA ADP schedule contract with IBM Corp.
#
###############################################################################################
##  Sample shell script to set DBB Environment Variables
##
##
##  Setup Instructions:
##  1) Replace default values (if they differ) with your system values.
##  2) Execute the script using ./dbbenv.sh
##
###############################################################################################
# DBB required variables
export DBB_HOME=/usr/lpp/IBM/dbb
export DBB_CONF=/etc/dbb

# Add Db2 JDBC Driver Jar Files to CLASSPATH
#export CLASSPATH=/usr/lpp/db2c10/jdbc/classes/db2jcc4.jar:/usr/lpp/db2c10/jdbc/classes/db2jcc_license_cisuz.jar:$CLASSPATH
export CLASSPATH=/usr/lpp/db2d10/jdbc/classes/db2jcc4.jar:/usr/lpp/db2d10/jdbc/classes/db2jcc_license_cisuz.jar:$CLASSPATH

# Db2 Data Server Driver variables required for Type 2 local connections
#export STEPLIB=DSNC10.SDSNEXIT:DSNC10.SDSNLOAD:DSNC10.SDSNLOD2:$STEPLIB
#export LIBPATH=/usr/lpp/db2c10/jdbc/lib:$LIBPATH
export STEPLIB=DB2.V13R1M0.SDSNEXIT:DB2.V13R1M0.SDSNLOAD:DB2.V13R1M0.SDSNLOD2:$STEPLIB
export LIBPATH=/usr/lpp/db2d10/jdbc/lib:$LIBPATH
```

db2connectino.confファイルにて、JDBC Typ4での接続用URLと、Db2スキーマを設定します。

```properties:/etc/dbb/db2Connection.conf
###############################################################################
# Licensed Materials - Property of IBM
# (c) Copyright IBM Corporation 2022. All Rights Reserved.
#
# Note to U.S. Government Users Restricted Rights:
# Use, duplication or disclosure restricted by GSA ADP Schedule
# Contract with IBM Corp.
###############################################################################

# Db2 server location. Local or remote URL.
#url=jdbc:db2:DBB1
#url=jdbc:db2://system1.company.com:5040/DBB1
url=jdbc:db2://localhost:8102/DBD1LOC:sslConnection=true;sslTrustStoreType=jks;sslTrustStoreLocation=/u/JENKIN1/DBB/waziTrustStore_JENKIN1.jks;sslTrustStorePassword=xxx;

# DBB Db2 Schema.  Default is DBBZ.
currentSchema=DBBZ

# Db2 Connection Security Mechanism Configuration
# For more details search 'securityMechanism' and 'encryptionAlgorithm' at
# https://www.ibm.com/docs/en/db2-for-zos/11?topic=information-data-server-driver-jdbc-sqlj-configuration-properties

# Specified DRDA security mechanism. Clear text user ID and password = 3.
securityMechanism=3

# Request AES security
#encryptionAlgorithm=2
```

### 6.RACF定義追加

#### Db2関連

Db2接続ユーザーとして`JENKIN1`を使用することを想定していますので、以下のTSOコマンドで権限を付与しておきます。

```
PERMIT DBD1.* CLASS(DSNR) ID(JENKIN1) ACCESS(READ)
SETROPTS  RACLIST(DSNR) REFRESH
```

#### DBB関連
参考: [Setting metadata store access permissions](https://www.ibm.com/docs/en/dbb/2.0.0?topic=customization-metadata-store-permissions)

以下のTSOコマンドで3つのグループを作成します。

```
ADDGROUP DBBADMNS OMVS(GID(1001))
ADDGROUP DBBUSERS OMVS(GID(1002))
ADDGROUP DBBGUEST OMVS(GID(1003))
```

以下のTSOコマンドで、ビルド実行ユーザー`TAGUCHI`を`DBBADMNS`グループにCONNECTします。

```
CONNECT TAGUCHI GROUP(DBBADMNS)
```

### 7.Db2接続ユーザーのパスワード・ファイル作成
参考: [Metadata store - Creating an IBM Db2 metadata store connection](https://www.ibm.com/docs/en/dbb/2.0.0?topic=apis-metadata-store#creating-an-ibm-db2-metadata-store-connection)

Db2への接続する際に使用するパスワード情報を、暗号化したファイルとして生成するユーティリティー(pwf.sh)が提供されています。それを使用して、Db2接続ユーザー(ここでは`JENKIN1`を想定)のパスワードを、暗号化したファイルとして作成しておきます。

```
JENKIN1 : /u/JENKIN1/DBB : > $DBB_HOME/bin/pwf.sh pass.txt
Enter password:

JENKIN1 : /u/JENKIN1/DBB : > ls -la
total 48
drwxr-xr-x   2 JENKIN1  SYS1        8192 May  9 16:49 .
drwxr-xr-x  10 JENKIN1  SYS1        8192 May  9 16:48 ..
-rw-------   1 JENKIN1  SYS1         244 May  9 16:49 pass.txt

JENKIN1 : /u/JENKIN1/DBB : > cat pass.txt
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>1.0</comment>
<entry key="version">2</entry>
<entry key="password">l2IXUwWVuhAHur02HYvubQ==</entry>
```

## zAppBuildでの使用例

### build-conf/build.properties

Metadata Storeの種類の選択は、build-conf/build.propertiesのプロパティーで指定します。Metadata Storeとしてdb2を使用する場合は、以下のプロパティーを指定します。

https://github.com/IBM/dbb-zappbuild/blob/5a649f0a591625be0bfe39dd880ef1d43ba8272f/build-conf/build.properties#LL137C1-L138C4

https://github.com/IBM/dbb-zappbuild/blob/5a649f0a591625be0bfe39dd880ef1d43ba8272f/build-conf/build.properties#LL147C11-L149C11

- **metadataStoreType=db2**: Metadata StoreとしてUSSファイルを使用することを宣言しています。
- **metadataStoreDb2ConnectionConf=/etc/dbb/db2Connection.conf**: Db2への接続情報を設定している構成ファイルを指定します。

### ビルド・コマンドのオプション指定

Db2接続に使用するユーザーID/パスワード情報はビルド実行時のオプションで指定します。
参考: [Building Applications with zAppBuild - Command Line Options Summary](https://github.com/IBM/dbb-zappbuild/blob/5a649f0a591625be0bfe39dd880ef1d43ba8272f/BUILD.md#command-line-options-summary)

- **--id**: Db2接続ユーザー
- **--pwFile**: パスワード・ファイル

ビルド・コマンド実行のスクリプト例

```sh
#!/bin/sh

. /etc/dbb/dbbenv.sh

/usr/lpp/IBM/dbb/bin/groovyz /u/TAGUCHI/DBB/dbb-zappbuild/build.groovy --logEncoding UTF-8 --workspace /u/TAGUCHI/DBB --application ISEConf2023_MySampleDBB01 --hlq TAGUCHI.DBB --outDir /u/TAGUCHI/DBB/logs --verbose --fullBuild --id JENKIN1 --pwFile /u/JENKIN1/DBB/pass.txt
```