diff --git a/Jenkinsfile b/Jenkinsfile index 873147cf7..23c8ac76e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,9 @@ +def p = [:] +node { + checkout scm + p = readProperties interpolate: true, file: 'ci/pipeline.properties' +} + pipeline { agent none @@ -11,135 +17,135 @@ pipeline { } stages { - stage("Test: baseline (jdk8)") { - agent { - docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/root/.m2' - } - } + stage("Test: baseline (main)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=distribute,convergence,testing ci/test.sh" + script { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=distribute,convergence,testing ci/test.sh" + } + } } } stage("Test other configurations") { + when { + beforeAgent(true) + branch(pattern: "issue/backport|main|(\\d\\.\\d\\.x)", comparator: "REGEXP") // TODO: Drop backport + } + parallel { - stage("Test: Axiom 1.3)") { - agent { - docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/root/.m2' - } - } + stage("Test: Axiom 1.3 (main)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=axiom-1.3,convergence,testing ci/test.sh" - } - } - stage("Test: spring-buildsnapshot (jdk8)") { - agent { - docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/root/.m2' + script { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=axiom-1.3,convergence,testing ci/test.sh" + } } } + } + + stage("Test: spring-buildsnapshot (main)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=spring-buildsnapshot,convergence,testing ci/test.sh" - } - } - stage("Test: spring-security-5.6 (jdk8)") { - agent { - docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/root/.m2' + script { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=spring-buildsnapshot,convergence,testing ci/test.sh" + } } } + } + stage("Test: spring-security-5.6 (main)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=spring-security-5.6,convergence,testing ci/test.sh" - } - } - stage("Test: spring-security-5.7 (jdk8)") { - agent { - docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/root/.m2' + script { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=spring-security-5.6,convergence,testing ci/test.sh" + } } } + } + stage("Test: spring-security-5.7 (main)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=spring-security-5.7,convergence,testing ci/test.sh" - } - } - stage("Test: baseline (jdk11)") { - agent { - docker { - image 'adoptopenjdk/openjdk11:latest' - args '-v $HOME/.m2:/root/.m2' + script { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=spring-security-5.7,convergence,testing ci/test.sh" + } } } + } + stage("Test: baseline (next)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=distribute,java11,convergence,testing ci/test.sh" - } - } - stage("Test: spring-buildsnapshot (jdk11)") { - agent { - docker { - image 'adoptopenjdk/openjdk11:latest' - args '-v $HOME/.m2:/root/.m2' + script { + docker.image(p['docker.java.next.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=distribute,java11,convergence,testing ci/test.sh" + } } } + } + stage("Test: spring-buildsnapshot (next)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=spring-buildsnapshot,java11,convergence,testing ci/test.sh" - } - } - stage("Test: spring-buildsnapshot (jdk16)") { - agent { - docker { - image 'adoptopenjdk/openjdk16:latest' - args '-v $HOME/.m2:/root/.m2' + script { + docker.image(p['docker.java.next.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=spring-buildsnapshot,java11,convergence,testing ci/test.sh" + } } } + } + stage("Test: spring-buildsnapshot (LTS)") { + agent any + options { timeout(time: 30, unit: 'MINUTES')} environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { - sh "PROFILE=spring-buildsnapshot,java11,convergence,testing ci/test.sh" + script { + docker.image(p['docker.java.lts.image']).inside(p['docker.java.inside.basic']) { + sh "PROFILE=spring-buildsnapshot,java11,convergence,testing ci/test.sh" + } + } } } } } stage('Deploy') { - agent { - docker { - image 'springci/spring-ws-openjdk8-with-jq:latest' - args '-v $HOME/.m2:/tmp/jenkins-home/.m2' - } - } + agent any options { timeout(time: 20, unit: 'MINUTES') } - environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") SONATYPE = credentials('oss-login') KEYRING = credentials('spring-signing-secring.gpg') PASSPHRASE = credentials('spring-gpg-passphrase') @@ -148,52 +154,54 @@ pipeline { steps { script { - PROJECT_VERSION = sh( - script: "ci/version.sh", - returnStdout: true - ).trim() - - if (PROJECT_VERSION.matches(/.*-RC[0-9]+$/) || PROJECT_VERSION.matches(/.*-M[0-9]+$/)) { - RELEASE_TYPE = "milestone" - } else if (PROJECT_VERSION.endsWith('SNAPSHOT')) { - RELEASE_TYPE = 'snapshot' - } else if (PROJECT_VERSION.matches(/.*\.[0-9]+$/)) { - RELEASE_TYPE = 'release' - } else { - RELEASE_TYPE = 'snapshot' - } - - if (RELEASE_TYPE == 'release') { - - STAGING_REPOSITORY_ID = sh( - script: "ci/rc-open.sh", - returnStdout: true - ).readLines() - .findAll{ line -> line.contains("") && !line.contains("%s") } - .collect{ s -> s.substring(s.indexOf("") + "".length(), s.indexOf("")) } - .inject(0){ first, second -> second } // find the last entry, a.k.a. the most recent staging repository id - - sh "ci/build-and-deploy-to-maven-central.sh ${PROJECT_VERSION} ${STAGING_REPOSITORY_ID}" - sh "ci/rc-close.sh ${STAGING_REPOSITORY_ID}" - sh "ci/smoke-test-against-maven-central.sh ${PROJECT_VERSION} ${STAGING_REPOSITORY_ID}" - sh "ci/rc-release.sh ${STAGING_REPOSITORY_ID}" - - slackSend( - color: (currentBuild.currentResult == 'SUCCESS') ? 'good' : 'danger', - channel: '#spring-ws', - message: "Spring WS ${PROJECT_VERSION} is released to Maven Central!") - } else { - - sh "ci/build-and-deploy-to-artifactory.sh ${RELEASE_TYPE}" - - // TODO: Resolve smoke testing against Artifactory - // sh "ci/smoke-test-against-artifactory.sh ${PROJECT_VERSION}" - - if (RELEASE_TYPE == 'milestone') { + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + PROJECT_VERSION = sh( + script: "ci/version.sh", + returnStdout: true + ).trim() + + if (PROJECT_VERSION.matches(/.*-RC[0-9]+$/) || PROJECT_VERSION.matches(/.*-M[0-9]+$/)) { + RELEASE_TYPE = "milestone" + } else if (PROJECT_VERSION.endsWith('SNAPSHOT')) { + RELEASE_TYPE = 'snapshot' + } else if (PROJECT_VERSION.matches(/.*\.[0-9]+$/)) { + RELEASE_TYPE = 'release' + } else { + RELEASE_TYPE = 'snapshot' + } + + if (RELEASE_TYPE == 'release') { + + STAGING_REPOSITORY_ID = sh( + script: "ci/rc-open.sh", + returnStdout: true + ).readLines() + .findAll{ line -> line.contains("") && !line.contains("%s") } + .collect{ s -> s.substring(s.indexOf("") + "".length(), s.indexOf("")) } + .inject(0){ first, second -> second } // find the last entry, a.k.a. the most recent staging repository id + + sh "ci/build-and-deploy-to-maven-central.sh ${PROJECT_VERSION} ${STAGING_REPOSITORY_ID}" + sh "ci/rc-close.sh ${STAGING_REPOSITORY_ID}" + sh "ci/smoke-test-against-maven-central.sh ${PROJECT_VERSION} ${STAGING_REPOSITORY_ID}" + sh "ci/rc-release.sh ${STAGING_REPOSITORY_ID}" + slackSend( color: (currentBuild.currentResult == 'SUCCESS') ? 'good' : 'danger', channel: '#spring-ws', - message: "Spring WS ${PROJECT_VERSION} is released to Artifactory!") + message: "Spring WS ${PROJECT_VERSION} is released to Maven Central!") + } else { + + sh "ci/build-and-deploy-to-artifactory.sh ${RELEASE_TYPE}" + + // TODO: Resolve smoke testing against Artifactory + // sh "ci/smoke-test-against-artifactory.sh ${PROJECT_VERSION}" + + if (RELEASE_TYPE == 'milestone') { + slackSend( + color: (currentBuild.currentResult == 'SUCCESS') ? 'good' : 'danger', + channel: '#spring-ws', + message: "Spring WS ${PROJECT_VERSION} is released to Artifactory!") + } } } } @@ -207,26 +215,23 @@ pipeline { branch 'release-3.1.x' } } - agent { - docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/tmp/jenkins-home/.m2' - } - } + agent any options { timeout(time: 20, unit: 'MINUTES') } environment { - ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + ARTIFACTORY = credentials("${p['artifactory.credentials']}") } steps { script { - sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pdistribute,docs ' + - '-Dartifactory.server=https://repo.spring.io ' + - "-Dartifactory.username=${ARTIFACTORY_USR} " + - "-Dartifactory.password=${ARTIFACTORY_PSW} " + - "-Dartifactory.distribution-repository=temp-private-local " + - '-Dmaven.test.skip=true -Dmaven.deploy.skip=true deploy -B' + docker.image(p['docker.java.main.image']).inside(p['docker.java.inside.basic']) { + sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml -Pjakarta-ee-10,distribute,docs ' + + '-Dartifactory.server=https://repo.spring.io ' + + "-Dartifactory.username=${ARTIFACTORY_USR} " + + "-Dartifactory.password=${ARTIFACTORY_PSW} " + + "-Dartifactory.distribution-repository=temp-private-local " + + '-Dmaven.test.skip=true -Dmaven.deploy.skip=true deploy -B' + } } } } diff --git a/ci/Dockerfile b/ci/Dockerfile deleted file mode 100644 index 6f084e3c0..000000000 --- a/ci/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM adoptopenjdk/openjdk8:latest - -RUN apt-get update && apt-get install -y jq gpg - -RUN apt-get clean \ - && rm -rf /var/lib/apt/lists/* diff --git a/ci/pipeline.properties b/ci/pipeline.properties new file mode 100644 index 000000000..8063fe977 --- /dev/null +++ b/ci/pipeline.properties @@ -0,0 +1,15 @@ +# Java versions +java.main.tag=8u362-b09-jdk-focal +java.next.tag=11.0.18_10-jdk-focal +java.lts.tag=17.0.6_10-jdk-focal + +# Docker container images - standard +docker.java.main.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.main.tag} +docker.java.next.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.next.tag} +docker.java.lts.image=harbor-repo.vmware.com/dockerhub-proxy-cache/library/eclipse-temurin:${java.lts.tag} + +# Docker environment settings +docker.java.inside.basic=-v $HOME:/tmp/jenkins-home + +# Credentials +artifactory.credentials=02bd1690-b54f-4c9f-819d-a77cb7a9822c diff --git a/ci/test.sh b/ci/test.sh index 121aaa3a6..2df068275 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -2,5 +2,9 @@ set -euo pipefail +mkdir -p /tmp/jenkins-home/.m2/spring-ws +chown -R 1001:1001 . + MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" \ - ./mvnw -s settings.xml -P${PROFILE} clean dependency:list test -Dsort -B + ./mvnw -s settings.xml \ + -P${PROFILE} clean dependency:list test -Dsort -B -Dmaven.repo.local=/tmp/jenkins-home/.m2/spring-ws