-
Notifications
You must be signed in to change notification settings - Fork 74
PDP-817: Introducing the support to execute Arm regressions #1890
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
3e7d5d7
3869af8
e34048e
51a364a
bd24938
f5b9313
4623c0e
2cdd3a9
00c9e6f
dcb08ac
957b560
0e130f8
a5a4db0
a87c906
97fd185
d282b09
676d3db
f571841
35d0119
0e967a4
f3e7607
bdda995
7b14c06
bdd16be
7390d90
da708af
d1e4545
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,33 +1,52 @@ | ||
| @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" | ||
rjrudin marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| 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 | ||
| echo "Waiting for MarkLogic server to initialize." | ||
| sleep 60s | ||
| export JAVA_HOME=$JAVA_HOME_DIR | ||
| export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR | ||
| export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH | ||
| ./gradlew mlTestConnections | ||
| ./gradlew -i mlDeploy mlReloadSchemas | ||
| ''' | ||
| 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 | ||
rjrudin marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| 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 300 | ||
|
||
| export JAVA_HOME=$JAVA_HOME_DIR | ||
| export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR | ||
| export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH | ||
| ./gradlew mlTestConnections | ||
| ./gradlew -i mlDeploy mlReloadSchemas | ||
| ''' | ||
| } | ||
|
|
||
| def runTests(String image) { | ||
|
|
@@ -170,22 +189,29 @@ 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: 'packagefile', defaultValue: 'Packagedependencies', description: 'package dependency file') | ||
| string(name: 'terraformBranch', defaultValue: 'master', description: 'Branch of terraform-templates repo to use') | ||
|
|
||
|
|
||
| } | ||
|
|
||
| environment { | ||
| JAVA_HOME_DIR = getJavaHomePath() | ||
| 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 { | ||
|
|
@@ -208,7 +234,7 @@ pipeline { | |
|
|
||
| echo "Run a test with the reverse proxy server to ensure it's fine." | ||
| ./gradlew -PtestUseReverseProxyServer=true runReverseProxyServer marklogic-client-api-functionaltests:test --tests SearchWithPageLengthTest || true | ||
| ''' | ||
| ''' | ||
| } | ||
| post { | ||
| always { | ||
|
|
@@ -222,26 +248,30 @@ pipeline { | |
| when { | ||
| branch 'develop' | ||
| not { | ||
| expression { return params.regressions } | ||
| anyOf { | ||
| expression { return params.regressions } | ||
| expression { return params.arm_regressions } | ||
| } | ||
| } | ||
| } | ||
| steps { | ||
| sh label: 'publish', script: '''#!/bin/bash | ||
| export JAVA_HOME=$JAVA_HOME_DIR | ||
| export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR | ||
| export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH | ||
| cp ~/.gradle/gradle.properties $GRADLE_USER_HOME; | ||
| cd java-client-api | ||
| ./gradlew publish | ||
| ''' | ||
| export JAVA_HOME=$JAVA_HOME_DIR | ||
| export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR | ||
| export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH | ||
| cp ~/.gradle/gradle.properties $GRADLE_USER_HOME; | ||
| cd java-client-api | ||
| ./gradlew publish | ||
| ''' | ||
| } | ||
| } | ||
|
|
||
| stage('regressions-11') { | ||
| when { | ||
| allOf { | ||
| branch 'develop' | ||
| expression { return params.regressions } | ||
| expression { return params.regressions } | ||
| expression { return !params.arm_regressions } | ||
| } | ||
| } | ||
| steps { | ||
|
|
@@ -280,7 +310,8 @@ pipeline { | |
| when { | ||
| allOf { | ||
| branch 'develop' | ||
| expression { return params.regressions } | ||
| expression { return params.regressions } | ||
| expression { return !params.arm_regressions } | ||
| } | ||
| } | ||
| steps { | ||
|
|
@@ -294,5 +325,156 @@ 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..." | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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} | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use "MARKLOGIC_INSTALL_CONVERTERS" as the Docker env var name, as "set" is misleading. |
||
| - MARKLOGIC_INIT=true | ||
| - MARKLOGIC_ADMIN_USERNAME=admin | ||
| - MARKLOGIC_ADMIN_PASSWORD=admin | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.