@@ -8,6 +8,11 @@ def getJavaHomePath() {
88 }
99}
1010
11+ def getJavaHomePathForARM () {
12+ def version = (env. JAVA_VERSION == " JAVA21" ) ? " 21" : " 17"
13+ return " /usr/lib/jvm/java-${ version} -amazon-corretto.aarch64"
14+ }
15+
1116def setupDockerMarkLogic (String image ) {
1217 cleanupDocker()
1318 sh label : ' mlsetup' , script : ''' #!/bin/bash
@@ -24,7 +29,6 @@ def setupDockerMarkLogic(String image) {
2429 export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
2530 export PATH=$JAVA_HOME/bin:$PATH
2631 ./gradlew -i mlWaitTillReady
27- sleep 3
2832 ./gradlew -i mlWaitTillReady
2933 ./gradlew mlTestConnections
3034 ./gradlew -i mlDeploy mlReloadSchemas
@@ -133,6 +137,8 @@ pipeline {
133137 GRADLE_DIR = " .gradle"
134138 DMC_USER = credentials(' MLBUILD_USER' )
135139 DMC_PASSWORD = credentials(' MLBUILD_PASSWORD' )
140+ PLATFORM = " linux/amd64"
141+ MARKLOGIC_INSTALL_CONVERTERS = " true"
136142 }
137143
138144 stages {
@@ -223,5 +229,179 @@ pipeline {
223229 }
224230 }
225231 }
232+
233+ stage(' provisionInfrastructure' ) {
234+ when {
235+ allOf {
236+ branch ' develop'
237+ expression { return params. regressions }
238+ }
239+ }
240+ agent { label ' javaClientLinuxPool' }
241+
242+ steps {
243+ script {
244+ withCredentials([
245+ string(credentialsId : ' aws-region-us-west' , variable : ' AWS_REGION' ),
246+ string(credentialsId : ' aws-role-headless-testing' , variable : ' AWS_ROLE' ),
247+ string(credentialsId : ' aws-role-account-headless' , variable : ' AWS_ROLE_ACCOUNT' )
248+ ]) {
249+ def deploymentResult = deployAWSInstance([
250+ instanceName : " java-client-instance-${ BUILD_NUMBER} " ,
251+ region : env. AWS_REGION ,
252+ credentialsId : ' headlessDbUserEC2' ,
253+ role : env. AWS_ROLE ,
254+ roleAccount : env. AWS_ROLE_ACCOUNT ,
255+ branch : ' master'
256+ ])
257+
258+ echo " ✅ Instance deployed: ${ deploymentResult.privateIp} "
259+ echo " ✅ Terraform directory: ${ deploymentResult.terraformDir} "
260+ echo " ✅ Workspace: ${ deploymentResult.workspace} "
261+ echo " ✅ Status: ${ deploymentResult.status} "
262+
263+ // Store deployment info for cleanup
264+ env. DEPLOYMENT_INSTANCE_NAME = deploymentResult. instanceName
265+ env. DEPLOYMENT_REGION = deploymentResult. region
266+ env. DEPLOYMENT_TERRAFORM_DIR = deploymentResult. terraformDir
267+ env. EC2_PRIVATE_IP = deploymentResult. privateIp
268+
269+ def nodeName = " java-client-agent-${ BUILD_NUMBER} "
270+ def remoteFS = " /space/jenkins_home"
271+ def labels = " java-client-agent-${ BUILD_NUMBER} "
272+ def instanceIp = env. EC2_PRIVATE_IP
273+
274+ // Attach volumes
275+ def volumeResult = attachInstanceVolumes([
276+ instanceIp : instanceIp,
277+ remoteFS : remoteFS,
278+ branch : ' master'
279+ ])
280+
281+ echo " ✅ Volume attachment completed: ${ volumeResult.volumeAttached} "
282+ echo " ✅ Java installed: ${ volumeResult.javaInstalled} "
283+
284+ // Install dependencies AND run init scripts
285+ def depsResult = installDependenciesAndInitScripts([
286+ instanceIp : instanceIp,
287+ packageFile : ' Packagedependencies' ,
288+ packageDir : ' terraform-templates/java-client-api' ,
289+ initScriptsDir : ' terraform-templates/java-client-api/scripts' ,
290+ initScriptsFile : ' terraform-templates/java-client-api/initscripts'
291+ ])
292+
293+ echo " ✅ Dependencies installed: ${ depsResult.dependenciesInstalled} "
294+ if (depsResult. initScriptsExecuted) {
295+ echo " ✅ Init scripts executed: ${ depsResult.initScriptsCount} scripts"
296+ } else {
297+ echo " ℹ️ No init scripts configured or executed"
298+ }
299+
300+ // Use shared library to create Jenkins agent
301+ def agentResult = createJenkinsAgent([
302+ nodeName : nodeName,
303+ instanceIp : instanceIp,
304+ remoteFS : remoteFS,
305+ labels : labels,
306+ timeoutMinutes : 5 ,
307+ credentialsId : ' qa-builder-aws'
308+ ])
309+
310+ echo " ✅ Jenkins agent created: ${ agentResult.nodeName} "
311+ echo " ✅ Agent status: ${ agentResult.status} "
312+ }
313+ }
314+ }
315+ }
316+
317+ stage(' regressions-11 arm infrastructure' ) {
318+ when {
319+ allOf {
320+ beforeAgent true
321+ branch ' develop'
322+ expression { return params. regressions }
323+ expression { return env. EC2_PRIVATE_IP != null }
324+ }
325+ }
326+ agent { label " java-client-agent-${ BUILD_NUMBER} " }
327+ environment {
328+ JAVA_HOME_DIR = getJavaHomePathForARM()
329+ PLATFORM = " linux/arm64"
330+ MARKLOGIC_INSTALL_CONVERTERS = " false"
331+ }
332+ steps {
333+ checkout([$class : ' GitSCM' ,
334+ branches : scm. branches,
335+ doGenerateSubmoduleConfigurations : false ,
336+ extensions : [[$class : ' RelativeTargetDirectory' , relativeTargetDir : ' java-client-api' ]],
337+ submoduleCfg : [],
338+ userRemoteConfigs : scm. userRemoteConfigs])
339+
340+ runTests(" ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi9-arm:latest-11" )
341+ }
342+ post {
343+ always {
344+ archiveArtifacts artifacts : ' java-client-api/**/build/reports/**/*.html'
345+ junit ' **/build/**/TEST*.xml'
346+ updateWorkspacePermissions()
347+ tearDownDocker()
348+ }
349+ }
350+ }
351+ }
352+
353+ post {
354+ always {
355+ script {
356+ echo " 🧹 Starting cleanup process..."
357+
358+ try {
359+ // Cleanup Terraform infrastructure
360+ if (env. EC2_PRIVATE_IP ) {
361+ echo " 🗑️ Cleaning up Terraform resources..."
362+ node(' javaClientLinuxPool' ) {
363+ try {
364+ // `sleep 60` allows AWS resources to stabilize before Terraform destroys them, preventing "resource in use" errors
365+ sleep 60
366+ unstash " terraform-${ BUILD_NUMBER} "
367+ withCredentials([
368+ string(credentialsId : ' aws-region-us-west' , variable : ' AWS_REGION' ),
369+ string(credentialsId : ' aws-role-headless-testing' , variable : ' AWS_ROLE' ),
370+ string(credentialsId : ' aws-role-account-headless' , variable : ' AWS_ROLE_ACCOUNT' )
371+ ]) {
372+ withAWS(credentials : ' headlessDbUserEC2' , region : env. AWS_REGION , role : env. AWS_ROLE , roleAccount : env. AWS_ROLE_ACCOUNT , duration : 3600 ) {
373+ sh ''' #!/bin/bash
374+ export PATH=/home/builder/terraform:$PATH
375+ cd ${WORKSPACE}/${DEPLOYMENT_TERRAFORM_DIR}
376+ terraform workspace select dev
377+ terraform destroy -auto-approve
378+ '''
379+ }
380+ }
381+ echo " ✅ Terraform resources destroyed successfully."
382+ // Cleanup Jenkins agent using shared library function
383+ def nodeName = " java-client-agent-${ BUILD_NUMBER} "
384+ echo " 🗑️ Cleaning up Jenkins agent: ${ nodeName} "
385+ try {
386+ def cleanupResult = cleanupJenkinsAgent(nodeName)
387+ echo " ✅ Cleanup result: ${ cleanupResult.status} for node: ${ cleanupResult.nodeName} "
388+ } catch (Exception jenkinsCleanupException) {
389+ echo " ⚠️ Warning: Jenkins agent cleanup failed: ${ jenkinsCleanupException.message} "
390+ }
391+ echo " ✅ Pipeline cleanup completed successfully."
392+ } catch (Exception terraformException) {
393+ echo " ⚠️ Warning: Terraform cleanup failed: ${ terraformException.message} "
394+ }
395+ }
396+ } else {
397+ echo " ℹ️ No EC2 instance IP found, skipping Terraform cleanup"
398+ }
399+ } catch (Exception cleanupException) {
400+ echo " ⚠️ Warning: Cleanup encountered an error: ${ cleanupException.message} "
401+ echo " 📋 Continuing with pipeline completion despite cleanup issues..."
402+ }
403+ }
404+ }
226405 }
227406}
407+
0 commit comments