Skip to content

Commit e6c0b35

Browse files
author
nagalakshmi
committed
Added support to execute regressions on arm infrastructure
1 parent 8f7117d commit e6c0b35

File tree

2 files changed

+211
-31
lines changed

2 files changed

+211
-31
lines changed

Jenkinsfile

Lines changed: 208 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,53 @@
11
@Library('shared-libraries') _
22

33
def 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

1125
def 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

3453
def 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
}

docker-compose.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ services:
44

55
marklogic:
66
image: "${MARKLOGIC_IMAGE}"
7-
platform: linux/amd64
7+
platform: "${PLATFORM:-linux/amd64}"
88
environment:
9-
- INSTALL_CONVERTERS=true
9+
- INSTALL_CONVERTERS=${SET_CONVERTERS:-true}
1010
- MARKLOGIC_INIT=true
1111
- MARKLOGIC_ADMIN_USERNAME=admin
1212
- MARKLOGIC_ADMIN_PASSWORD=admin
@@ -21,4 +21,4 @@ services:
2121
- "8010-8015:8010-8015" # Range of ports used by app servers, at least one of which - 8015 - is created by a test.
2222

2323
volumes:
24-
marklogicLogs:
24+
marklogicLogs:

0 commit comments

Comments
 (0)