From e4f68f037d3db41ce71c054fea62f79aa371d45d Mon Sep 17 00:00:00 2001 From: Vivian Kong Date: Wed, 4 Oct 2023 21:46:41 -0400 Subject: [PATCH] [MNG-7848] Add Jenkinsfile.s390x for Jenkins CI on s390x (#1266) --- Jenkinsfile.s390x | 162 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 Jenkinsfile.s390x diff --git a/Jenkinsfile.s390x b/Jenkinsfile.s390x new file mode 100644 index 0000000000..2ffa7f5dee --- /dev/null +++ b/Jenkinsfile.s390x @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +properties([buildDiscarder(logRotator(artifactNumToKeepStr: '5', numToKeepStr: env.BRANCH_NAME=='master'?'5':'1'))]) + +def buildOs = 'linux' +def buildJdk = '8' +def buildMvn = '3.8.x' +def runITsOses = ['linux'] +def runITsJdks = ['11', '17'] +def runITsMvn = '3.8.x' +def runITscommand = "mvn clean install -Prun-its,embedded -B -U -V" // -DmavenDistro=... -Dmaven.test.failure.ignore=true +def tests + +try { + +def osNode = jenkinsEnv.labelForOS(buildOs) +node('s390x') { + dir('build') { + stage('Checkout') { + checkout scm + } + + def WORK_DIR=pwd() + def MAVEN_GOAL='verify' + + stage('Build / Unit Test') { + String jdkName = jenkinsEnv.jdkFromVersion(buildOs, buildJdk) + jdkName = "ibm-semeru-8u362-b09" + String mvnName = jenkinsEnv.mvnFromVersion(buildOs, buildMvn) + try { + withEnv(["JAVA_HOME=${ tool "$jdkName" }", + "PATH+MAVEN=${ tool "$jdkName" }/bin:${tool "$mvnName"}/bin", + "MAVEN_OPTS=-Xms2g -Xmx4g -Djava.awt.headless=true"]) { + sh "mvn clean ${MAVEN_GOAL} -B -U -e -fae -V -Dmaven.test.failure.ignore -PversionlessMavenDist -Dmaven.repo.local=${WORK_DIR}/.repository" + } + } finally { + junit testResults: '**/target/surefire-reports/*.xml,**/target/failsafe-reports/*.xml', allowEmptyResults: true + } + dir ('apache-maven/target') { + stash includes: 'apache-maven-bin.zip', name: 'maven-dist-s390x' + } + } + } +} + +Map runITsTasks = [:] +for (String os in runITsOses) { + for (def jdk in runITsJdks) { + String osLabel = jenkinsEnv.labelForOS(os); + String jdkName = jenkinsEnv.jdkFromVersion(os, "${jdk}") + String mvnName = jenkinsEnv.mvnFromVersion(os, "${runITsMvn}") + echo "OS: ${os} JDK: ${jdk} => Label: ${osLabel} JDK: ${jdkName} Arch: s390x" + + String stageId = "${os}-jdk${jdk}-s390x" + String stageLabel = "Run ITs ${os.capitalize()} Java ${jdk} on s390x" + runITsTasks[stageId] = { + node('s390x') { + stage("${stageLabel}") { + echo "NODE_NAME = ${env.NODE_NAME}" + // on Windows, need a short path or we hit 256 character limit for paths + // using EXECUTOR_NUMBER guarantees that concurrent builds on same agent + // will not trample each other plus workaround for JENKINS-52657 + dir(isUnix() ? 'test' : "c:\\mvn-it-${EXECUTOR_NUMBER}.tmp") { + def WORK_DIR=pwd() + checkout([$class: 'GitSCM', + branches: [[name: "*/master"]], + extensions: [[$class: 'CloneOption', depth: 1, noTags: true, shallow: true]], + userRemoteConfigs: [[url: 'https://github.com/apache/maven-integration-testing.git']]]) + if (isUnix()) { + sh "rm -rvf $WORK_DIR/dists $WORK_DIR/it-local-repo" + } else { + bat "if exist it-local-repo rmdir /s /q it-local-repo" + bat "if exist dists rmdir /s /q dists" + } + dir('dists') { + unstash 'maven-dist-s390x' + } + try { + withEnv(["JAVA_HOME=${ tool "$jdkName" }", + "PATH+MAVEN=${ tool "$jdkName" }/bin:${tool "$mvnName"}/bin", + "MAVEN_OPTS=-Xms2g -Xmx4g -Djava.awt.headless=true"]) { + String cmd = "${runITscommand} -Dmaven.repo.local=$WORK_DIR/it-local-repo -DmavenDistro=$WORK_DIR/dists/apache-maven-bin.zip -Dmaven.test.failure.ignore" + + if (isUnix()) { + sh 'df -hT' + sh "${cmd}" + } else { + bat 'wmic logicaldisk get size,freespace,caption' + bat "${cmd}" + } + } + } finally { + // in ITs test we need only reports from test itself + // test projects can contain reports with tested failed builds + junit testResults: '**/core-it-suite/target/surefire-reports/*.xml,**/core-it-support/**/target/surefire-reports/*.xml', allowEmptyResults: true + archiveDirs(stageId, ['core-it-suite-logs':'core-it-suite/target/test-classes', + 'core-it-suite-reports':'core-it-suite/target/surefire-reports']) + deleteDir() // clean up after ourselves to reduce disk space + } + } + } + } + } + } +} + +// run the parallel ITs +parallel(runITsTasks) + +// JENKINS-34376 seems to make it hard to detect the aborted builds +} catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) { + echo "[FAILURE-002] FlowInterruptedException ${e}" + // this ambiguous condition means a user probably aborted + if (e.causes.size() == 0) { + currentBuild.result = "ABORTED" + } else { + currentBuild.result = "FAILURE" + } + throw e +} catch (hudson.AbortException e) { + echo "[FAILURE-003] AbortException ${e}" + // this ambiguous condition means during a shell step, user probably aborted + if (e.getMessage().contains('script returned exit code 143')) { + currentBuild.result = "ABORTED" + } else { + currentBuild.result = "FAILURE" + } + throw e +} catch (InterruptedException e) { + echo "[FAILURE-004] ${e}" + currentBuild.result = "ABORTED" + throw e +} catch (Throwable e) { + echo "[FAILURE-001] ${e}" + currentBuild.result = "FAILURE" + throw e +} + +def archiveDirs(stageId, archives) { + archives.each { archivePrefix, pathToContent -> + if (fileExists(pathToContent)) { + zip(zipFile: "${archivePrefix}-${stageId}.zip", dir: pathToContent, archive: true) + } + } +}