Development and Pipeline - Group home

Migrating to IBM Dependency Based Build 2.0 (Part 1)

  

How the DevOps Acceleration Team has migrated their demo environment to IBM Dependency Based Build 2.0 

IBM Dependency Based Build (DBB) is at the core of continuous integration/continuous deployment (CI/CD) pipelines when building z/OS applications with the IBM Z DevOps solution. DBB 2.0 was released in October 2022 and brings important changes to improve the product's performance and user experience, as well as simplify its installation and maintenance. These advances require several changes in the z/OS infrastructure and pipeline configuration for existing DBB 1.x pipelines. While detailed documentation about the required adaptations can be found at Upgrading to DBB 2.0, this series of blog entries will outline the activities the IBM Z DevOps Acceleration Team performed when migrating an existing build framework for z/OS applications from DBB 1.1.x to DBB 2.0.

To facilitate this migration, we divided the overall process into three different parts that can be performed when needed. This split of activities should also minimize the impact of such a migration, just as a production environment would require. The different parts of the migration process are reflected in the following blog posts:

Part 1 - Migrate existing datastore managed in Derby to Db2z documents the database migration from the Derby to Db2 for z/OS (Db2z), which was a technical debt in our environment that we had to address before being able to move to DBB 2.0. Moreover, DBB 2.0 doesn't support Derby as a database provider, making this migration step mandatory.
Part 2 - Preparing the customized build framework implementation and GitLab pipelines for DBB 2.0 explains the necessary changes to the existing environment and GitLab pipelines to prepare the migration of an application with minimal impact and no disruption.
Part 3 - Migration activities for our applications describes the actual migration activities for our two example applications: `retirementCalculator` and `catalog-manager`.

Our example CI/CD pipeline, which we use for demonstration, education purposes, and to build our DevOps Acceleration Team (DAT) resources, consists of GitLab as the DevOps platform (source code management system and CI/CD pipeline orchestrator), IBM Dependency Based Build (DBB) as the build engine, and IBM UrbanCode Deploy (UCD) as the deployment manager.

Part 1 - Migrate existing datastore managed in Derby to Db2z


This first blog post will take you through the steps we performed to migrate our existing datastore of DBB's build dependency and results metadata from Derby to Db2z. DB2z and DB2 for Linux, Unix, and Windows (DB2 LUW) are both compatible with DBB 2.0, but this blog will follow our experience migrating to DB2z.

For a very long time, our demo setup used IBM DBB 1.1.3 and the DBB WebApp's built-in Derby database. However, Derby is no longer supported with DBB 2.0 due to the discontinuation of the WebApp. Because we wanted to preserve our applications' dependency information (DBB collections) and build results while migrating from DBB 1.1.3 to DBB 2.0, we decided to migrate the contents of our Derby database to a Db2 infrastructure setup. As a Db2z instance was already available on our z/OS LPAR, we decided to leverage this facility.

Note: If you already use Db2 as your datastore for DBB and plan to continue the existing installation, you do not have to migrate your datastore and can proceed to our next blog post about Migration preparation for the existing environment and for GitLab pipelines.

Our datastore migration process can be summarized in three steps:

As this migration process involves z/OS configuration and database administration, these steps would typically be implemented by a system programmer and/or a database administrator.

Create a new database in Db2z

We started by creating a new database DBBZGLB and using a new schema DBBGITLAB to isolate our environment in our Db2z instance. Following the DBB documentation for Setting up Db2 as the build metadata database, the following script was used to set up the database on Db2z:
CREATE DATABASE DBBZGLB STOGROUP DBBSTG BUFFERPOOL BP16K0 CCSID UNICODE;
COMMIT;

For the creation of the database schema, a SQL script was used to facilitate this task. Sample SQL scripts are shipped with the DBB Toolkit on z/OS, available in the subfolder ddl.

For the creation of the tables and the indexes, we started from the create_DB2z.sql script, for which we updated the schema and the database references in order to isolate our instance.

The following script is the result of our customization:
/*******************************************************************************
 * 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 DBBGITLAB;

-- Create tables

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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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 DBBZGLB;
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);

We then submitted the script for the database creation through the data perspective in IBM Developer for z/OS (IDz).

Additionally, the new DBB metadata store API required us to grant permissions to the user connecting to the Db2z database. We achieved this with the SQL script provided in section 1.3 ("Authorize user access to the database") of the documentation page Setting up Db2 as the build metadata database.

Migrate existing database contents


To support the database migration between different flavors of database managers, IBM provides a new DBB database migration utility on request to move the content of DBB tables from one database to another. You can access this new utility by reaching out to your IBM support team. We leveraged this new utility to migrate our existing data (DBB collections and build results) from Derby to our Db2z instance.

The utility is a Java application that reads the contents from the source database system and stores them in the provided target database via the JDBC driver. When you are considering a Db2 to Db2 migration, we recommend leveraging the Db2 migration capabilities. Below is our output from running the DBB database migration utility on z/OS.
Note: In our case, we are defining the correct target database schema by using the currentSchema property specified via the JDBC connection URL.
java -cp dbb.database.migration.util-0.9.0.jar::/opt/DBB-1.1.3-GitLab/wlp/usr/shared/resources/db2/*:/opt/DBB-1.1.3-GitLab/wlp/usr/shared/resources/derby/lib/* com.ibm.dbb.database.migration.MigrateDatabase
* DBB Database migration util *
* --------------------------  *
** Prompting to specify source and target dbms information
 Enter your source dbms information
  Source dbms [Derby, Db2]: Derby
  url: jdbc:derby://10.3.20.96:1527//opt/DBB-1.1.3-GitLab/wlp/usr/servers/dbb/DBB_DATABASE
  userid:
  password:
 Enter your target dbms information
  Target dbms [Derby, Db2]: Db2
  url: jdbc:db2://10.3.20.201:4740/MOPDBC0:currentSchema=DBBGITLAB;
  userid: DBEHM
  password: xxxxxx
** Establishing JDBC connections
**** Create the connection to Derby database using: jdbc:derby://10.3.20.96:1527//opt/DBB-1.1.3-GitLab/wlp/usr/servers/dbb/DBB_DATABASE
**** Create the connection to DB2z database using: jdbc:db2://10.3.20.201:4740/MOPDBC0:currentSchema=DBBGITLAB;
** Starting Database Migration
	DBB_TABLE_VERSIONS
	Updating table
	PERMISSISONS
	Updating table
	LF_LANGUAGES
	Updating table
	LD_LIBRARIES
	Updating table
	LD_CATEGORIES
	Updating table
	LOGICAL_DEPENDENCY
	Updating table
	LOGICAL_FILE
	Updating table
	LF_DEP_MAPPING
	Updating table
	COLLECTION
	Updating table
	COL_LF_MAPPING
	Updating table
	ARTIFACT
	Updating Table
	BUILD_RESULT
	Updating table
	BR_REPORT_MAPPING
	Updating table
	BR_REPORT_DATA_MAPPING
	Updating Table
	BR_ATTACHMENT_MAPPING
	Updating Table
	BUILD_RESULT_PROPERTY
	Updating table
	BR_PROP_MAPPING
	Updating table
	ARTIFACT_CONTENT
	Updating Table
	A_CONTENT_MAPPING
	Updating Table
** Migration Summary
	Added table elements: 47826
	Updated table elements: 0
	Skipped table elements: 6
** Closing JDBC connections
** Database Migration Completed

Configure the DBB WebApp to leverage Db2z as the datastore


For the last step of the datastore migration process, we needed to reconfigure the DBB WebApp to point to the Db2z instance that we just migrated to. This step is documented in DBB's 1.1 documentation in the chapter Setting up Db2 as DBB server database.

To implement this change, we stepped through the following process:

  1. Log on to the Linux machine that hosts the DBB WebApp server, preferably with SSH or any other facility that allows you to edit file content.

  2. Create a configuration file <server>/wlp/usr/servers/dbb/configDropins/overrides/databaseConfig.xml that defines the connection to Db2z. A sample is located in <server>/wlp/usr/servers/dbb/config_samples/db2zDatabaseConfig.xml and we used the following snippet in our environment setup:
    <jdbcDriver id="db2zJDBCdriver">
    	<library name="DB2Lib">
    		<fileset dir="${shared.resource.dir}/db2" includes="*.jar"/>
    	</library>
    	</jdbcDriver>
    	<dataSource id="dbbConnection" jdbcDriverRef="db2zJDBCdriver" jndiName="jdbc/dbbConnection" transactional="false">
    		<properties.db2.jcc driverType="4" serverName="10.3.20.201" portNumber="4740" user="DBUSER" password="DBPWD" databaseName="MOPDBC0" />
    	</dataSource>
    ...
  3. If you choose to use a different database schema than the default DBBZ schema, don't forget to add your custom schema name to the dbb.properties file located at <server>/wlp/usr/servers/dbb/dbb.properties. The following snippet shows how we set our DBB database schema to the same `DBBGITLAB` schema we used when creating the new DB2z datastore.

    #com.ibm.dbb.persistence.dbSchema defines the customized schema for the DBB database. By default, the schema is DBBZ.
    #This value along with the dbSchemaPrefix must match the value used in the create sql scripts. 
    com.ibm.dbb.persistence.dbSchema = DBBGITLAB

We then restarted the DBB WebApp server, enabling it to now use the Db2z database to store the DBB high-level objects.

Conclusion


In this blog post, we explained how we migrated our existing DBB metadata from DBB 1.1.3's built-in Derby database to a Db2z instance. So far, CI/CD pipelines and applications would not notice any difference, as we are still using DBB 1.1.3 as our build engine.

In our next blog post, we will discuss the analysis and steps we took to understand the required changes to be implemented to our existing CI/CD environment.
Authors of this post

Lauren Li, DevOps Acceleration Team

Mathieu Dalbin, DevOps Acceleration Team

Dennis Behm, DevOps Acceleration Team