11@Library (' shared-libraries' ) _
22
33def getJavaHomePath () {
4- if (env. JAVA_VERSION == " JAVA21" ) {
5- return " /home/builder/java/jdk-21.0.1"
6- } else {
7- return " /home/builder/java/jdk-17.0.2"
8- }
4+ if (params. arm_regressions) {
5+ def version = (env. JAVA_VERSION == " JAVA21" ) ? " 21" : " 17"
6+ def path = " /usr/lib/jvm/java-${ version} -amazon-corretto.aarch64"
7+ return path
8+ } else {
9+ if (env. JAVA_VERSION == " JAVA21" ) {
10+ return " /home/builder/java/jdk-21.0.1"
11+ } else {
12+ return " /home/builder/java/jdk-17.0.2"
13+ }
14+ }
15+ }
16+
17+ def getPlatform () {
18+ return params. arm_regressions ? " linux/arm64" : " linux/amd64"
19+ }
20+
21+ def setConverters () {
22+ return params. arm_regressions ? " false" : " true"
923}
1024
1125def setupDockerMarkLogic (String image ) {
12- cleanupDocker()
13- sh label : ' mlsetup' , script : ''' #!/bin/bash
14- echo "Removing any running MarkLogic server and clean up MarkLogic data directory"
15- sudo /usr/local/sbin/mladmin remove
16- sudo /usr/local/sbin/mladmin cleandata
17- cd java-client-api
18- docker compose down -v || true
19- docker volume prune -f
20- echo "Using image: "''' + image + '''
21- docker pull ''' + image + '''
22- MARKLOGIC_IMAGE=''' + image + ''' MARKLOGIC_LOGS_VOLUME=marklogicLogs docker compose up -d --build
23- export JAVA_HOME=$JAVA_HOME_DIR
24- export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
25- export PATH=$JAVA_HOME/bin:$PATH
26+ cleanupDocker()
27+ sh label : ' mlsetup' , script : ''' #!/bin/bash
28+ echo "Removing any running MarkLogic server and clean up MarkLogic data directory"
29+ sudo /usr/local/sbin/mladmin remove
30+ sudo /usr/local/sbin/mladmin cleandata
31+ cd java-client-api
32+ export PLATFORM=$PLATFORM
33+ export SET_CONVERTERS=$SET_CONVERTERS
34+ docker compose down -v || true
35+ docker volume prune -f
36+
37+ echo "Using image: "''' + image + '''
38+ docker pull ''' + image + '''
39+
40+ MARKLOGIC_IMAGE=''' + image + ''' MARKLOGIC_LOGS_VOLUME=marklogicLogs \
41+ docker compose up -d --build
42+ echo "Waiting for MarkLogic server to initialize."
43+ sleep 60
44+ export JAVA_HOME=$JAVA_HOME_DIR
45+ export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
46+ export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
2647 ./gradlew -i mlWaitTillReady
27- sleep 3
28- ./gradlew -i mlWaitTillReady
29- ./gradlew mlTestConnections
30- ./gradlew -i mlDeploy mlReloadSchemas
31- '''
48+ ./gradlew mlTestConnections
49+ ./gradlew -i mlDeploy mlReloadSchemas
50+ '''
3251}
3352
3453def runTests (String image ) {
@@ -171,23 +190,28 @@ pipeline {
171190
172191 parameters {
173192 booleanParam(name : ' regressions' , defaultValue : false , description : ' indicator if build is for regressions' )
193+ booleanParam(name : ' arm_regressions' , defaultValue : false , description : ' indicator if build is for ARM regressions' )
174194 string(name : ' JAVA_VERSION' , defaultValue : ' JAVA17' , description : ' Either JAVA17 or JAVA21' )
175195 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.' )
196+ string(name : ' packagefile' , defaultValue : ' Packagedependencies' , description : ' package dependency file' )
197+ string(name : ' terraformBranch' , defaultValue : ' master' , description : ' Branch of terraform-templates repo to use' )
176198 }
177199
178200 environment {
179201 JAVA_HOME_DIR = getJavaHomePath()
180202 GRADLE_DIR = " .gradle"
181203 DMC_USER = credentials(' MLBUILD_USER' )
182204 DMC_PASSWORD = credentials(' MLBUILD_PASSWORD' )
205+ PLATFORM = getPlatform()
206+ SET_CONVERTERS = setConverters()
183207 }
184208
185209 stages {
186210
187211 stage(' pull-request-tests' ) {
188212 when {
189- not {
190- expression { return params. regressions }
213+ expression {
214+ return ! params. regressions && ! params . arm_regressions
191215 }
192216 }
193217 steps {
@@ -225,7 +249,10 @@ pipeline {
225249 when {
226250 branch ' develop'
227251 not {
228- expression { return params. regressions }
252+ anyOf {
253+ expression { return params. regressions }
254+ expression { return params. arm_regressions }
255+ }
229256 }
230257 }
231258 steps {
@@ -244,7 +271,8 @@ pipeline {
244271 when {
245272 allOf {
246273 branch ' develop'
247- expression { return params. regressions }
274+ expression { return params. regressions }
275+ expression { return ! params. arm_regressions }
248276 }
249277 }
250278
@@ -270,5 +298,157 @@ pipeline {
270298 }
271299 }
272300 }
301+
302+ stage(' provisionInfrastructure' ){
303+ when {
304+ allOf {
305+ branch ' develop'
306+ expression { return params. arm_regressions }
307+ expression { return ! params. regressions }
308+ }
309+ }
310+ agent {label ' javaClientLinuxPool' }
311+
312+ steps{
313+ script {
314+
315+
316+ def deploymentResult = deployAWSInstance([
317+ instanceName : " java-client-instance-${ BUILD_NUMBER} " ,
318+ region : ' us-west-2' ,
319+ credentialsId : ' headlessDbUserEC2' ,
320+ role : ' role-headless-testing' ,
321+ roleAccount : ' 343869654284' ,
322+ branch : params. terraformBranch
323+ ])
324+
325+ echo " ✅ Instance deployed: ${ deploymentResult.privateIp} "
326+ echo " ✅ Terraform directory: ${ deploymentResult.terraformDir} "
327+ echo " ✅ Workspace: ${ deploymentResult.workspace} "
328+ echo " ✅ Status: ${ deploymentResult.status} "
329+
330+ // Store deployment info for cleanup
331+ env. DEPLOYMENT_INSTANCE_NAME = deploymentResult. instanceName
332+ env. DEPLOYMENT_REGION = deploymentResult. region
333+ env. DEPLOYMENT_TERRAFORM_DIR = deploymentResult. terraformDir
334+ env. EC2_PRIVATE_IP = deploymentResult. privateIp
335+
336+ def nodeName = " java-client-agent-${ BUILD_NUMBER} "
337+ def remoteFS = " /space/jenkins_home"
338+ def labels = " java-client-agent-${ BUILD_NUMBER} "
339+ def instanceIp = env. EC2_PRIVATE_IP
340+
341+ // Use shared library for volume attachment
342+ def volumeResult = attachInstanceVolumes([
343+ instanceIp : instanceIp,
344+ remoteFS : remoteFS,
345+ packageFile : params. packagefile,
346+ setupScriptPath : ' terraform-templates/arm-server-build/setup_volume.sh' ,
347+ packageDir : ' terraform-templates/java-client-api' ,
348+ initScriptsDir : ' terraform-templates/java-client-api/scripts' ,
349+ initScriptsFile : ' terraform-templates/java-client-api/initscripts' ,
350+ branch : params. terraformBranch
351+
352+ ])
353+
354+ echo " ✅ Volume attachment completed: ${ volumeResult.volumeAttached} "
355+ echo " ✅ Java installed: ${ volumeResult.javaInstalled} "
356+ echo " ✅ Dependencies installed: ${ volumeResult.dependenciesInstalled} "
357+
358+ // Use shared library to create Jenkins agent
359+ def agentResult = createJenkinsAgent([
360+ nodeName : nodeName,
361+ instanceIp : instanceIp,
362+ remoteFS : remoteFS,
363+ labels : labels,
364+ timeoutMinutes : 5 ,
365+ credentialsId : ' qa-builder-aws'
366+ ])
367+
368+ echo " ✅ Jenkins agent created: ${ agentResult.nodeName} "
369+ echo " ✅ Agent status: ${ agentResult.status} "
370+ }
371+ }
372+ }
373+
374+ stage(' regressions-11 arm infrastructure' ) {
375+ agent { label " java-client-agent-${ BUILD_NUMBER} " }
376+ when {
377+ allOf {
378+ branch ' develop'
379+ expression { return params. arm_regressions }
380+ expression { return ! params. regressions }
381+ }
382+ }
383+ steps {
384+ checkout([$class : ' GitSCM' ,
385+ branches : scm. branches,
386+ doGenerateSubmoduleConfigurations : false ,
387+ extensions : [[$class : ' RelativeTargetDirectory' , relativeTargetDir : ' java-client-api' ]],
388+ submoduleCfg : [],
389+ userRemoteConfigs : scm. userRemoteConfigs])
390+
391+ runTests(" ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi9-arm:latest-11" )
392+ }
393+ post {
394+ always {
395+ archiveArtifacts artifacts : ' java-client-api/**/build/reports/**/*.html'
396+ junit ' **/build/**/TEST*.xml'
397+ updateWorkspacePermissions()
398+ tearDownDocker()
399+ }
400+ }
401+ }
402+
403+
404+ }
405+
406+ post{
407+ always {
408+ script {
409+ echo " 🧹 Starting cleanup process..."
410+
411+ try {
412+ // Cleanup Terraform infrastructure
413+ if (env. EC2_PRIVATE_IP ) {
414+ echo " 🗑️ Cleaning up Terraform resources..."
415+ node(' javaClientLinuxPool' ) {
416+ try {
417+ sleep 60
418+ unstash " terraform-${ BUILD_NUMBER} "
419+ withAWS(credentials : ' headlessDbUserEC2' , region : ' us-west-2' , role : ' role-headless-testing' , roleAccount : ' 343869654284' , duration : 3600 ) {
420+ sh ''' #!/bin/bash
421+ export PATH=/home/builder/terraform:$PATH
422+ cd ${WORKSPACE}/${DEPLOYMENT_TERRAFORM_DIR}
423+ terraform workspace select dev
424+ terraform destroy -auto-approve
425+ '''
426+ }
427+ echo " ✅ Terraform resources destroyed successfully."
428+ } catch (Exception terraformException) {
429+ echo " ⚠️ Warning: Terraform cleanup failed: ${ terraformException.message} "
430+ }
431+ }
432+ } else {
433+ echo " ℹ️ No EC2 instance IP found, skipping Terraform cleanup"
434+ }
435+
436+ // Cleanup Jenkins agent using shared library function
437+ def nodeName = " java-client-agent-${ BUILD_NUMBER} "
438+ echo " 🗑️ Cleaning up Jenkins agent: ${ nodeName} "
439+ try {
440+ def cleanupResult = cleanupJenkinsAgent(nodeName)
441+ echo " ✅ Cleanup result: ${ cleanupResult.status} for node: ${ cleanupResult.nodeName} "
442+ } catch (Exception jenkinsCleanupException) {
443+ echo " ⚠️ Warning: Jenkins agent cleanup failed: ${ jenkinsCleanupException.message} "
444+ }
445+ echo " ✅ Pipeline cleanup completed successfully."
446+
447+ } catch (Exception cleanupException) {
448+ echo " ⚠️ Warning: Cleanup encountered an error: ${ cleanupException.message} "
449+ echo " 📋 Continuing with pipeline completion despite cleanup issues..."
450+ }
451+ }
452+ }
273453 }
274454}
0 commit comments