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