- Created by Ashhad Alam , last modified on Dec 24, 2021
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 11 Next »
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.
How the Import pipeline works
The diagram below represents how the import pipeline works, and automates the import process.
When triggered, the pipeline performs the following sequence of actions.
- Connects to the GitHub repository, pulls the Import XML and Exported ZIP files, and places them to a location in the PVC (shared folder).
- Pulls the retain XML from the GitHub repository (if specified in the import pipeline) to retain certain activities during the import process.
- Pulls and deploys the migration utility helm chart to import the objects.
- Creates a rollback ZIP file at the shared repository file location, and pushes it to the GitHub repository.
- Deletes the migration workspace created during the import process.
To start with importing the objects, you first need to create an import pipeline having all the required parameters for exporting the objects. Adeptia provides you with a sample of import pipeline file that you can customize based on your requirement. After you create the pipeline, you need to trigger the pipeline to perform the import operation.
Creating and triggering the import pipeline
To create the pipeline in Jenkins using the import pipeline provided by Adeptia, follow the steps given below.
Log in to the Jenkins with admin privileges.
Select New Item.
Enter a name for the Import pipeline, and then select Pipeline.
Click OK.
Copy the content from the provided import pipeline file.
Import pipelineimport 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) 4. Mask Password 5. Credentials Binding Plugin (1.27) 6. Parameter Separator 7. 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+") to K8 shared PVC" withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) { try { wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[NEXUS_PASSWORD:'NEXUS_PASSWORD']]]) { sh ''' #!/bin/sh 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+") from K8 shared PVC" withKubeConfig([credentialsId: K8_CREDENTIALS_ID, serverUrl: SERVER_URL]) { try { sh ''' #!/bin/sh 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 Nexus repository" withCredentials([usernamePassword(credentialsId: NEXUS_CREDENTIALS_ID, passwordVariable: 'NEXUS_PASSWORD', usernameVariable: 'NEXUS_USERNAME')]) { try { //hide password field wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[NEXUS_PASSWORD:'NEXUS_PASSWORD']]]) { sh ''' #!/bin/sh helm repo add nexushelmrepo '''+NEXUS_HELM_REPO_URL+''' --username '''+NEXUS_USERNAME+''' --password '''+NEXUS_PASSWORD+''' helm pull nexushelmrepo/'''+CHART_NAME+''' --untar ''' } } catch (err) { echo "Caught: ${err}. Error in pulling Helm chart from Nexus repo." error("Caught: ${err}") currentBuild.result = 'FAILURE' } } } /* 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 { def BACKEND_DB_USERNAME = getUserName(DATABASE_CREDENTIALS_ID); def 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.yaml --set environmentVariables.BACKEND_DB_URL=${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.SOURCE_ZIP_PATH=${SOURCE_ZIP_PATH} --set environmentVariables.MIGRATION_XML_FILE_PATH=${MIGRATION_XML_FILE_PATH} --set environmentVariables.OVERRIDE_USER=${OVERRIDE_USER} --set environmentVariables.OVERRIDE_MODIFIEDBY_USER=${OVERRIDE_MODIFIEDBY_USER} --set environmentVariables.RETAIN_XML_PATH=${RETAIN_XML_PATH} --set environmentVariables.LOG_IDENTIFIER=${LOG_IDENTIFIER} --set environmentVariables.OPERATION=${OPERATION} --set image.tag=${LATEST_TAG} -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 the 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; } 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; } } } } catch (err) { echo "Caught: ${err}. Error in fetching pod status." error("Caught: ${err}") currentBuild.result = 'FAILURE' } } /* Push soution Zip to GitHub reposirory */ def pushToGitHub (GIT_BRANCH, GIT_CREDENTIALS_ID, GIT_REPO_URL, FILE_PATH) { 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) 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 Github." error("Caught: ${err}") currentBuild.result = 'FAILURE' } } } /* Generate rollback soution Zip file path */ def convertRollbackZipPath(FILE_PATH) { def rollbackZipPath = null def Append = "Rollback_" try { Path path = Paths.get(FILE_PATH); def fileName=path.getFileName().toString() def parentDir=path.getParent().toString() rollbackZipPath=parentDir + File.separator + Append + fileName if(isUnix()){ rollbackZipPath=rollbackZipPath.replace("\\", "/") } } catch (err) { echo "Caught: ${err}. Error in generating rollback soution Zip file path." error("Caught: ${err}") currentBuild.result = 'FAILURE' } return rollbackZipPath } /* Get username from credentials id */ def getUserName(id) { def userName = null withCredentials([usernamePassword(credentialsId: id, passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) { try { userName = USERNAME } catch (err) { echo "Caught: ${err}. Error in extracting username from "+id+" ." error("Caught: ${err}") currentBuild.result = 'FAILURE' } } return userName } /* 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 { 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: 'nexus_credentialsId', description: 'Nexus credentials ID configured in Jenkins', name: 'NEXUS_CREDENTIALS_ID', trim: true) string(defaultValue: 'https://nexus.adeptia.com:8443/repository/adeptia-internal-helm', description: 'Nexus Server URL', name: 'NEXUS_HELM_REPO_URL', trim: true) string(defaultValue: 'migration', description: 'Name of Helm chart to be downloaded from Nexus repository', name: 'CHART_NAME', trim: true) //separator(name: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeader: '''GitHub 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: 'gitCredential_prathi-adeptia', description: 'GitHub credentials ID configured in Jenkins', name: 'GIT_CREDENTIALS_ID', trim: true) string(defaultValue: 'https://github.com/prathi-adeptia/migration-defination.git', description: 'GitHub server URL', name: 'GIT_REPO_URL', trim: true) string(defaultValue: 'main', description: 'GitHub Branch name', name: 'GIT_BRANCH', trim: true) string(defaultValue: 'test/SA_PF_23.zip', description: 'Source zip path to be downloaded from GitHub. eg. test/SA_PF.zip', name: 'GIT_IMPORT_ZIP_PATH', trim: true) string(defaultValue: 'import.xml', description: 'Import xml file path to be downloaded from GitHub. eg. test/import.xml', name: 'GIT_IMPORT_XML_PATH', trim: true) string(defaultValue: '', description: 'Retain xml file path to be downloaded from GitHub. eg. test/retain.xml', name: 'GIT_RETAIN_XML_PATH', trim: true) //separator(name: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeader: '''Migration 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: 'import', description: 'Location of retain xml file. eg. import or rollback', name: 'OPERATION', trim: true) string(defaultValue: '/shared/migrationtest1/SA_PF_23.zip', description: 'Migration source zip path. eg. /shared/test/SA_PF.zip', name: 'SOURCE_ZIP_PATH', trim: true) string(defaultValue: '/shared/migrationtest1/import.xml', description: 'Migration import/retain xml file path. eg. /shared/test/import.xml', name: 'MIGRATION_XML_FILE_PATH', trim: true) string(defaultValue: 'IndigoUser:127000000001107055536473900001', description: 'Location of retain xml file. eg. $SHARED_PATH$/migration/import/RETAIN_FILENAME.xml', name: 'OVERRIDE_USER', trim: true) string(defaultValue: 'IndigoUser:127000000001107055536473900001', description: 'Migration log identifier to capture logs in ms environment.', name: 'OVERRIDE_MODIFIEDBY_USER', trim: true) string(defaultValue: '', description: 'Location of retain xml file. eg. $SHARED_PATH$/migration/import/RETAIN_FILENAME.xml', name: 'RETAIN_XML_PATH', trim: true) string(defaultValue: '', description: 'Migration log identifier to capture logs in ms environment.', name: 'LOG_IDENTIFIER', trim: true) //separator(name: 'separator-ce1a9ef5-cd10-4002-a43f-8ae24d9d0bb3', sectionHeader: '''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;''') string(defaultValue: 'k8credentials', description: 'Credentials ID configured in Jenkins to access K8 cluster.', name: 'K8_CREDENTIALS_ID', trim: true) string(defaultValue: 'https://valuelabs-dev-dns-2ce021bb.hcp.eastus.azmk8s.io:443', description: 'URL to access K8 cluster.', name: 'SERVER_URL', trim: true) string(defaultValue: 'valuelabs-dev', description: 'Cluster context to access K8 cluster.', name: 'CLUSTER_CONTEXT', trim: true) string(defaultValue: 'anubhav', description: 'K8 cluster name space deployment where Connect microservices deployed.', name: 'NAMESPACE', trim: true) string(defaultValue: 'jdbc:sqlserver://adeptia-adeptiaconnectdb.database.windows.net:1433;database=valuelabs-backend-8', description: 'URL of database backend bind with application.', name: 'BACKEND_DB_URL', trim: true) string(defaultValue: 'databasecredentialid', description: 'Credentials ID configured in Jenkins to access database.', name: 'DATABASE_CREDENTIALS_ID', trim: true) string(defaultValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', description: 'Driver class of database.', name: 'BACKEND_DB_DRIVER_CLASS', trim: true) string(defaultValue: 'SQL-Server', description: 'Database type.', name: 'BACKEND_DB_TYPE', trim: true) } agent { label 'LinuxAgent' } stages { stage('Init parameters') { steps { script{ //Global parameters //Nexus repository parameters // env.NEXUS_CREDENTIALS_ID='nexus_credentialsId' // env.NEXUS_HELM_REPO_URL='https://nexus.adeptia.com:8443/repository/adeptia-internal-helm/' //env.CHART_NAME='migration' //Git parameters // env.GIT_CREDENTIALS_ID='gitCredential_prathi-adeptia' //env.GIT_REPO_URL='https://github.com/prathi-adeptia/migration-defination.git' // env.GIT_BRANCH='main' // env.GIT_IMPORT_ZIP_PATH='test/Rollback_SA_PF_23.zip' // env.GIT_IMPORT_XML_PATH='import.xml' //Migration // env.OPERATION='rollback' // env.SOURCE_ZIP_PATH='/shared/migrationtest1/Rollback_SA_PF_23.zip' // env.MIGRATION_XML_FILE_PATH='/shared/migrationtest1/import.xml' // env.OVERRIDE_USER='IndigoUser:127000000001107055536473900001' // env.OVERRIDE_MODIFIEDBY_USER='IndigoUser:127000000001107055536473900001' // env.RETAIN_XML_PATH='' // env.LOG_IDENTIFIER='' //K8 cluster parameters // env.K8_CREDENTIALS_ID='k8credentials' // env.SERVER_URL='https://valuelabs-dev-dns-2ce021bb.hcp.eastus.azmk8s.io:443' // env.CLUSTER_CONTEXT='valuelabs-dev' // env.NAMESPACE='anubhav' //Database // env.BACKEND_DB_URL='jdbc:sqlserver://adeptia-adeptiaconnectdb.database.windows.net:1433;database=valuelabs-backend-8' //env.BACKEND_DB_USERNAME='valuelab' //env.BACKEND_DB_PASSWORD='Valu3l@bs@123456' //env.DATABASE_CREDENTIALS_ID='databasecredentialid' // env.BACKEND_DB_DRIVER_CLASS='com.microsoft.sqlserver.jdbc.SQLServerDriver' // env.BACKEND_DB_TYPE='SQL-Server' //Other //env.operation='import' //env.SourceZipLoc='$SHARED_PATH$/migrationtest1/SA_PF.zip' //env.RetainXmlLocation ='$SHARED_PATH$/migrationtest1/RETAIN.xml' //env.OverrideUser ='IndigoUser:127000000001107055536473900001' //env.OverrideModifiedByUser ='IndigoUser:127000000001107055536473900001' //Other 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]]]) } } } stage('Upload files to PVC') { steps { script { echo 'Upload import zip and xml file to shared PVC' uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, GIT_IMPORT_ZIP_PATH, SOURCE_ZIP_PATH) uploadToSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, GIT_IMPORT_XML_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) } } } } stage('Pull Helm Chart & Deploy Migration') { steps { script { echo 'Pull Migration Helm Chart' pullHelmChart (NEXUS_CREDENTIALS_ID, NEXUS_HELM_REPO_URL, CHART_NAME) echo 'Deploy Import' deployToCluster (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, DATABASE_CREDENTIALS_ID, SERVER_URL) timeout(time: env.time_out, unit: "SECONDS"){ waitUntilDepoymentComplete(NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, 'migration-', env.time_out.toInteger()) } } } } stage('Download Rollback zip') { when { expression { params.OPERATION == 'import' } } steps { script { echo 'Download Rollback zip file to shared PVC' downloadFromSharedPVC (NAMESPACE, CLUSTER_CONTEXT, K8_CREDENTIALS_ID, SERVER_URL, convertRollbackZipPath(SOURCE_ZIP_PATH), convertRollbackZipPath(GIT_IMPORT_ZIP_PATH)) } } } stage('Push Rollback Zip') { when { expression { params.OPERATION == 'import' } } steps { script { echo 'Push Rollback Zip to GitHub' pushToGitHub (GIT_BRANCH, GIT_CREDENTIALS_ID, GIT_REPO_URL, convertRollbackZipPath(GIT_IMPORT_ZIP_PATH)) } } } } post('Clean-up') { always { echo 'Cleanup workspace' cleanWs() } success { echo 'Pipeline succeeded!' } unstable { echo 'Pipeline unstable :/' } failure { echo 'Pipeline failed :(' } } }
- Paste the copied content in the Pipeline Definition section in Jenkins.
- Uncheck the Use Groovy Sandbox checkbox.
- Click Save.
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.Click Build with Parameters.
You will see all the parameters and their values inherited from the import pipeline file.
Change the parameter values as per your requirement.
Click here to expand the list of Import parametersParameters Value Description Comments Parameters used in Export Pipeline ____________________________________________________________ //Nexus
NEXUS_CREDENTIALS_ID nexus_credentialsId Store Github access credentials in Jenkins. Select credential type "Username and password" and create global credentials in Jenkins. Example:
user: valuelabs
Pass: password
Note: Use credentials binding plugin to store credentials in Jenkins. Select credential type "Username and password" and save it. A Credentials ID can be added or configures in Jenkins. Using credential ID, the credentials can be accessible globally in Jenkins.
For Ref:https://www.jenkins.io/doc/book/using/using-credentials/ NEXUS_HELM_REPO_URL https://nexus.adeptia.com:8443/repository/adeptia-internal-helm Nexus Helm chart repository URL CHART_NAME migration Helm chart name. //GitHub GIT_CREDENTIALS_ID gitCredential_id Store GitHub access credentials in Jenkins. Select credential type "Username and password" and create global credentials in Jenkins.
For Ref:https://www.jenkins.io/doc/book/using/using-credentials/ GIT_REPO_URL https://github.com/prathi-adeptia/migration-defination.git GitHub repository URL. GIT_BRANCH main GitHub branch name. GIT_EXPORT_ZIP_PATH xml/export.xml Location to pull the export.xml file from GitHub repository. GIT_EXPORT_XML_PATH test/SA_PF.zip Location to commit and push export zip to GitHub repository. //Migration OPERATION export Specify the type of operation for which deployment will be performed. EXPORT_ZIP_PATH
/shared/migrationtest1/export.xml Export.xml path to upload file on shared PVC (K8 cluster) MIGRATION_XML_FILE_PATH /shared/migrationtest1/SA_PF.zip Export zip path to download file from shared PVC (K8 cluster) LOG_IDENTIFIER Test_Identifier_Tag Log identifier to capture logs from MS environment. //K8 Cluster K8_CREDENTIALS_ID k8credentials Store K8 cluster access credentials in Jenkins. Select credential type "Secret file" and create global credentials in Jenkins. Example:
user: valuelabs
Pass: Secret file (Here secret file is k8 .config file)
For Ref:https://www.jenkins.io/doc/book/using/using-credentials/ SERVER_URL https://valuelabs-dev-dns-2ce021bb.hcp.eastus.azmk8s.io:443 Kubernetes cluster URL CLUSTER_CONTEXT test-dev Kubernetes cluster context NAMESPACE namespace Kubernetes cluster namespace for deployment. //Database BACKEND_DB_URL jdbc:sqlserver://adeptia-adeptiaconnectdb.database.windows.net:1433;database=valuelabs-backend-8 Backend database URL used in the deployment of migration Helm chart. Database info configured in value.yaml file. DATABASE_CREDENTIALS_ID databasecredentialid Store database access credentials in Jenkins. Select credential type "Username and password" and create global credentials in Jenkins. BACKEND_DB_DRIVER_CLASS com.microsoft.sqlserver.jdbc.SQLServerDriver Backend database driver class used in the deployment of migration Helm chart. Database info configured in value.yaml file. BACKEND_DB_TYPE SQL-Server Backend database database type used in the deployment of migration Helm chart. Database info configured in value.yaml file. //Parameters used in Import pipeline //Nexus
NEXUS_CREDENTIALS_ID nexus_credentialsId Store Github access credentials in Jenkins. Select credential type "Username and password" and create global credentials in Jenkins. Example:
user: valuelabs
Pass: password
Note: Use credentials binding plugin to store credentials in Jenkins. Select credential type "Username and password" and save it. A Credentials ID can be added or configures in Jenkins. Using credential ID, the credentials can be accessible globally in Jenkins.
For Ref:https://www.jenkins.io/doc/book/using/using-credentials/ NEXUS_HELM_REPO_URL https://nexus.adeptia.com:8443/repository/adeptia-internal-helm Nexus Helm chart repository URL CHART_NAME migration Helm chart name. //GitHub GIT_CREDENTIALS_ID gitCredential_id Store GitHub access credentials in Jenkins. Select credential type "Username and password" and create global credentials in Jenkins.
For Ref:https://www.jenkins.io/doc/book/using/using-credentials/ GIT_REPO_URL https://github.com/prathi-adeptia/migration-defination.git GitHub repository URL. GIT_BRANCH main GitHub branch name. GIT_IMPORT_ZIP_PATH test/import.xml Location to pull the import.xml file from GitHub repository. GIT_IMPORT_XML_PATH test/SA_PF.zip Location to pull import zip to GitHub repository. GIT_RETAIN_XML_PATH xml/retain.xml Retain xml file path to be downloaded from GitHub. //Migration OPERATION import Location of retain xml file. eg. import or rollback. SOURCE_ZIP_PATH /shared/migrationtest1/import.xml Export.xml path to upload file on shared PVC (K8 cluster) MIGRATION_XML_FILE_PATH /shared/migrationtest1/SA_PF.zip Export zip path to upload file on shared PVC (K8 cluster) OVERRIDE_USER IndigoUser:127000000001107055536473900001 User Id or User name with which all objects will be deployed OVERRIDE_MODIFIEDBY_USER IndigoUser:127000000001107055536473900001 User Id or User name which will be reflected in the modified by field of every activity after deployment RETAIN_XML_PATH /shared/migrationtest1/retain.xml Location of retain xml file. eg. $SHARED_PATH$/migration/import/RETAIN_FILENAME.xml' LOG_IDENTIFIER Test_Identifier_Tag Log identifier to capture logs from MS environment. //K8 Cluster K8_CREDENTIALS_ID k8credentials Store K8 cluster access credentials in Jenkins. Select credential type "Secret file" and create global credentials in Jenkins. Example:
user: valuelabs
Pass: Secret file (Here secret file is k8 .config file)
For Ref:https://www.jenkins.io/doc/book/using/using-credentials/ SERVER_URL https://valuelabs-dev-dns-2ce021bb.hcp.eastus.azmk8s.io:443 Kubernetes cluster URL CLUSTER_CONTEXT test-dev Kubernetes cluster context NAMESPACE namespace Kubernetes cluster namespace for deployment. //Database BACKEND_DB_URL jdbc:sqlserver://adeptia-adeptiaconnectdb.database.windows.net:1433;database=valuelabs-backend-8 Backend database URL used in the deployment of migration Helm chart. Database info configured in value.yaml file. DATABASE_CREDENTIALS_ID databasecredentialid Store database access credentials in Jenkins. Select credential type "Username and password" and create global credentials in Jenkins. BACKEND_DB_DRIVER_CLASS com.microsoft.sqlserver.jdbc.SQLServerDriver Backend database driver class used in the deployment of migration Helm chart. Database info configured in value.yaml file. BACKEND_DB_TYPE SQL-Server Backend database database type used in the deployment of migration Helm chart. Database info configured in value.yaml file. Click Build to trigger the pipeline.
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.
- Follow the steps from 1 through 10 given in the previous section.
- Enter the same values for the parameters that were used during the import process.
- Change the values for the following two parameters, and keep the rest of the values as is.
- Enter rollback as the value for the OPERATION parameter.
Enter the path of the rollback ZIP as the value for the SOURCE_ZIP_PATH
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.
- Click Build to roll back the import operation.
- Enter rollback as the value for the OPERATION parameter.
Enter the path of the rollback ZIP as the value for the SOURCE_ZIP_PATH
You can find the rollback ZIP where your Exported ZIP is located.
The format of rollback ZIP file name is Recovery_<EXPORT_ZIP_NAME>.zip. RetainXmlLocation, OverRideuser, and OverrideModifiedByuser parameters are not applicable in case of rollback.
- No labels