Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Corrected links that should have been relative instead of absolute.

You can use a CI/CD pipeline for importing the Adeptia Connect objects to a new environment automatically. This CI/CD pipeline uses the Exported ZIP file that you must have created as a prerequisite for import operation, and imports the You can use a CI/CD pipeline for importing the Adeptia Connect objects to a new environment automatically. This CI/CD pipeline uses the Exported ZIP file that you must have created as a prerequisite for import operation, and imports the objects to the target environment.

...

The diagram below represents how the import pipeline works, and automates the import process. 

Image RemovedImage Added

When triggered, the pipeline performs the following sequence of actions.

...

To start with importing the objects, you first need to create an import pipeline having all the required parameters for exporting the objects.

Info
Adeptia provides you with

...

an import pipeline file that you can

...

use to create the pipeline.

After you create the pipeline, you need to trigger the pipeline to perform the import operation.

...

To create the pipeline in Jenkins using the import pipeline provided by Adeptia, follow the steps given below.

  1.  Log in to the Jenkins with admin privileges.

  2.  Select New Item.


  3. Enter a name for the Import pipeline, and then select Pipeline.

  4. Click OK.

  5. Copy the content the content from the provided import provided import pipeline file.

    Expand
    titleImport pipeline


    Code Block
    languagecss
    themeMidnight
    import jenkins.model.Jenkins
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.io.File;
    
    
    /*
        This pipeline used to deploys migration promotion through operations like import, rollback, retain from one build environment to another.
    
        Pipeline is made up of following steps
        1. Init Perameters
        2. Pull import/retain XML and source solution zip file from GitHub
        3. Upload import/retain XML and source solution zip to k8 shared PVC
        4. Download Helm chart & deploy migration solution (import/retain/rollback)
        5. Download rollback zip from k8 shared PVC
        6. Push rollback zip to GitHub
    	7. Clean up workspace
    
    	Pre-requisite
    	a) Tools/Plugins needs to install:
    		1. Helm
    		2. kubectl client
    		3. Jenkins
    		4. Java 1.8+
    	b) OS Linux
    	c) Jenkins plugins
    		1. Kubernetes
    		2. Nexus
    		3. Git (git plugin 4.8.3, Git client plugin 3.9.0)
    		43. Mask Password
    		54. Credentials Binding Plugin (1.27)
    		65. Parameter Separator
    		76. BlueOcean (Optional)
    		
    	Usage:
    		Steps to create pipeline using jenkinsfile.
    		1. Login into the Jenkins GUI with admin privileges.
    		2. create a pipeline by choosing New Item > Pipeline.
    		3. Copy/past containt of jenkinsfile to Pipeline Definition area.
    		4. Uncheck checkbox "Use Groovy Sandbox".
    		5. Save the pipeline.
    		6. Trigger the pipeline once to initilaize parameters.
    		
    */
    
    /*
        Upload file to Kubernetes PVC
     */
    def uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, SRC_FILE_PATH, TRG_FILE_PATH) {
        echo "Upload file("+SRC_FILE_PATH+")files to K8 shared PVC"
    		withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) {
    					try {
    						  wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[NEXUS_PASSWORD:'NEXUS_PASSWORD']]]) {
    						  sh '''
    							#!/bin/shbash
    							kubectl config use-context '''+CLUSTER_CONTEXT+'''
    							TRG_FILE_PATH='''+TRG_FILE_PATH+'''
    							if [[ ${TRG_FILE_PATH::1} == "/" ]]
    								then
    								  TRG_FILE_PATH=${TRG_FILE_PATH:1};
    								else
    								  echo "Forward shash(/) already removed "; fi
    							podname=$(kubectl -n '''+NAMESPACE+''' get pods | grep -m 1 autoscaler | awk '{print $1}')
    							kubectl -n '''+NAMESPACE+''' cp '''+SRC_FILE_PATH+''' ${podname}:${TRG_FILE_PATH}
    							jobname=$(kubectl -n '''+NAMESPACE+''' get jobs | grep -m 1 migration | awk '{print $1}')
    							if [[ -n "$jobname" ]]; then
    								kubectl -n '''+NAMESPACE+''' delete job ${jobname}
    								else 
    									echo "Migration resource does not exist"
    							fi
    											'''
    			
    			  }				 						  
    						} catch (err) {
    								echo "Caught: ${err}. Error in uploading file."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    						}
    }
    
    /*
        Download file from Kubernetes PVC
     */
    def downloadFromSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, SRC_FILE_PATH, TRG_FILE_PATH) {
        echo "Download file("+SRC_FILE_PATH+")files from K8 shared PVC"
    		withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) {
    					try {
    						sh '''
    							#!/bin/shbash
    							SRC_FILE_PATH='''+SRC_FILE_PATH+'''
    							if [[ ${SRC_FILE_PATH::1} == "/" ]]
    								then
    								  SRC_FILE_PATH=${SRC_FILE_PATH:1};
    								else
    								  echo "Forward shash(/) already removed "; fi
    							kubectl config use-context '''+CLUSTER_CONTEXT+'''
    							podname=$(kubectl -n '''+NAMESPACE+''' get pods | grep -m 1 autoscaler | awk '{print $1}')
    							kubectl -n '''+NAMESPACE+''' cp ${podname}:${SRC_FILE_PATH} '''+TRG_FILE_PATH+'''
    								'''											
    						} catch (err) {
    								echo "Caught: ${err}. Error in downloading file from K8 PVC."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    						}
    }
    
    /*
        Pull Helm Chart
     */
    def pullHelmChart (NEXUS_CREDENTIALS_ID, NEXUS_HELM_REPO_URL, CHART_NAME) {
        echo "Pull Helm Chart ("+CHART_NAME+") from NexusArtifact repository"
    		withCredentials([usernamePassword(credentialsId: NEXUS_CREDENTIALS_ID, passwordVariable: 'NEXUS_PASSWORD', usernameVariable: 'NEXUS_USERNAME')]) {Hub"
    					try {
    						sh '''#!/bin/hide password field
    bash
    							wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[NEXUS_PASSWORD:'NEXUS_PASSWORD']]]) {
    helm repo add adeptia-connect-migration '''+HELM_REPO_URL+'''
    							sh helm pull adeptia-connect-migration/'''+CHART_NAME+''' --untar					
    							#!/bin/sh'''
    							helm} repocatch add(err) nexushelmrepo '''+NEXUS_HELM_REPO_URL+''' --username '''+NEXUS_USERNAME+''' --password '''+NEXUS_PASSWORD+'''
    {
    								echo "Caught: ${err}. Error in pulling Helm chart from repo."
    								helm pull nexushelmrepo/'''+CHART_NAME+''' --untarerror("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							'''}
    						}
    						} catch (err) {
    								echo "Caught: ${err}. Error in pulling
    }
    
    /*
        Deploy Helm to Kubernetes cluster
     */
    def deployToCluster (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, DATABASE_CREDENTIALS_ID, SERVER_URL) {
        echo "Deploy Helm chart fromto NexusKubernetes repo.cluster"
    					try {
    					error("Caught: ${err}")	def BACKEND_DB_USERNAME = getUserName(DATABASE_CREDENTIALS_ID);
    								currentBuild.resultdef BACKEND_DB_PASSWORD = 'FAILURE'getPassword(DATABASE_CREDENTIALS_ID);
    							}withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) {
    					}
    		
    }
    
    /*
        Deploy Helm to Kubernetes cluster
     */
    def deployToCluster (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, DATABASE_CREDENTIALS_ID, SERVER_URL) {
        echo "Deploy Helm chart to Kubernetes cluster"
    					try {
    	//hide password field
    						wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password:BACKEND_DB_PASSWORD], [password:BACKEND_DB_USERNAME]]]) { 
    						  sh '''#!/bin/bash
    							def BACKEND_DB_USERNAME = getUserName(DATABASE_CREDENTIALS_ID);
    kubectl config use-context '''+CLUSTER_CONTEXT+'''
    							def helm upgrade -i migration migration -f migration/values.yaml --set environmentVariables.BACKEND_DB_PASSWORD = getPassword(DATABASE_CREDENTIALS_ID);
    						withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) {
    						//hide password field
    						wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password:BACKEND_DB_PASSWORD], [password:BACKEND_DB_USERNAME]]]) { 
    						  sh '''	  
    							#!/bin/sh
    							kubectl config use-context '''+CLUSTER_CONTEXT+'''
    							helm upgrade -i migration migration -f migration/config/values-qa.yamlURL=${BACKEND_DB_URL} --set environmentVariables.BACKEND_DB_USERNAME='''+BACKEND_DB_USERNAME+''' --set environmentVariables.BACKEND_DB_PASSWORD='''+BACKEND_DB_PASSWORD+''' --set environmentVariables.BACKEND_DB_DRIVER_CLASS=${BACKEND_DB_DRIVER_CLASS} --set environmentVariables.BACKEND_DB_TYPE=${BACKEND_DB_TYPE} --set environmentVariables.BACKENDSOURCE_DBZIP_URLPATH=${BACKENDSOURCE_DBZIP_URLPATH} --set environmentVariables.BACKENDMIGRATION_DBXML_USERNAME='''+BACKEND_DB_USERNAME+'''FILE_PATH=${MIGRATION_XML_FILE_PATH} --set environmentVariables.BACKENDOVERRIDE_DB_PASSWORD='''+BACKEND_DB_PASSWORD+'''USER=${OVERRIDE_USER} --set environmentVariables.BACKENDOVERRIDE_DBMODIFIEDBY_DRIVER_CLASSUSER=${BACKENDOVERRIDE_DBMODIFIEDBY_DRIVER_CLASSUSER} --set environmentVariables.BACKENDRETAIN_DBXML_TYPEPATH=${BACKENDRETAIN_DBXML_TYPEPATH} --set environmentVariables.SOURCELOG_ZIP_PATHIDENTIFIER=${SOURCELOG_ZIP_PATHIDENTIFIER} --set environmentVariables.MIGRATION_XML_FILE_PATHOPERATION=${MIGRATION_XML_FILE_PATHOPERATION} --set environmentVariables.OVERRIDE_USER=${OVERRIDE_USER} --set environmentVariables.OVERRIDE_MODIFIEDBY_USER=${OVERRIDE_MODIFIEDBY_USER} --set environmentVariables.RETAIN_XMLROLLBACK_ZIP_PATH=${RETAINROLLBACK_XML_PATH} --set environmentVariables.LOG_IDENTIFIER=${LOG_IDENTIFIER} --set environmentVariables.OPERATION=${OPERATION} --set image.tag=${LATEST_TAGZIP_PATH} -n '''+NAMESPACE+'''
    											'''	
    							}
    						}
    						} catch (err) {
    								echo "Caught: ${err}. Error in deploying Helm chart."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    }
    
    /*
        Wait until deployment finish on Kubernetes cluster
     */
    def waitUntilDepoymentComplete(NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, POD, time_out) {
        echo "Try to fetch theFetching pod status"
    					try {
    						int inter = 5, count = 1;					
    						withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) {
    						sh('kubectl config use-context ${CLUSTER_CONTEXT};')
    						while (true) {
    								def status = sh script: "kubectl -n ${NAMESPACE} get pods | grep -m 1 ${POD} | awk '{print \$3}' ", returnStdout: true
                                    if (status.toString().trim().contains("Completed")) {
                                        break;
                                        }
    								else if (status.toString().trim().contains("Error")) {
    									error("Caught: Migration deployment failed due to error. Please check migration logs.")
    									currentBuild.result = 'FAILURE'
                   sleep(inter) 							   echo count+" retry in "+inter*count+" seconds." 							   count++
    							     if ((count)>=((time_out-5)/inter)) {
    									error("Caught: Migration deployment is taking more then ideal time. Please check migration logs.")
    									currentBuild.result = 'FAILURE'
    									break;
    							   } break;
                                        }
               } 						}	
    						} catch (err) {                   sleep(inter)
    								   echo count+"Caught: ${err}. Error in fetching pod status retry in "+inter*count+" seconds."
    								error("Caught: ${err}")   count++
    								currentBuild.result = 'FAILURE'   if ((count)>=((time_out-10)/inter)) {
    							}
    }
    
    /*
        Push soution Zip to GitHub reposirory
     */
    def pushToGitHub (GIT_BRANCH, GIT_CREDENTIALS_ID, GIT_REPO_URL, FILE_PATH) {		error("Caught: Migration deployment taking more then ideal time. Please check migration logs.")
    									currentBuild.result = 'FAILURE'
    									break;
    							   }
               echo "Push file ("+FILE_PATH+") to GitHub repo"
    				withCredentials([gitUsernamePassword(credentialsId: GIT_CREDENTIALS_ID, gitToolName: 'git-tool')]) {
    					try {               }
    						}	sh('sleep
    10')
    							sh('git add '+FILE_PATH)
    } catch (err) {
    								sh('git commit -m "auto commit message" ')
    							sh('git push ${GIT_REPO_URL} HEAD:'+GIT_BRANCH)
    						} catch (err) {
    								echo "Caught: ${err}. Error in pushing file to Githubecho "Caught: ${err}. Error in fetching pod status. Migration deployment taking more then ideal time. Please check migration logs."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    					}
    }
    
    /*
        Generate rollbackPush soution Zip to fileGitHub pathrepository
     */
    def convertRollbackZipPathpushToGitHub (FILE_PATH) {
    					def rollbackZipPath = null
    					def Append = "Rollback_"GIT_BRANCH, GIT_CREDENTIALS_ID, GIT_REPO_URL, FILE_PATH) {
        echo "Pushing file ("+FILE_PATH+") to GitHub repo"
    				withCredentials([gitUsernamePassword(credentialsId: GIT_CREDENTIALS_ID, gitToolName: 'git-tool')]) {
    					try {
    						Pathdef pathgitUser = Paths.get(FILE_PATHgetUserName(GIT_CREDENTIALS_ID);
    						def fileName=path.getFileName().toString()
    	sh('sleep 10')
    							def parentDir=path.getParent().toString()sh('git config --global user.name "'+gitUser+'"')
    						rollbackZipPath=parentDir + File.separator + Append + fileName
    	sh('git config --global user.email "you@example.com"')
    							if(isUnix()){
    sh('git add '+FILE_PATH)
    							rollbackZipPath=rollbackZipPath.replace("\\", "/"sh('git commit -m "auto commit message" ')
    							sh('git push ${GIT_REPO_URL} HEAD:'+GIT_BRANCH)
    						} catch (err) {
    								echo "Caught: ${err}. Error in generatingpushing rollbackfile soution Zip file pathto Github."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    					return rollbackZipPath}
    }
    
    /*
        GetGenerate rollback usernamesoution fromZip credentialsfile idpath
     */
    def getUserNameconvertRollbackZipPath(idFILE_PATH) {
    					def userNamerollbackZipPath = null
    	withCredentials([usernamePassword(credentialsId: id, passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {					def Append = "Rollback_"
    					try {
    						userNamePath path = USERNAMEPaths.get(FILE_PATH);
    						} catch (err) {
    		def fileName=path.getFileName().toString()
    						def parentDir=path.getParent().toString()
    						echo "Caught: ${err}. Error in extracting username from "+id+" ."rollbackZipPath=parentDir + File.separator + Append + fileName
    								errorif(isUnix()){
    						rollbackZipPath=rollbackZipPath.replace("\\", "/")
    						}
    						} catch (err) {
    								echo "Caught: ${err}. Error in generating rollback soution Zip file path."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    				}
    	return userNamerollbackZipPath
    }
    
    /*
        Get passwordusername from credentials id
     */
    def getPasswordgetUserName(id) {
    	def passworduserName = null
    	withCredentials([usernamePassword(credentialsId: id, passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
    					try {
    						passworduserName = PASSWORD;USERNAME
    						} catch (err) {
    								echo "Caught: ${err}. Error in extracting passwordusername from "+id+" ."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    	}
    	return passworduserName
    }
    							  
    					
    pipeline {
    	// Global default variables
        environment {
    		time_out = 100
        }
    	parameters{
    		//separator(name: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeader: '''Global Parameters''', sectionHeaderStyle: 'background-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', separatorStyle: '''font-weight:bold;line-height:1.5em;font-size:1.5em;''')
    		string(defaultValue: '', description: 'Nexus credentials ID configured in Jenkins e.g. nexus_credentialsId', name: 'NEXUS_CREDENTIALS_ID', trim: true) 
    		string(defaultValue: '', description: 'Nexus Server URL e.g. https://nexus.adeptia.com:8443/repository/adeptia-internal-helm', name: 'NEXUS_HELM_REPO_URL', trim: true) 
    		string(defaultValue: '', description: 'Name of Helm chart to be downloaded from Nexus repository e.g migration', name: 'CHART_NAME', trim: true)
    		
    /*
        Get password from credentials id
     */
    def getPassword(id) {
    	def password = null
    	withCredentials([usernamePassword(credentialsId: id, passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
    					try {
    						password = PASSWORD;
    						} catch (err) {
    								echo "Caught: ${err}. Error in extracting password from "+id+" ."
    								error("Caught: ${err}")
    								currentBuild.result = 'FAILURE'
    							}
    	}
    	return password
    }
    							  
    					
    pipeline {
    	// Global default variables
        environment {
    		//manage deployment status timeout
    		time_out = 300
        }
    	parameters{
    		//separator(name: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeader: '''GitHubHelm Chart Parameters''', sectionHeaderStyle: 'background-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', separatorStyle: '''font-weight:bold;line-height:1.5em;font-size:1.5em;''') 
    		string(defaultValue: '', description: 'GitHubArtifactHub credentialsHelm ID configured in Jenkinschart URL e.g. gitCredential_idhttps://adeptia.github.io/adeptia-connect-migration/charts', name: 'GITHELM_CREDENTIALSREPO_IDURL', trim: true) 
    		string(defaultValue: '', description: 'GitHub server URLName of Helm chart to be downloaded from ArtifactHub repository e.g. https://github.com/adeptia/migration-defination.git', name: 'GITCHART_REPO_URLNAME', trim: true)
    		string(defaultValue
    		//separator(name: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', descriptionsectionHeader: '''GitHub Branch name e.g. mainParameters''', namesectionHeaderStyle: 'GIT_BRANCHbackground-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', trimseparatorStyle: true)
    		string(defaultValue: '', description: 'Source zip path to be downloaded from GitHub. e.g. test/SA_PF.zip', name: 'GIT_SOURCE_ZIP_PATH', trim: true'''font-weight:bold;line-height:1.5em;font-size:1.5em;''')
    		string(defaultValue: '', description: 'ImportGitHub xmlcredentials fileID pathconfigured toin be downloaded from GitHub. Jenkins e.g. test/import.xmlgitCredential_id', name: 'GIT_MIGRATION_XML_FILE_PATHCREDENTIALS_ID', trim: true) 
    		string(defaultValue: '', description: 'RetainGitHub xmlserver file path to be downloaded from GitHub. e.g. test/retain.xmlURL e.g. https://github.com/adeptia/migration-defination.git', name: 'GIT_RETAINREPO_XML_PATHURL', trim: true)
    
    		//separatorstring(namedefaultValue: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeader: '''Migration Parameters'description: 'GitHub Branch name e.g. main', name: 'GIT_BRANCH', trim: true)
    		string(defaultValue: '', sectionHeaderStyle: 'background-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', separatorStyle: '''font-weight:bold;line-height:1.5em;font-size:1.5em;'''description: 'Source zip path to be downloaded from GitHub. e.g. test/SA_PF.zip', name: 'GIT_SOURCE_ZIP_PATH', trim: true)
    		string(defaultValue: '', description: 'LocationRollback zip ofpath retainto xmlupload file to GitHub. e.g. export, import or rollbacktest/Rollback_SA_PF.zip. No need to fill this field in case of performing "rollback" operation', name: 'OPERATIONGIT_ROLLBACK_ZIP_PATH', trim: true)
    		string(defaultValue: '', description: 'MigrationImport sourcexml zipfile path to be downloaded from GitHub. e.g. /shared/test/SA_PFimport.zipxml', name: 'SOURCE_ZIPGIT_MIGRATION_XML_FILE_PATH', trim: true)
    		string(defaultValue: '', description: 'Migration import/retainRetain xml file path to be downloaded from GitHub. e.g. /shared/test/importretain.xml', name: 'MIGRATIONGIT_RETAIN_XML_FILE_PATH', trim: true)
    
    		string//separator(defaultValuename: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', descriptionsectionHeader: 'User Id or User name with which all objects will be deployed e.g IndigoUser:127000000001107055536473900001''Migration Parameters''', namesectionHeaderStyle: 'OVERRIDE_USER', trim: true)
    		string(defaultValue: '', description: 'User Id or User name which will be reflected in the modified by field of every activity after deployment e.g. IndigoUser:127000000001107055536473900001', name: 'OVERRIDE_MODIFIEDBY_USER', trim: truebackground-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', separatorStyle: '''font-weight:bold;line-height:1.5em;font-size:1.5em;''')
    		string(defaultValue: '', description: 'Location of retain xml file. e.g. /shared/migration/import/RETAIN_FILENAME.xmlimport or rollback', name: 'RETAIN_XML_PATHOPERATION', trim: true)
    		string(defaultValue: '', description: 'Migration logsource identifierzip to capture logs in ms environment.path. e.g. /shared/SA_PF.zip', name: 'LOGSOURCE_ZIP_IDENTIFIERPATH', trim: true)
    		
    		//separator(namestring(defaultValue: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeaderdescription: '''K8 Cluster Parameters''', sectionHeaderStyle: 'background-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', separatorStyle: '''font-weight:bold;line-height:1.5em;font-size:1.5em;'''Migration import/retain xml file path. e.g. /shared/import.xml', name: 'MIGRATION_XML_FILE_PATH', trim: true)
    		string(defaultValue: '', description: 'User Id or User name with which all objects will be deployed e.g IndigoUser:127000000001107055536473900001', name: 'OVERRIDE_USER', trim: true)
    		string(defaultValue: '', description: 'CredentialsUser IDId configuredor inUser Jenkinsname towhich accesswill K8 cluster.', name: 'K8_CREDENTIALS_ID', trim: true)
    		string(defaultValue: '', description: 'URL to access K8 cluster.be reflected in the modified by field of every activity after deployment e.g. IndigoUser:127000000001107055536473900001', name: 'SERVEROVERRIDE_MODIFIEDBY_URLUSER', trim: true)
    		string(defaultValue: '', description: 'ClusterLocation of contextretain toxml access K8 cluster.file. e.g. /shared/retain.xml', name: 'CLUSTERRETAIN_XML_CONTEXTPATH', trim: true)
    		string(defaultValue: '', description: 'K8Location clusterof namerollback spacezip deployment where Connect microservices deployed.', name: 'NAMESPACE', trim: true)
    		string(defaultValue: '', description: 'URL of database backend bind with application.file. e.g. /shared/Rollback_SA_PF.zip. No need to fill this field in case of performing "rollback" operation', name: 'BACKENDROLLBACK_DBZIP_URLPATH', trim: true)
    		string(defaultValue: '', description: 'CredentialsMigration log IDidentifier configuredto incapture Jenkinslogs toin accessms databaseenvironment.', name: 'DATABASELOG_CREDENTIALS_IDIDENTIFIER', trim: true)
    		
    		string//separator(defaultValuename: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', descriptionsectionHeader: 'Driver''K8 class of database e.g com.microsoft.sqlserver.jdbc.SQLServerDriver.Cluster Parameters''', namesectionHeaderStyle: 'BACKEND_DB_DRIVER_CLASS', trim: true)
    		string(defaultValuebackground-color:#eeeee4;font-size:15px;font-weight:normal;text-transform:uppercase;border-color:gray;', separatorStyle: '', description: 'Database type e.g SQL-Server.', name: 'BACKEND_DB_TYPE', trim: true)
    		}
    		
        agent {
            label 'LinuxAgent'
        }
    stages {
    
                
    		stage('Init parameters') {
    			steps {
    					script{
    							//Global parameters
    							env.LATEST_TAG='80686a8'
    					}							
    			}
            }
            stage('Checkout files from GitHub') {
                steps {
                    script {				
    					echo 'Checkout xml and zip from github'
    					checkout([$class: 'GitSCM', branches: [[name: '*/'+GIT_BRANCH]], extensions: [], userRemoteConfigs: [[credentialsId: GIT_CREDENTIALS_ID, url: GIT_REPO_URL]]])
            'font-weight:bold;line-height:1.5em;font-size:1.5em;''')
    		string(defaultValue: '', description: 'Credentials ID configured in Jenkins to access K8 cluster.', name: 'K8_CREDENTIALS_ID', trim: true)
    		string(defaultValue: '', description: 'URL to access K8 cluster e.g. https://*******-dns-2ce021bb.hcp.eastus.azmk8s.io:443. You can get the server Url from K8 config file.', name: 'SERVER_URL', trim: true)
    		string(defaultValue: '', description: 'Cluster context to access K8 cluster e.g. adeptia-context', name: 'CLUSTER_CONTEXT', trim: true)
    		string(defaultValue: '', description: 'K8 cluster name space deployment where Connect microservices deployed e.g. adeptia', name: 'NAMESPACE', trim: true)
    		string(defaultValue: '', description: 'URL of database backend bind with application.', name: 'BACKEND_DB_URL', trim: true)
    		string(defaultValue: '', description: 'Credentials ID configured in Jenkins to access database.', name: 'DATABASE_CREDENTIALS_ID', trim: true) 
    		string(defaultValue: '', description: 'Driver class of database e.g com.microsoft.sqlserver.jdbc.SQLServerDriver.', name: 'BACKEND_DB_DRIVER_CLASS', trim: true)
    		string(defaultValue: '', description: 'Database type e.g SQL-Server.', name: 'BACKEND_DB_TYPE', trim: true)
    		}
    	
        /*
    		agent {
            	label   
         'LinuxAgent' 	
              }
    	*/
    	agent any
    	
            }
    stages {
           } 		stage('UploadCheckout files tofrom PVCGitHub') {
                steps {
                    script {					
    					echo 'UploadCheckout import zipxml and xmlzip file to shared PVCfrom github'
    					uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, GIT_SOURCE_ZIP_PATH, SOURCE_ZIP_PATH)
    					uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8checkout([$class: 'GitSCM', branches: [[name: '*/'+GIT_BRANCH]], extensions: [], userRemoteConfigs: [[credentialsId: GIT_CREDENTIALS_ID, SERVER_URL,url: GIT_MIGRATION_XML_FILE_PATH, MIGRATION_XML_FILE_PATH)
    					//Condition to handle retain feature within import
    					if((GIT_RETAIN_XML_PATH.contains(".xml")) && (RETAIN_XML_PATH.contains(".xml"))){
    					uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, GIT_RETAIN_XML_PATH, RETAIN_XML_PATH)
    					}REPO_URL]]])
                        
                    }
                }
            }
    		stage('PullUpload Helmfiles Chart & Deploy Migrationto PVC') {
                steps {
                    script {					script
    {
    						echo 'PullUploading Migrationimport Helmzip Chart'
    						pullHelmChart (NEXUS_CREDENTIALS_ID, NEXUS_HELM_REPO_URL, CHART_NAME)
    
    
    						echo 'Deploy Import'
    and xml file'
    						deployToClusteruploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, DATABASESERVER_CREDENTIALS_IDURL, SERVER_URL)
    						timeout(time: env.time_out, unit: "SECONDS"){GIT_SOURCE_ZIP_PATH, SOURCE_ZIP_PATH)
    						waitUntilDepoymentCompleteuploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, 'migration-', env.time_out.toInteger())GIT_MIGRATION_XML_FILE_PATH, MIGRATION_XML_FILE_PATH)
    						}
    				}
                }
            }
    		stage('Download Rollback zip') {
                when {//Condition to handle retain feature within import
    					if((GIT_RETAIN_XML_PATH.contains(".xml")) && (RETAIN_XML_PATH.contains(".xml"))){
    					uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, GIT_RETAIN_XML_PATH, RETAIN_XML_PATH)
    					}
                    }
            expression { params.OPERATION == 'import' }
    
               }
    		stage('Pull Helm Chart &         stepsDeploy Migration') {
                steps    {
    				script {
    						echo 'Pulling Helm                  echo 'Download Rollback zip file to shared PVCChart'
    						pullHelmChart (HELM_REPO_URL, CHART_NAME)
    
    
    						echo 'Deploying Helm Chart'
    					downloadFromSharedPVC	deployToCluster (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVERDATABASE_CREDENTIALS_URLID, convertRollbackZipPath(SOURCE_ZIP_PATH), convertRollbackZipPath(GIT_SOURCE_ZIP_PATH))                  
                    SERVER_URL)
    						timeout(time: env.time_out, unit: "SECONDS"){
    						waitUntilDepoymentComplete(NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, 'migration-', env.time_out.toInteger())
    						}
    				}
                }
            }
    		stage('PushDownload Rollback Zipzip') {
                when {
                        expression { params.OPERATION == 'import' }
                }
                steps {
                    script {
    					
                        echo 'PushDownload Rollback Zipzip file to shared GitHubPVC'
    					pushToGitHubdownloadFromSharedPVC (GIT_BRANCHNAMESPACE, CLUSTER_CONTEXT, GITK8_CREDENTIALS_ID, SERVER_URL, GITROLLBACK_REPOZIP_URLPATH, convertRollbackZipPath(GIT_SOURCEROLLBACK_ZIP_PATH))
                        
                    }
                }
            }
    		
    	}
    	post('Clean-up'stage('Push Rollback Zip') {
    			always { 				echo 'Cleanup workspace' 				cleanWs() 			} 			success { 				echo 'Pipeline succeeded!' 			}
    			unstable when {
    				echo 'Pipeline unstable :/'
    			}
    			failure                    expression { params.OPERATION == 'import' }
                }
                steps {
                    script {
    					echo 'Pipeline failed :(Push Rollback Zip to GitHub'
    			}
    		}
    }
  6. Paste the copied content in the Pipeline Definition section in Jenkins.
  7. Uncheck the Use Groovy Sandbox checkbox.
  8. Click Save.
  9. On the screen that follows, click Build Now.
    As you build the pipeline for the very first time, all the parameters get initialized. The Build Now option now changes to Build with Parameters.

  10. Click Build with Parameters.

    You will see all the parameters and their values inherited from the import pipeline file. 

  11. Change the parameter values as per your requirement.

    NEXUS_
    Expand
    titleClick here to expand the list of Import parameters
    ParametersValueDescription

    Nexus

    NEXUS_CREDENTIALS_ID

    <credential ID generated by Jenkins>

    Credential ID for Nexus (helm repository) in Jenkins.

    Refer to the prerequisites for more details.

    pushToGitHub (GIT_BRANCH, GIT_CREDENTIALS_ID, GIT_REPO_URL, GIT_ROLLBACK_ZIP_PATH)
                        
                    }
                }
            }
    		
    	}
    	post('Clean-up') {
    			always {
    				echo 'Cleanup workspace'
    				cleanWs()
    			}
    			success {
    				echo 'Pipeline succeeded!'
    			}
    			unstable {
    				echo 'Pipeline unstable :/'
    			}
    			failure {
    				echo 'Pipeline failed :('
    			}
    		}
    }



  12. In the Pipeline Definition section, paste the copied content and uncheck the Use Groovy Sandbox checkbox. 

    Image Added


    Warning
    titleImportant

    If you are using Jenkins on Windows OS, and have created an agent on Linux OS, you need to do the followings in the export pipeline file.

    1. Uncomment the following code snippet.

    Code Block
    languagecss
    themeMidnight
    /*
    		agent {
            	label 'LinuxAgent' 	
        }
    	*/

    Where,

    LinuxAgent is the name of the agent that you have created.

    2. Comment the following lines of code.

    Code Block
    languagecss
    themeMidnight
    agent any



  13. Click Save.
  14. On the screen that follows, click Build Now.
    As you build the pipeline for the very first time, all the parameters get initialized. 

  15. Refresh the page.
    The Build Now option now changes to Build with Parameters.

  16. Click Build with Parameters.

    You will see all the parameters inherited from the import pipeline file. 

  17. Enter the parameter values as per your requirement.

    Info
    It is mandatory to provide a valid value for all the Jenkins parameters.


    Expand
    titleClick here to expand the list of Import parameters


    ParametersValueDescription

    Helm Chart



    HELM_REPO_URLhttps://adeptia.github.io/adeptia-connect-migration/chartsMigration Helm chart repository URL.
    CHART_NAMEmigrationMigration Helm chart name.
    GitHub

    GIT_CREDENTIALS_ID

    <credential ID generated by Jenkins>

    Credential ID for GitHub in Jenkins.

    Refer to the prerequisites for more details.

    GIT_REPO_URLhttps://github.com/adeptia/migration-defination.gitURL of the GitHub repository.
    GIT_BRANCHmainGitHub branch name.
    GIT_SOURCE_ZIP_PATH
    test/SA_PF.zipPath of the exported ZIP in the GitHub repository.
    GIT_MIGRATION_XML_FILE_PATHtest/import.xmlPath of the import.xml file in the GitHub repository.
    GIT_RETAIN_XML_PATHxml/retain.xmlPath of the retain XML file in the GitHub repository.
    GIT_ROLLBACK_ZIP_PATHtest/Rollback_SA_PF.zip

    Path in the GitHub repository where you want to upload the rollback zip.

    Warning
    titleImportant
    Though this parameter is also visible while performing the rollback operation, you are not required to provide a value for this parameter.


    Migration

    OPERATIONexportThe type of operation for which deployment will be performed.
    SOURCE_ZIP_PATH/shared/migrationtest1/SA_PF.zipPath of the exported ZIP in the PVC.
    ROLLBACK_ZIP_PATH/shared/Rollback_SA_PF.zip

    Path in the PVC where you want to keep the rollback zip.

    Warning
    titleImportant
    Though this parameter is also visible while performing the rollback operation, you are not required to provide a value for this parameter.


    MIGRATION_XML_FILE_PATH/shared/migrationtest1/import.xmlPath of the import.xml file in the PVC.
    OVERRIDE_USERIndigoUser:127000000001107055536473900001User Id or user name of an IT user with which all objects will be deployed.
    OVERRIDE_MODIFIEDBY_USERIndigoUser:127000000001107055536473900001User Id or user name which will be reflected in the modified by field of every activity after the deployment.
    RETAIN_XML_PATH/shared/migrationtest1/retain.xmlPath of the retain XML file in the PVC.
    LOG_IDENTIFIERTest_Identifier_TagLog identifier to capture logs from MS environment.
    Kubernetes Cluster

    K8_CREDENTIALS_ID<credential ID generated by Jenkins>

    Credential ID for Kubernetes in Jenkins.

    Refer to the prerequisites for more details.


    SERVER_URLhttps://<host name of the Kubernetes cluster>:<Port number>URL of the Kubernetes cluster.
    CLUSTER_CONTEXTtest-devKubernetes cluster context.
    NAMESPACEnamespaceKubernetes cluster namespace for deployment.
    Database

    BACKEND_DB_URLjdbc:sqlserver://<DB Hostname>:<Port number>;database=<Backend Database Name>Backend database URL used in the deployment of migration Helm chart. Database info configured in value.yaml file.
    DATABASE_CREDENTIALS_ID<credential ID generated by Jenkins>

    Credential ID for database in Jenkins.

    Refer to the prerequisites for more details.

    BACKEND_DB_DRIVER_CLASScom.microsoft.sqlserver.jdbc.SQLServerDriverBackend database driver class used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    BACKEND_DB_TYPESQL-ServerBackend database type used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    Parameters used in rollback operation

    Helm Chart



    HELM_REPO_URLhttps://nexusadeptia.adeptia.com:8443/repositorygithub.io/adeptia-internalconnect-helmURL of the Nexus migration/chartsMigration Helm chart repository URL.
    CHART_NAMEmigrationName of the Migration Helm chart name.
    GitHub

    GIT_CREDENTIALS_ID

    <credential ID generated by Jenkins>

    Credential ID for GitHub in Jenkins.

    Refer to the prerequisites for more details.

    GIT_REPO_URLhttps://github.com/prathi-adeptia/migration-defination.gitURL of the GitHub repository.
    GIT_BRANCHmainGitHub branch name.
    GIT_SOURCE_ZIP_PATH
    test/SA_PF.zipPath of the exported ZIP in the GitHub repository.
    GIT_MIGRATION_XML_FILE_PATHtest/import.xmlPath of the import.xml file in the GitHub repository.
    GIT_RETAIN_XML_PATHxml/retain.xmlPath of the retain XML file in the GitHub repository.
    Migration
    OPERATIONexportThe type of operation for which deployment will be performed.
    GitHub branch name.
    GIT_SOURCE_ZIP_PATH
    /shared/migrationtest1/test/Rolllback_SA_PF.zipPath of Location of the exported rollback ZIP in the PVCGitHub repository.
    GIT_MIGRATION_XML_FILE_PATHtest/shared/migrationtest1/import.xmlPath Location of the import.xml file in the PVCGitHub repository.
    Migration
    OVERRIDE_USERIndigoUser:127000000001107055536473900001User Id or user name with which all objects will be deployed.
    OVERRIDE_MODIFIEDBY_USERIndigoUser:127000000001107055536473900001User Id or user name which will be reflected in the modified by field of every activity after the deployment.


    RETAIN_XML_OPERATIONrollbackThe type of operation for which deployment will be performed.
    SOURCE_ZIP_PATH/shared/migrationtest1/Rolllback_SA_PF.zipPath of the rollback ZIP in the PVC.
    MIGRATION_XML_FILE_PATH/shared/migrationtest1/retainimport.xmlPath of the retain XML import.xml file in the PVC.
    LOG_IDENTIFIERTest_Identifier_TagLog identifier to capture logs from MS environment.
    Kubernetes Cluster

    K8_CREDENTIALS_ID<credential ID generated by Jenkins>

    Credential ID for Kubernetes in Jenkins.

    Refer to the prerequisites for more details.


    SERVER_URLhttps://<host name of the Kubernetes cluster>:<Port number>URL of the Kubernetes cluster.
    CLUSTER_CONTEXTtest-devKubernetes cluster context.
    NAMESPACEnamespaceKubernetes cluster namespace for deployment.
    Database

    BACKEND_DB_URLjdbc:sqlserver://<DB Hostname>:<Port number>;database=<Backend Database Name>Backend database URL used in the deployment of migration Helm chart. Database info configured in value.yaml file.
    DATABASE_CREDENTIALS_ID<credential ID generated by Jenkins>

    Credential ID for database in Jenkins.

    Refer to the prerequisites for more details.

    BACKEND_DB_DRIVER_CLASScom.microsoft.sqlserver.jdbc.SQLServerDriverBackend database driver class used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    BACKEND_DB_TYPEBackend database driver class used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    BACKEND_DB_TYPESQL-ServerBackend database type used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    Parameters used in rollback operation

    Nexus

    NEXUS_CREDENTIALS_ID

    <credential ID generated by Jenkins>

    Credential ID for Nexus (helm repository) in Jenkins.

    Refer to the prerequisites for more details.

    NEXUS_SQL-ServerBackend database type used in the deployment of migration Helm chart. Database info configured in values.yaml file.



  18. Click Build to trigger the pipeline.

    Info
    • The objects are imported to the target environment.

    • The rollback ZIP is created and pushed to the GitHub repository. 

    • All the log statements generated by the migration utility during the import process are tagged with a unique identifier. This allows you to search for this unique identifier in the centralized logging system, and fetch all the associated logs.


Rolling back the import operation

If you decide upon rolling back the import operation, use the rollback ZIP created during the import operation.

Here are the steps to perform the rollback operation.

  1. Log in to Jenkins.
  2. Click Build with Parameters.

  3. Enter the values for the following parameters.

    Info
    It is mandatory to provide a valid value for all the Jenkins parameters, except for GIT_ROLLBACK_ZIP_PATH and ROLLBACK_ZIP_PATH.


  4. Log in to Jenkins.
  5. Click Build with Parameters.
  6. Change the values for the following two parameters, and keep the rest of the values as is.
  7. Enter rollback as the value for the OPERATION parameter.
  8. Enter the path of the rollback ZIP in GitHub as the value for GIT_SOURCE_ZIP_PATH parameter. This path will be used for pulling the rollback ZIP from GitHub.

  9. Enter the path of the rollback ZIP in PVC as the value for SOURCE_ZIP_PATH parameter

    InfoThe rollback ZIP is created at the location where your Exported ZIP is located. 
    The format of rollback ZIP file name is Recovery_<EXPORT_ZIP_NAME>.zip.Click
    Expand
    titleClick here to expand the list of rollback parameters


    Credential ID for Kubernetes in Jenkins.

    Refer to the prerequisites for more details.

    Helm Chart



    HELM_REPO_URLhttps://nexusadeptia.adeptiagithub.com:8443io/repository/adeptia-internalconnect-helmURL of the Nexus migration/chartsMigration Helm chart repository URL.
    CHART_NAMEmigrationName of the Migration Helm chart.
    GitHub

    GIT_CREDENTIALS_ID

    <credential ID generated by Jenkins>

    Credential ID for GitHub in Jenkins.

    Refer to the prerequisites for more details.

    GIT_REPO_URLhttps://github.com/prathi-adeptia/migration-defination.gitURL of the GitHub repository.
    GIT_BRANCHmainGitHub branch name.
    GIT_SOURCE_ZIP_PATH
    test/Rolllback_SA_PF.zip

    Location of the rollback ZIP in GitHub repository.

    GIT_MIGRATION_XML_FILE_PATHtest/import.xmlLocation of the import.xml file in GitHub repository.Migration
    OPERATIONrollbackThe type of operation for which deployment will be performed.
    SOURCE_ZIP_PATH/shared/migrationtest1/Rolllback_SA_PF.zipPath of the rollback ZIP in the PVC.
    MIGRATION_XML_FILE_PATH/shared/migrationtest1/import.xmlPath of the import.xml file in the PVC.
    LOG_IDENTIFIERTest_Identifier_TagLog identifier to capture logs from MS environment.
    Kubernetes ClusterK8_CREDENTIALS_ID<credential ID generated by Jenkins>
    SERVER_URLhttps://<host name of the Kubernetes cluster>:<Port number>URL of the Kubernetes cluster.
    CLUSTER_CONTEXTtest-devKubernetes cluster context.
    NAMESPACEnamespaceKubernetes cluster namespace for deployment.
    Database
    BACKEND_DB_URLjdbc:sqlserver://<DB Hostname>:<Port number>;database=<Backend Database Name>Backend database URL used in the deployment of migration Helm chart. Database info configured in value.yaml file.
    DATABASE.
    Migration

    OPERATIONrollbackThe type of operation for which deployment will be performed.
    SOURCE_ZIP_PATH/shared/migrationtest1/Rolllback_SA_PF.zip

    Path of the rollback ZIP in the PVC.

    Info
    The rollback ZIP is created at the location where your Exported ZIP is located. 
    The format of rollback ZIP file name is Recovery_<EXPORT_ZIP_NAME>.zip.


    MIGRATION_XML_FILE_PATH/shared/migrationtest1/import.xmlPath of the import.xml file in the PVC.
    LOG_IDENTIFIERTest_Identifier_TagLog identifier to capture logs from MS environment.
    Kubernetes Cluster

    K8_CREDENTIALS_ID<credential ID generated by Jenkins>

    Credential ID for database Kubernetes in Jenkins.

    Refer to the prerequisites for more details.

    BACKEND_DB_DRIVER_CLASScom.microsoft.sqlserver.jdbc.SQLServerDriverBackend database driver class used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    BACKEND_DB_TYPESQL-ServerBackend database type used in the deployment of migration Helm chart. Database info configured in values.yaml file.

    Click Build to trigger the pipeline.

    Info
    • The objects are imported to the target environment.

    • The rollback ZIP is created and pushed to the GitHub repository. 

    • All the log statements generated by the migration utility during the import process are tagged with a unique identifier. This allows you to search for this unique identifier in the centralized logging system, and fetch all the associated logs.

Rolling back the import operation

If you decide upon rolling back the import operation, follow the instructions given below.


  1. SERVER_URLhttps://<host name of the Kubernetes cluster>:<Port number>URL of the Kubernetes cluster.
    CLUSTER_CONTEXTtest-devKubernetes cluster context.
    NAMESPACEnamespaceKubernetes cluster namespace for deployment.
    Database

    BACKEND_DB_URLjdbc:sqlserver://<DB Hostname>:<Port number>;database=<Backend Database Name>Backend database URL used in the deployment of migration Helm chart. Database info configured in value.yaml file.
    DATABASE_CREDENTIALS_ID<credential ID generated by Jenkins>

    Credential ID for database in Jenkins.

    Refer to the prerequisites for more details.

    BACKEND_DB_DRIVER_CLASScom.microsoft.sqlserver.jdbc.SQLServerDriverBackend database driver class used in the deployment of migration Helm chart. Database info configured in values.yaml file.
    BACKEND_DB_TYPESQL-ServerBackend database type used in the deployment of migration Helm chart. Database info configured in values.yaml file.



  2. Click Build to roll back the import operation.

    Info
    RetainXmlLocation, OverRideuser, and OverrideModifiedByuser parameters are not applicable in case of rollback.