| /* |
| * 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 = '17' |
| def buildMvn = '3.8.x' |
| def runITsOses = ['linux'] |
| def runITsJdks = ['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) |
| 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() |
| def ITS_BRANCH = env.CHANGE_BRANCH != null ? env.CHANGE_BRANCH : env.BRANCH_NAME; |
| try { |
| echo "Checkout ITs from branch: ${ITS_BRANCH}" |
| checkout([$class: 'GitSCM', |
| branches: [[name: ITS_BRANCH]], |
| extensions: [[$class: 'CloneOption', depth: 1, noTags: true, shallow: true]], |
| userRemoteConfigs: [[url: 'https://github.com/apache/maven-integration-testing.git']]]) |
| } catch (Throwable e) { |
| echo "Failure checkout ITs branch: ${ITS_BRANCH} - fallback master branch" |
| 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) |
| } |
| } |
| } |