From e6c0b35c69fa5def90830fe55e5cdc75638c7cc9 Mon Sep 17 00:00:00 2001 From: nagalakshmi Date: Thu, 29 Jan 2026 20:20:19 +0530 Subject: [PATCH] Added support to execute regressions on arm infrastructure --- Jenkinsfile | 236 ++++++++++++++++++++++++++++++++++++++------ docker-compose.yaml | 6 +- 2 files changed, 211 insertions(+), 31 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5225054e6..6e896e78e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,34 +1,53 @@ @Library('shared-libraries') _ def getJavaHomePath() { - if (env.JAVA_VERSION == "JAVA21") { - return "/home/builder/java/jdk-21.0.1" - } else { - return "/home/builder/java/jdk-17.0.2" - } + if (params.arm_regressions) { + def version = (env.JAVA_VERSION == "JAVA21") ? "21" : "17" + def path = "/usr/lib/jvm/java-${version}-amazon-corretto.aarch64" + return path + } else { + if (env.JAVA_VERSION == "JAVA21") { + return "/home/builder/java/jdk-21.0.1" + } else { + return "/home/builder/java/jdk-17.0.2" + } + } +} + +def getPlatform() { + return params.arm_regressions ? "linux/arm64" : "linux/amd64" +} + +def setConverters() { + return params.arm_regressions ? "false" :"true" } def setupDockerMarkLogic(String image) { - cleanupDocker() - sh label: 'mlsetup', script: '''#!/bin/bash - echo "Removing any running MarkLogic server and clean up MarkLogic data directory" - sudo /usr/local/sbin/mladmin remove - sudo /usr/local/sbin/mladmin cleandata - cd java-client-api - docker compose down -v || true - docker volume prune -f - echo "Using image: "''' + image + ''' - docker pull ''' + image + ''' - MARKLOGIC_IMAGE=''' + image + ''' MARKLOGIC_LOGS_VOLUME=marklogicLogs docker compose up -d --build - export JAVA_HOME=$JAVA_HOME_DIR - export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR - export PATH=$JAVA_HOME/bin:$PATH + cleanupDocker() + sh label: 'mlsetup', script: '''#!/bin/bash + echo "Removing any running MarkLogic server and clean up MarkLogic data directory" + sudo /usr/local/sbin/mladmin remove + sudo /usr/local/sbin/mladmin cleandata + cd java-client-api + export PLATFORM=$PLATFORM + export SET_CONVERTERS=$SET_CONVERTERS + docker compose down -v || true + docker volume prune -f + + echo "Using image: "''' + image + ''' + docker pull ''' + image + ''' + + MARKLOGIC_IMAGE=''' + image + ''' MARKLOGIC_LOGS_VOLUME=marklogicLogs \ + docker compose up -d --build + echo "Waiting for MarkLogic server to initialize." + sleep 60 + export JAVA_HOME=$JAVA_HOME_DIR + export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR + export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH ./gradlew -i mlWaitTillReady - sleep 3 - ./gradlew -i mlWaitTillReady - ./gradlew mlTestConnections - ./gradlew -i mlDeploy mlReloadSchemas - ''' + ./gradlew mlTestConnections + ./gradlew -i mlDeploy mlReloadSchemas + ''' } def runTests(String image) { @@ -171,8 +190,11 @@ pipeline { parameters { booleanParam(name: 'regressions', defaultValue: false, description: 'indicator if build is for regressions') + booleanParam(name: 'arm_regressions', defaultValue: false, description: 'indicator if build is for ARM regressions') string(name: 'JAVA_VERSION', defaultValue: 'JAVA17', description: 'Either JAVA17 or JAVA21') string(name: 'MARKLOGIC_IMAGE_TAGS', defaultValue: 'marklogic-server-ubi:latest-11,marklogic-server-ubi:latest-12', description: 'Comma-delimited list of MarkLogic image tags including variant (e.g., marklogic-server-ubi:latest-11,marklogic-server-ubi-rootless:11.3.2). The registry/org (ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic) path will be prepended automatically.') + string(name: 'packagefile', defaultValue: 'Packagedependencies', description: 'package dependency file') + string(name: 'terraformBranch', defaultValue: 'master', description: 'Branch of terraform-templates repo to use') } environment { @@ -180,14 +202,16 @@ pipeline { GRADLE_DIR = ".gradle" DMC_USER = credentials('MLBUILD_USER') DMC_PASSWORD = credentials('MLBUILD_PASSWORD') + PLATFORM = getPlatform() + SET_CONVERTERS = setConverters() } stages { stage('pull-request-tests') { when { - not { - expression { return params.regressions } + expression { + return !params.regressions && !params.arm_regressions } } steps { @@ -225,7 +249,10 @@ pipeline { when { branch 'develop' not { - expression { return params.regressions } + anyOf { + expression { return params.regressions } + expression { return params.arm_regressions } + } } } steps { @@ -244,7 +271,8 @@ pipeline { when { allOf { branch 'develop' - expression { return params.regressions } + expression { return params.regressions } + expression { return !params.arm_regressions } } } @@ -270,5 +298,157 @@ pipeline { } } } + + stage('provisionInfrastructure'){ + when { + allOf { + branch 'develop' + expression { return params.arm_regressions } + expression { return !params.regressions } + } + } + agent {label 'javaClientLinuxPool'} + + steps{ + script { + + + def deploymentResult = deployAWSInstance([ + instanceName: "java-client-instance-${BUILD_NUMBER}", + region: 'us-west-2', + credentialsId: 'headlessDbUserEC2', + role: 'role-headless-testing', + roleAccount: '343869654284', + branch: params.terraformBranch + ]) + + echo "✅ Instance deployed: ${deploymentResult.privateIp}" + echo "✅ Terraform directory: ${deploymentResult.terraformDir}" + echo "✅ Workspace: ${deploymentResult.workspace}" + echo "✅ Status: ${deploymentResult.status}" + + // Store deployment info for cleanup + env.DEPLOYMENT_INSTANCE_NAME = deploymentResult.instanceName + env.DEPLOYMENT_REGION = deploymentResult.region + env.DEPLOYMENT_TERRAFORM_DIR = deploymentResult.terraformDir + env.EC2_PRIVATE_IP = deploymentResult.privateIp + + def nodeName = "java-client-agent-${BUILD_NUMBER}" + def remoteFS = "/space/jenkins_home" + def labels = "java-client-agent-${BUILD_NUMBER}" + def instanceIp = env.EC2_PRIVATE_IP + + // Use shared library for volume attachment + def volumeResult = attachInstanceVolumes([ + instanceIp: instanceIp, + remoteFS: remoteFS, + packageFile: params.packagefile, + setupScriptPath: 'terraform-templates/arm-server-build/setup_volume.sh', + packageDir: 'terraform-templates/java-client-api', + initScriptsDir: 'terraform-templates/java-client-api/scripts', + initScriptsFile: 'terraform-templates/java-client-api/initscripts', + branch: params.terraformBranch + + ]) + + echo "✅ Volume attachment completed: ${volumeResult.volumeAttached}" + echo "✅ Java installed: ${volumeResult.javaInstalled}" + echo "✅ Dependencies installed: ${volumeResult.dependenciesInstalled}" + + // Use shared library to create Jenkins agent + def agentResult = createJenkinsAgent([ + nodeName: nodeName, + instanceIp: instanceIp, + remoteFS: remoteFS, + labels: labels, + timeoutMinutes: 5, + credentialsId: 'qa-builder-aws' + ]) + + echo "✅ Jenkins agent created: ${agentResult.nodeName}" + echo "✅ Agent status: ${agentResult.status}" + } + } + } + + stage('regressions-11 arm infrastructure') { + agent { label "java-client-agent-${BUILD_NUMBER}" } + when { + allOf { + branch 'develop' + expression { return params.arm_regressions } + expression { return !params.regressions } + } + } + steps { + checkout([$class: 'GitSCM', + branches: scm.branches, + doGenerateSubmoduleConfigurations: false, + extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'java-client-api']], + submoduleCfg: [], + userRemoteConfigs: scm.userRemoteConfigs]) + + runTests("ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi9-arm:latest-11") + } + post { + always { + archiveArtifacts artifacts: 'java-client-api/**/build/reports/**/*.html' + junit '**/build/**/TEST*.xml' + updateWorkspacePermissions() + tearDownDocker() + } + } + } + + + } + + post{ + always { + script { + echo "🧹 Starting cleanup process..." + + try { + // Cleanup Terraform infrastructure + if (env.EC2_PRIVATE_IP) { + echo "🗑️ Cleaning up Terraform resources..." + node('javaClientLinuxPool') { + try { + sleep 60 + unstash "terraform-${BUILD_NUMBER}" + withAWS(credentials: 'headlessDbUserEC2', region: 'us-west-2', role: 'role-headless-testing', roleAccount: '343869654284', duration: 3600) { + sh '''#!/bin/bash + export PATH=/home/builder/terraform:$PATH + cd ${WORKSPACE}/${DEPLOYMENT_TERRAFORM_DIR} + terraform workspace select dev + terraform destroy -auto-approve + ''' + } + echo "✅ Terraform resources destroyed successfully." + } catch (Exception terraformException) { + echo "⚠️ Warning: Terraform cleanup failed: ${terraformException.message}" + } + } + } else { + echo "ℹ️ No EC2 instance IP found, skipping Terraform cleanup" + } + + // Cleanup Jenkins agent using shared library function + def nodeName = "java-client-agent-${BUILD_NUMBER}" + echo "🗑️ Cleaning up Jenkins agent: ${nodeName}" + try { + def cleanupResult = cleanupJenkinsAgent(nodeName) + echo "✅ Cleanup result: ${cleanupResult.status} for node: ${cleanupResult.nodeName}" + } catch (Exception jenkinsCleanupException) { + echo "⚠️ Warning: Jenkins agent cleanup failed: ${jenkinsCleanupException.message}" + } + echo "✅ Pipeline cleanup completed successfully." + + } catch (Exception cleanupException) { + echo "⚠️ Warning: Cleanup encountered an error: ${cleanupException.message}" + echo "📋 Continuing with pipeline completion despite cleanup issues..." + } + } + } } } diff --git a/docker-compose.yaml b/docker-compose.yaml index 9d1dab27e..da00f026e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,9 +4,9 @@ services: marklogic: image: "${MARKLOGIC_IMAGE}" - platform: linux/amd64 + platform: "${PLATFORM:-linux/amd64}" environment: - - INSTALL_CONVERTERS=true + - INSTALL_CONVERTERS=${SET_CONVERTERS:-true} - MARKLOGIC_INIT=true - MARKLOGIC_ADMIN_USERNAME=admin - MARKLOGIC_ADMIN_PASSWORD=admin @@ -21,4 +21,4 @@ services: - "8010-8015:8010-8015" # Range of ports used by app servers, at least one of which - 8015 - is created by a test. volumes: - marklogicLogs: + marklogicLogs: \ No newline at end of file