11@Library (' shared-libraries' ) _
22
33def getJavaHomePath () {
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- }
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+ }
1515}
1616
1717def getPlatform () {
@@ -23,30 +23,30 @@ def setConverters() {
2323}
2424
2525def setupDockerMarkLogic (String image ) {
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 MARKLOGIC_INSTALL_CONVERTERS=$MARKLOGIC_INSTALL_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- export JAVA_HOME=$JAVA_HOME_DIR
44- export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
45- export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
46- ./gradlew -i mlWaitTillReady
47- ./gradlew mlTestConnections
48- ./gradlew -i mlDeploy mlReloadSchemas
49- '''
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 MARKLOGIC_INSTALL_CONVERTERS=$MARKLOGIC_INSTALL_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+ export JAVA_HOME=$JAVA_HOME_DIR
44+ export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
45+ export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
46+ ./gradlew -i mlWaitTillReady
47+ ./gradlew mlTestConnections
48+ ./gradlew -i mlDeploy mlReloadSchemas
49+ '''
5050}
5151
5252def runTests (String image ) {
@@ -63,7 +63,7 @@ def runTests(String image) {
6363 rm -rf ~/.m2/repository/com/squareup/okhttp3/
6464
6565 echo "Ensure all subprojects can be built first."
66- ./gradlew clean build -x test
66+ ./gradlew clean build -x test
6767
6868 ./gradlew marklogic-client-api:test || true
6969 '''
@@ -118,9 +118,9 @@ def runTestsWithReverseProxy(String image) {
118118 rm -rf ~/.m2/repository/com/squareup/okhttp3/
119119
120120 echo "Ensure all subprojects can be built first."
121- ./gradlew clean build -x test
121+ ./gradlew clean build -x test
122122
123- echo "Running marklogic-client-api tests with reverse proxy."
123+ echo "Running marklogic-client-api tests with reverse proxy."
124124 ./gradlew -PtestUseReverseProxyServer=true runReverseProxyServer marklogic-client-api:test || true
125125 '''
126126
@@ -204,34 +204,33 @@ pipeline {
204204 }
205205
206206 stages {
207-
208207 stage(' pull-request-tests' ) {
209208 when {
210- expression {
209+ expression {
211210 return ! params. regressions && ! params. arm_regressions
212211 }
213212 }
214213 steps {
215214 setupDockerMarkLogic(" ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi:latest-12" )
216215 sh label : ' run marklogic-client-api tests' , script : ''' #!/bin/bash
217- export JAVA_HOME=$JAVA_HOME_DIR
218- export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
219- export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
220- cd java-client-api
216+ export JAVA_HOME=$JAVA_HOME_DIR
217+ export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
218+ export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
219+ cd java-client-api
221220
222- echo "Temporary fix for mysterious issue with okhttp3 being corrupted in local Maven cache."
223- ls -la ~/.m2/repository/com/squareup
221+ echo "Temporary fix for mysterious issue with okhttp3 being corrupted in local Maven cache."
222+ ls -la ~/.m2/repository/com/squareup
224223 rm -rf ~/.m2/repository/com/squareup/okhttp3/
225224
226- echo "Ensure all subprojects can be built first."
227- ./gradlew clean build -x test
225+ echo "Ensure all subprojects can be built first."
226+ ./gradlew clean build -x test
228227
229- echo "Run a sufficient number of tests to verify the PR."
228+ echo "Run a sufficient number of tests to verify the PR."
230229 ./gradlew marklogic-client-api:test --tests ReadDocumentPageTest || true
231230
232231 echo "Run a test with the reverse proxy server to ensure it's fine."
233232 ./gradlew -PtestUseReverseProxyServer=true runReverseProxyServer marklogic-client-api-functionaltests:test --tests SearchWithPageLengthTest || true
234- '''
233+ '''
235234 }
236235 post {
237236 always {
@@ -254,22 +253,22 @@ pipeline {
254253 }
255254 steps {
256255 sh label : ' publish' , script : ''' #!/bin/bash
257- export JAVA_HOME=$JAVA_HOME_DIR
258- export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
259- export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
260- cp ~/.gradle/gradle.properties $GRADLE_USER_HOME;
261- cd java-client-api
262- ./gradlew publish
263- '''
256+ export JAVA_HOME=$JAVA_HOME_DIR
257+ export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
258+ export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
259+ cp ~/.gradle/gradle.properties $GRADLE_USER_HOME;
260+ cd java-client-api
261+ ./gradlew publish
262+ '''
264263 }
265264 }
266265
267266 stage(' regressions' ) {
268267 when {
269268 allOf {
270269 branch ' develop'
271- expression { return params. regressions }
272- expression { return ! params. arm_regressions }
270+ expression { return params. regressions }
271+ expression { return ! params. arm_regressions }
273272 }
274273 }
275274
@@ -301,11 +300,11 @@ pipeline {
301300 allOf {
302301 branch ' develop'
303302 expression { return params. arm_regressions }
304- expression { return ! params. regressions }
303+ expression { return ! params. regressions }
305304 }
306305 }
307306 agent {label ' javaClientLinuxPool' }
308-
307+
309308 steps{
310309 script {
311310 withCredentials([
@@ -319,35 +318,35 @@ pipeline {
319318 credentialsId : ' headlessDbUserEC2' ,
320319 role : env. AWS_ROLE ,
321320 roleAccount : env. AWS_ROLE_ACCOUNT ,
322- branch : ' master'
321+ branch : ' master'
323322 ])
324-
323+
325324 echo " ✅ Instance deployed: ${ deploymentResult.privateIp} "
326325 echo " ✅ Terraform directory: ${ deploymentResult.terraformDir} "
327326 echo " ✅ Workspace: ${ deploymentResult.workspace} "
328327 echo " ✅ Status: ${ deploymentResult.status} "
329-
330- // Store deployment info for cleanup
328+
329+ // Store deployment info for cleanup
331330 env. DEPLOYMENT_INSTANCE_NAME = deploymentResult. instanceName
332331 env. DEPLOYMENT_REGION = deploymentResult. region
333332 env. DEPLOYMENT_TERRAFORM_DIR = deploymentResult. terraformDir
334333 env. EC2_PRIVATE_IP = deploymentResult. privateIp
335-
334+
336335 def nodeName = " java-client-agent-${ BUILD_NUMBER} "
337336 def remoteFS = " /space/jenkins_home"
338337 def labels = " java-client-agent-${ BUILD_NUMBER} "
339338 def instanceIp = env. EC2_PRIVATE_IP
340-
339+
341340 // Attach volumes
342341 def volumeResult = attachInstanceVolumes([
343342 instanceIp : instanceIp,
344343 remoteFS : remoteFS,
345344 branch : ' master'
346345 ])
347-
346+
348347 echo " ✅ Volume attachment completed: ${ volumeResult.volumeAttached} "
349- echo " ✅ Java installed: ${ volumeResult.javaInstalled} "
350-
348+ echo " ✅ Java installed: ${ volumeResult.javaInstalled} "
349+
351350 // Install dependencies AND run init scripts
352351 def depsResult = installDependenciesAndInitScripts([
353352 instanceIp : instanceIp,
@@ -356,7 +355,7 @@ pipeline {
356355 initScriptsDir : ' terraform-templates/java-client-api/scripts' ,
357356 initScriptsFile : ' terraform-templates/java-client-api/initscripts'
358357 ])
359-
358+
360359 echo " ✅ Dependencies installed: ${ depsResult.dependenciesInstalled} "
361360 if (depsResult. initScriptsExecuted) {
362361 echo " ✅ Init scripts executed: ${ depsResult.initScriptsCount} scripts"
@@ -373,7 +372,7 @@ pipeline {
373372 timeoutMinutes : 5 ,
374373 credentialsId : ' qa-builder-aws'
375374 ])
376-
375+
377376 echo " ✅ Jenkins agent created: ${ agentResult.nodeName} "
378377 echo " ✅ Agent status: ${ agentResult.status} "
379378 }
@@ -382,22 +381,22 @@ pipeline {
382381 }
383382
384383 stage(' regressions-11 arm infrastructure' ) {
385- agent { label " java-client-agent-${ BUILD_NUMBER} " }
384+ agent { label " java-client-agent-${ BUILD_NUMBER} " }
386385 when {
387386 allOf {
388387 branch ' develop'
389388 expression { return params. arm_regressions }
390- expression { return ! params. regressions }
389+ expression { return ! params. regressions }
391390 }
392391 }
393392 steps {
394- checkout([$class : ' GitSCM' ,
395- branches : scm. branches,
396- doGenerateSubmoduleConfigurations : false ,
397- extensions : [[$class : ' RelativeTargetDirectory' , relativeTargetDir : ' java-client-api' ]],
398- submoduleCfg : [],
393+ checkout([$class : ' GitSCM' ,
394+ branches : scm. branches,
395+ doGenerateSubmoduleConfigurations : false ,
396+ extensions : [[$class : ' RelativeTargetDirectory' , relativeTargetDir : ' java-client-api' ]],
397+ submoduleCfg : [],
399398 userRemoteConfigs : scm. userRemoteConfigs])
400-
399+
401400 runTests(" ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi9-arm:latest-11" )
402401 }
403402 post {
@@ -409,21 +408,20 @@ pipeline {
409408 }
410409 }
411410 }
412-
413-
414411 }
415412
416413 post{
417414 always {
418415 script {
419416 echo " 🧹 Starting cleanup process..."
420-
417+
421418 try {
422419 // Cleanup Terraform infrastructure
423420 if (env. EC2_PRIVATE_IP ) {
424421 echo " 🗑️ Cleaning up Terraform resources..."
425422 node(' javaClientLinuxPool' ) {
426423 try {
424+ // `sleep 60` allows AWS resources to stabilize before Terraform destroys them, preventing "resource in use" errors
427425 sleep 60
428426 unstash " terraform-${ BUILD_NUMBER} "
429427 withCredentials([
@@ -448,7 +446,7 @@ pipeline {
448446 } else {
449447 echo " ℹ️ No EC2 instance IP found, skipping Terraform cleanup"
450448 }
451-
449+
452450 // Cleanup Jenkins agent using shared library function
453451 def nodeName = " java-client-agent-${ BUILD_NUMBER} "
454452 echo " 🗑️ Cleaning up Jenkins agent: ${ nodeName} "
@@ -459,7 +457,7 @@ pipeline {
459457 echo " ⚠️ Warning: Jenkins agent cleanup failed: ${ jenkinsCleanupException.message} "
460458 }
461459 echo " ✅ Pipeline cleanup completed successfully."
462-
460+
463461 } catch (Exception cleanupException) {
464462 echo " ⚠️ Warning: Cleanup encountered an error: ${ cleanupException.message} "
465463 echo " 📋 Continuing with pipeline completion despite cleanup issues..."
@@ -468,3 +466,4 @@ pipeline {
468466 }
469467 }
470468}
469+
0 commit comments