Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3e7d5d7
updated jenkinsfile to support regressions on arm instances
Jan 12, 2026
3869af8
added terraform-templates branch paramter for testing
Jan 12, 2026
e34048e
updated the branch conditions for arm stages
Jan 12, 2026
51a364a
updated the parameter
Jan 12, 2026
bd24938
fixed issues with jenkinsfile and also with docker compose platform c…
Jan 20, 2026
f5b9313
fixed typo
Jan 20, 2026
4623c0e
Update docker-compose.yaml
nagalakshmi2024 Jan 20, 2026
2cdd3a9
created seperate docker-compose file for arm
Jan 21, 2026
00c9e6f
using custom docker compose file
Jan 21, 2026
dcb08ac
updated parameters
Jan 21, 2026
957b560
added wallet password for ML
Jan 21, 2026
0e130f8
configured with ubi9-arm image
Jan 22, 2026
a5a4db0
updated jenkinsfile , gradle properties to allow arm ec2 java install…
Jan 23, 2026
a87c906
removed error step
Jan 23, 2026
97fd185
commented org.gradle.java.installations.fromEnv=JAVA_HOME_DIR in the …
Jan 23, 2026
d282b09
updated java installation path to arm aarch64 java path
Jan 23, 2026
676d3db
updated gradle properties
Jan 27, 2026
f571841
using existing org.gradle.java.installations.paths
Jan 27, 2026
35d0119
using platform specific variables in docker compose file
Jan 28, 2026
0e967a4
updated docker-compose file
Jan 28, 2026
f3e7607
fixed issue with docker compose file
Jan 28, 2026
bdda995
waiting for ML Manage API to be up
Jan 28, 2026
7b14c06
archieving html reports from ec2 instance
Jan 28, 2026
bdd16be
increated timeout to see ML Manage API(8002)
Jan 28, 2026
7390d90
removed checks with ML server ports
Jan 28, 2026
da708af
provisioning the infra in single stage and optimized the pipeline flow
Jan 29, 2026
d1e4545
updated jenkinsfile
Jan 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 220 additions & 38 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,33 +1,52 @@
@Library('shared-libraries') _

def getJavaHomePath() {
if (env.JAVA_VERSION == "JAVA21") {
return "/home/builder/java/jdk-21.0.1"
} else {
return "/home/builder/java/jdk-17.0.2"
}
if (params.arm_regressions) {
def version = (env.JAVA_VERSION == "JAVA21") ? "21" : "17"
def path = "/usr/lib/jvm/java-${version}-amazon-corretto.aarch64"
return path
} else {
if (env.JAVA_VERSION == "JAVA21") {
return "/home/builder/java/jdk-21.0.1"
} else {
return "/home/builder/java/jdk-17.0.2"
}
}
}

def getPlatform() {
return params.arm_regressions ? "linux/arm64" : "linux/amd64"
}

def setConverters() {
return params.arm_regressions ? "false" :"true"
}

def setupDockerMarkLogic(String image) {
cleanupDocker()
sh label: 'mlsetup', script: '''#!/bin/bash
echo "Removing any running MarkLogic server and clean up MarkLogic data directory"
sudo /usr/local/sbin/mladmin remove
sudo /usr/local/sbin/mladmin cleandata
cd java-client-api
docker compose down -v || true
docker volume prune -f
echo "Using image: "''' + image + '''
docker pull ''' + image + '''
MARKLOGIC_IMAGE=''' + image + ''' MARKLOGIC_LOGS_VOLUME=marklogicLogs docker compose up -d --build
echo "Waiting for MarkLogic server to initialize."
sleep 60s
export JAVA_HOME=$JAVA_HOME_DIR
export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
./gradlew mlTestConnections
./gradlew -i mlDeploy mlReloadSchemas
'''
cleanupDocker()
sh label: 'mlsetup', script: '''#!/bin/bash
echo "Removing any running MarkLogic server and clean up MarkLogic data directory"
sudo /usr/local/sbin/mladmin remove
sudo /usr/local/sbin/mladmin cleandata
cd java-client-api
export PLATFORM=$PLATFORM
export SET_CONVERTERS=$SET_CONVERTERS
docker compose down -v || true
docker volume prune -f

echo "Using image: "''' + image + '''
docker pull ''' + image + '''

MARKLOGIC_IMAGE=''' + image + ''' MARKLOGIC_LOGS_VOLUME=marklogicLogs \
docker compose up -d --build
echo "Waiting for MarkLogic server to initialize."
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent indentation: this line uses tabs while surrounding lines use spaces.

Copilot uses AI. Check for mistakes.
sleep 300
Copy link

Copilot AI Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sleep duration increased from 60s to 300s (5 minutes) without explanation. This significant change affects all builds, not just ARM regressions. Consider making this configurable based on the platform or adding a comment explaining why ARM infrastructure requires a longer initialization time.

Copilot uses AI. Check for mistakes.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line won't be needed when merging to develop - we use a new ml-gradle task that will wait for MarkLogic to be ready.

export JAVA_HOME=$JAVA_HOME_DIR
export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
./gradlew mlTestConnections
./gradlew -i mlDeploy mlReloadSchemas
'''
}

def runTests(String image) {
Expand Down Expand Up @@ -170,22 +189,29 @@ pipeline {

parameters {
booleanParam(name: 'regressions', defaultValue: false, description: 'indicator if build is for regressions')
booleanParam(name: 'arm_regressions', defaultValue: false, description: 'indicator if build is for ARM regressions')
string(name: 'JAVA_VERSION', defaultValue: 'JAVA17', description: 'Either JAVA17 or JAVA21')
string(name: 'packagefile', defaultValue: 'Packagedependencies', description: 'package dependency file')
string(name: 'terraformBranch', defaultValue: 'master', description: 'Branch of terraform-templates repo to use')


}

environment {
JAVA_HOME_DIR = getJavaHomePath()
GRADLE_DIR = ".gradle"
DMC_USER = credentials('MLBUILD_USER')
DMC_PASSWORD = credentials('MLBUILD_PASSWORD')
PLATFORM = getPlatform()
SET_CONVERTERS = setConverters()
}

stages {

stage('pull-request-tests') {
when {
not {
expression { return params.regressions }
expression {
return !params.regressions && !params.arm_regressions
}
}
steps {
Expand All @@ -208,7 +234,7 @@ pipeline {

echo "Run a test with the reverse proxy server to ensure it's fine."
./gradlew -PtestUseReverseProxyServer=true runReverseProxyServer marklogic-client-api-functionaltests:test --tests SearchWithPageLengthTest || true
'''
'''
}
post {
always {
Expand All @@ -222,26 +248,30 @@ pipeline {
when {
branch 'develop'
not {
expression { return params.regressions }
anyOf {
expression { return params.regressions }
expression { return params.arm_regressions }
}
}
}
steps {
sh label: 'publish', script: '''#!/bin/bash
export JAVA_HOME=$JAVA_HOME_DIR
export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
cp ~/.gradle/gradle.properties $GRADLE_USER_HOME;
cd java-client-api
./gradlew publish
'''
export JAVA_HOME=$JAVA_HOME_DIR
export GRADLE_USER_HOME=$WORKSPACE/$GRADLE_DIR
export PATH=$GRADLE_USER_HOME:$JAVA_HOME/bin:$PATH
cp ~/.gradle/gradle.properties $GRADLE_USER_HOME;
cd java-client-api
./gradlew publish
'''
}
}

stage('regressions-11') {
when {
allOf {
branch 'develop'
expression { return params.regressions }
expression { return params.regressions }
expression { return !params.arm_regressions }
}
}
steps {
Expand Down Expand Up @@ -280,7 +310,8 @@ pipeline {
when {
allOf {
branch 'develop'
expression { return params.regressions }
expression { return params.regressions }
expression { return !params.arm_regressions }
}
}
steps {
Expand All @@ -294,5 +325,156 @@ pipeline {
}
}
}

stage('provisionInfrastructure'){
when {
allOf {
branch 'develop'
expression { return params.arm_regressions }
expression { return !params.regressions }
}
}
agent {label 'javaClientLinuxPool'}

steps{
script {


def deploymentResult = deployAWSInstance([
instanceName: "java-client-instance-${BUILD_NUMBER}",
region: 'us-west-2',
credentialsId: 'headlessDbUserEC2',
role: 'role-headless-testing',
roleAccount: '343869654284',
branch: params.terraformBranch
])

echo "✅ Instance deployed: ${deploymentResult.privateIp}"
echo "✅ Terraform directory: ${deploymentResult.terraformDir}"
echo "✅ Workspace: ${deploymentResult.workspace}"
echo "✅ Status: ${deploymentResult.status}"

// Store deployment info for cleanup
env.DEPLOYMENT_INSTANCE_NAME = deploymentResult.instanceName
env.DEPLOYMENT_REGION = deploymentResult.region
env.DEPLOYMENT_TERRAFORM_DIR = deploymentResult.terraformDir
env.EC2_PRIVATE_IP = deploymentResult.privateIp

def nodeName = "java-client-agent-${BUILD_NUMBER}"
def remoteFS = "/space/jenkins_home"
def labels = "java-client-agent-${BUILD_NUMBER}"
def instanceIp = env.EC2_PRIVATE_IP

// Use shared library for volume attachment
def volumeResult = attachInstanceVolumes([
instanceIp: instanceIp,
remoteFS: remoteFS,
packageFile: params.packagefile,
setupScriptPath: 'terraform-templates/arm-server-build/setup_volume.sh',
packageDir: 'terraform-templates/java-client-api',
initScriptsDir: 'terraform-templates/java-client-api/scripts',
initScriptsFile: 'terraform-templates/java-client-api/initscripts',
branch: params.terraformBranch

])

echo "✅ Volume attachment completed: ${volumeResult.volumeAttached}"
echo "✅ Java installed: ${volumeResult.javaInstalled}"
echo "✅ Dependencies installed: ${volumeResult.dependenciesInstalled}"

// Use shared library to create Jenkins agent
def agentResult = createJenkinsAgent([
nodeName: nodeName,
instanceIp: instanceIp,
remoteFS: remoteFS,
labels: labels,
timeoutMinutes: 5,
credentialsId: 'qa-builder-aws'
])

echo "✅ Jenkins agent created: ${agentResult.nodeName}"
echo "✅ Agent status: ${agentResult.status}"
}
}
}

stage('regressions-11 arm infrastructure') {
agent { label "java-client-agent-${BUILD_NUMBER}" }
when {
allOf {
branch 'develop'
expression { return params.arm_regressions }
expression { return !params.regressions }
}
}
steps {
checkout([$class: 'GitSCM',
branches: scm.branches,
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'java-client-api']],
submoduleCfg: [],
userRemoteConfigs: scm.userRemoteConfigs])

runTests("ml-docker-db-dev-tierpoint.bed-artifactory.bedford.progress.com/marklogic/marklogic-server-ubi9-arm:latest-11")
}
post {
always {
archiveArtifacts artifacts: 'java-client-api/**/build/reports/**/*.html'
junit '**/build/**/TEST*.xml'
updateWorkspacePermissions()
tearDownDocker()
}
}
}

}
}

post{
always {
script {
echo "🧹 Starting cleanup process..."

try {
// Cleanup Terraform infrastructure
if (env.EC2_PRIVATE_IP) {
echo "🗑️ Cleaning up Terraform resources..."
node('javaClientLinuxPool') {
try {
sleep 60
unstash "terraform-${BUILD_NUMBER}"
withAWS(credentials: 'headlessDbUserEC2', region: 'us-west-2', role: 'role-headless-testing', roleAccount: '343869654284', duration: 3600) {
sh '''#!/bin/bash
export PATH=/home/builder/terraform:$PATH
cd ${WORKSPACE}/${DEPLOYMENT_TERRAFORM_DIR}
terraform workspace select dev
terraform destroy -auto-approve
'''
}
echo "✅ Terraform resources destroyed successfully."
} catch (Exception terraformException) {
echo "⚠️ Warning: Terraform cleanup failed: ${terraformException.message}"
}
}
} else {
echo "ℹ️ No EC2 instance IP found, skipping Terraform cleanup"
}

// Cleanup Jenkins agent using shared library function
def nodeName = "java-client-agent-${BUILD_NUMBER}"
echo "🗑️ Cleaning up Jenkins agent: ${nodeName}"
try {
def cleanupResult = cleanupJenkinsAgent(nodeName)
echo "✅ Cleanup result: ${cleanupResult.status} for node: ${cleanupResult.nodeName}"
} catch (Exception jenkinsCleanupException) {
echo "⚠️ Warning: Jenkins agent cleanup failed: ${jenkinsCleanupException.message}"
}
echo "✅ Pipeline cleanup completed successfully."

} catch (Exception cleanupException) {
echo "⚠️ Warning: Cleanup encountered an error: ${cleanupException.message}"
echo "📋 Continuing with pipeline completion despite cleanup issues..."
}
}
}
}
}
4 changes: 2 additions & 2 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ services:

marklogic:
image: "${MARKLOGIC_IMAGE}"
platform: linux/amd64
platform: "${PLATFORM:-linux/amd64}"
environment:
- INSTALL_CONVERTERS=true
- INSTALL_CONVERTERS=${SET_CONVERTERS:-true}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use "MARKLOGIC_INSTALL_CONVERTERS" as the Docker env var name, as "set" is misleading.

- MARKLOGIC_INIT=true
- MARKLOGIC_ADMIN_USERNAME=admin
- MARKLOGIC_ADMIN_PASSWORD=admin
Expand Down