From 236a140fa398866708785f852f3d7f872c9c21b5 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Tue, 5 Jan 2021 13:54:29 -0600 Subject: [PATCH] Release to sonatype. Official releases now go directly to sonatype and stop depending upon bintray. --- Jenkinsfile | 110 +++------- ci/Dockerfile | 2 +- ci/build-and-deploy-to-artifactory.sh | 11 + ci/build-and-deploy-to-maven-central.sh | 25 +++ ci/build.sh | 5 - ci/promote-to-bintray.sh | 42 ---- ci/sync-to-maven-central.sh | 23 --- ci/test.sh | 5 +- pom.xml | 258 +++++++++++++++++------- settings.xml | 11 +- src/docs/resources/assemblies/docs.xml | 40 ++++ 11 files changed, 300 insertions(+), 232 deletions(-) create mode 100755 ci/build-and-deploy-to-artifactory.sh create mode 100755 ci/build-and-deploy-to-maven-central.sh delete mode 100755 ci/build.sh delete mode 100755 ci/promote-to-bintray.sh delete mode 100755 ci/sync-to-maven-central.sh create mode 100644 src/docs/resources/assemblies/docs.xml diff --git a/Jenkinsfile b/Jenkinsfile index 283a731..e823eef 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,7 +29,7 @@ pipeline { agent { docker { image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } steps { @@ -42,7 +42,7 @@ pipeline { agent { docker { image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } steps { @@ -53,7 +53,7 @@ pipeline { agent { docker { image 'adoptopenjdk/openjdk11:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } steps { @@ -64,7 +64,7 @@ pipeline { agent { docker { image 'adoptopenjdk/openjdk11:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } steps { @@ -75,7 +75,7 @@ pipeline { agent { docker { image 'adoptopenjdk/openjdk13:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } steps { @@ -86,7 +86,7 @@ pipeline { agent { docker { image 'adoptopenjdk/openjdk13:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } steps { @@ -95,25 +95,30 @@ pipeline { } } } - stage('Deploy to Artifactory') { + stage('Deploy') { agent { docker { - image 'adoptopenjdk/openjdk8:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + image 'springci/spring-session-data-mongodb-openjdk8-with-jq:latest' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } + options { timeout(time: 20, unit: 'MINUTES') } environment { ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') + SONATYPE = credentials('oss-token') + KEYRING = credentials('spring-signing-secring.gpg') + PASSPHRASE = credentials('spring-gpg-passphrase') } steps { script { // Warm up this plugin quietly before using it. - sh "./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version" + sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version' + // Extract project's version number PROJECT_VERSION = sh( - script: "./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO", + script: 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO', returnStdout: true ).trim() @@ -127,34 +132,28 @@ pipeline { RELEASE_TYPE = 'release' } - OUTPUT = sh( - script: "PROFILE=distribute,docs,${RELEASE_TYPE} ci/build.sh", - returnStdout: true - ).trim() - - echo "$OUTPUT" - - build_info_path = OUTPUT.split('\n') - .find { it.contains('Artifactory Build Info Recorder') } - .split('Saving Build Info to ')[1] - .trim()[1..-2] - - dir(build_info_path + '/..') { - stash name: 'build_info', includes: "*.json" + if (RELEASE_TYPE == 'release') { + sh "PROFILE=distribute,central USERNAME=${SONATYPE_USR} PASSWORD=${SONATYPE_PSW} ci/build-and-deploy-to-maven-central.sh ${PROJECT_VERSION}" + } else { + sh "PROFILE=distribute,${RELEASE_TYPE} ci/build-and-deploy-to-artifactory.sh" } } } } - stage('Promote to Bintray') { + stage('Release documentation') { when { - branch 'release' + anyOf { + branch 'main' + branch 'release' + } } agent { docker { image 'springci/spring-session-data-mongodb-openjdk8-with-jq:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' + args '-v $HOME/.m2:/tmp/jenkins-home/.m2' } } + options { timeout(time: 20, unit: 'MINUTES') } environment { ARTIFACTORY = credentials('02bd1690-b54f-4c9f-819d-a77cb7a9822c') @@ -162,55 +161,12 @@ pipeline { steps { script { - // Warm up this plugin quietly before using it. - sh "./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version" - - PROJECT_VERSION = sh( - script: "./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO", - returnStdout: true - ).trim() - - if (PROJECT_VERSION.matches(/.*\.[0-9]+$/)) { - unstash name: 'build_info' - sh "ci/promote-to-bintray.sh" - } else { - echo "${PROJECT_VERSION} is not a candidate for promotion to Bintray." - } - } - } - } - stage('Sync to Maven Central') { - when { - branch 'release' - } - agent { - docker { - image 'springci/spring-session-data-mongodb-openjdk8-with-jq:latest' - args '-v $HOME/.m2:/tmp/spring-session-maven-repository/.m2' - } - } - - environment { - BINTRAY = credentials('Bintray-spring-operator') - SONATYPE = credentials('oss-token') - } - - steps { - script { - // Warm up this plugin quietly before using it. - sh "./mvnw -q org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version" - - PROJECT_VERSION = sh( - script: "./mvnw org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -o | grep -v INFO", - returnStdout: true - ).trim() - - if (PROJECT_VERSION.matches(/.*\.[0-9]+$/)) { - unstash name: 'build_info' - sh "ci/sync-to-maven-central.sh" - } else { - echo "${PROJECT_VERSION} is not a candidate for syncing to Maven Central." - } + sh 'MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw -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' } } } diff --git a/ci/Dockerfile b/ci/Dockerfile index b05019d..6f084e3 100644 --- a/ci/Dockerfile +++ b/ci/Dockerfile @@ -1,6 +1,6 @@ FROM adoptopenjdk/openjdk8:latest -RUN apt-get update && apt-get install -y jq +RUN apt-get update && apt-get install -y jq gpg RUN apt-get clean \ && rm -rf /var/lib/apt/lists/* diff --git a/ci/build-and-deploy-to-artifactory.sh b/ci/build-and-deploy-to-artifactory.sh new file mode 100755 index 0000000..80e30e0 --- /dev/null +++ b/ci/build-and-deploy-to-artifactory.sh @@ -0,0 +1,11 @@ +#!/bin/bash -x + +set -euo pipefail + +# +# Deploy the artifactory +# +echo 'Deploying to Artifactory...' + +MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" \ + ./mvnw -P${PROFILE} -Dmaven.test.skip=true clean deploy -B diff --git a/ci/build-and-deploy-to-maven-central.sh b/ci/build-and-deploy-to-maven-central.sh new file mode 100755 index 0000000..d4f8b48 --- /dev/null +++ b/ci/build-and-deploy-to-maven-central.sh @@ -0,0 +1,25 @@ +#!/bin/bash -x + +set -euo pipefail + +PROJECT_VERSION=$1 + +# +# Stage on Maven Central +# +echo 'Staging on Maven Central...' + +GNUPGHOME=/tmp/gpghome +export GNUPGHOME + +mkdir $GNUPGHOME +cp $KEYRING $GNUPGHOME + +MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" ./mvnw \ + -s settings.xml \ + -P${PROFILE} \ + -Dmaven.test.skip=true \ + -Dgpg.passphrase=${PASSPHRASE} \ + -Dgpg.secretKeyring=${GNUPGHOME}/secring.gpg \ + -DstagingDescription="Releasing ${PROJECT_VERSION}" \ + clean deploy -B \ No newline at end of file diff --git a/ci/build.sh b/ci/build.sh deleted file mode 100755 index 3a3c506..0000000 --- a/ci/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/spring-session-maven-repository" ./mvnw -P${PROFILE} -Dmaven.test.skip=true clean deploy -B diff --git a/ci/promote-to-bintray.sh b/ci/promote-to-bintray.sh deleted file mode 100755 index a00bb8d..0000000 --- a/ci/promote-to-bintray.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -set -e -u - -buildName=`jq -r '.name' build-info.json` -buildNumber=`jq -r '.number' build-info.json` -groupId=`jq -r '.modules[0].id' build-info.json | sed 's/\(.*\):.*:.*/\1/'` -version=`jq -r '.modules[0].id' build-info.json | sed 's/.*:.*:\(.*\)/\1/'` - -echo "Promoting ${buildName}/${buildNumber}/${groupId}/${version} to libs-release-local" - -curl \ - -s \ - --connect-timeout 240 \ - --max-time 2700 \ - -u ${ARTIFACTORY_USR}:${ARTIFACTORY_PSW} \ - -H 'Content-type:application/json' \ - -d '{"sourceRepos": ["libs-release-local"], "targetRepo" : "spring-distributions", "async":"true"}' \ - -f \ - -X \ - POST "https://repo.spring.io/api/build/distribute/${buildName}/${buildNumber}" > /dev/null || { echo "Failed to distribute" >&2; exit 1; } - -echo "Waiting for artifacts to be published" - -ARTIFACTS_PUBLISHED=false -WAIT_TIME=10 -COUNTER=0 - -while [ $ARTIFACTS_PUBLISHED == "false" ] && [ $COUNTER -lt 120 ]; do - - result=$( curl -s https://api.bintray.com/packages/spring/jars/"${groupId}" ) - versions=$( echo "$result" | jq -r '.versions' ) - exists=$( echo "$versions" | grep "$version" -o || true ) - - if [ "$exists" = "$version" ]; then - ARTIFACTS_PUBLISHED=true - fi - - COUNTER=$(( COUNTER + 1 )) - sleep $WAIT_TIME - -done diff --git a/ci/sync-to-maven-central.sh b/ci/sync-to-maven-central.sh deleted file mode 100755 index a2d47e8..0000000 --- a/ci/sync-to-maven-central.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e -u - -buildName=`jq -r '.name' build-info.json` -buildNumber=`jq -r '.number' build-info.json` -groupId=`jq -r '.modules[0].id' build-info.json | sed 's/\(.*\):.*:.*/\1/'` -version=`jq -r '.modules[0].id' build-info.json | sed 's/.*:.*:\(.*\)/\1/'` - -echo "Synching ${buildName}/${buildNumber}/${groupId}/${version} to Maven Central..." - -curl \ - -s \ - --connect-timeout 240 \ - --max-time 2700 \ - -u ${BINTRAY_USR}:${BINTRAY_PSW} \ - -H 'Content-Type: application/json' \ - -d "{ \"username\": \"${SONATYPE_USR}\", \"password\": \"${SONATYPE_PSW}\"}" \ - -f \ - -X \ - POST "https://api.bintray.com/maven_central_sync/spring/jars/${groupId}/versions/${version}" > /dev/null || { echo "Failed to sync" >&2; exit 1; } - -echo "Sync complete" diff --git a/ci/test.sh b/ci/test.sh index 5910782..c2bb677 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -1,5 +1,6 @@ -#!/bin/bash +#!/bin/bash -x set -euo pipefail -MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/spring-session-maven-repository" ./mvnw -P${PROFILE} clean dependency:list test -Dsort -U -B +MAVEN_OPTS="-Duser.name=jenkins -Duser.home=/tmp/jenkins-home" \ + ./mvnw -P${PROFILE} clean dependency:list test -Dsort -U -B diff --git a/pom.xml b/pom.xml index 850ff29..4b175a7 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,7 @@ 5.6.2 2.28.2 4.1.1 + spring.session.data.mongodb 2020.0.0 5.3.0 2020.0.0 @@ -147,6 +148,11 @@ ${project.build.directory}/generated-asciidoc-sources/source/ ${project.build.directory}/generated-docs + true + true + true + true + true @@ -182,6 +188,32 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + + -Xdoclint:none + + + + aggregate-javadoc + + aggregate + + package + + ${project.root}/target/site/apidocs + + + + attach-javadocs + + jar + + + + + org.apache.maven.plugins maven-source-plugin @@ -196,21 +228,6 @@ - - maven-javadoc-plugin - - -Xdoclint:none - - - - attach-javadocs - - jar - - - - - org.apache.maven.plugins maven-antrun-plugin @@ -314,6 +331,7 @@ + org.asciidoctor asciidoctor-maven-plugin @@ -388,6 +406,7 @@ + maven-javadoc-plugin @@ -402,6 +421,7 @@ + org.apache.maven.plugins maven-antrun-plugin @@ -448,29 +468,72 @@ + + + - org.codehaus.mojo - build-helper-maven-plugin - 1.10 + org.apache.maven.plugins + maven-assembly-plugin - attach-zip + docs - attach-artifact + single + package - - - - ${project.build.directory}/${project.artifactId}-${project.version}.zip - - zip;zip.type=docs;zip.deployed=false - - + + src/docs/resources/assemblies/docs.xml + + spring-session-data-mongodb-${project.version} + true + + + + org.jfrog.buildinfo + artifactory-maven-plugin + 2.6.1 + + + deploy-docs + + publish + + deploy + + + false + + + spring-session-data-mongodb-docs + spring-session-data-mongodb-docs + false + docs + + + + Spring Docs spring-session-data-mongodb ${project.version} + 1 + + + {{artifactory.server}} + {{artifactory.username}} + {{artifactory.password}} + {{artifactory.distribution-repository}} + {{artifactory.distribution-repository}} + *-docs.zip + + + + + + @@ -560,47 +623,77 @@ - release - + central - - - org.jfrog.buildinfo - artifactory-maven-plugin - 2.6.1 - false - - - build-info - - publish - - - - {{BUILD_URL}} - - - spring-session-data-mongodb - spring-session-data-mongodb - false - docs - *:*:*:*@zip - - - https://repo.spring.io - {{ARTIFACTORY_USR}} - {{ARTIFACTORY_PSW}} - libs-release-local - libs-release-local - - - - - - - - + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.8 + true + + sonatype + https://oss.sonatype.org/ + true + true + false + + + + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + + + + org.sonatype.plugins + nexus-staging-maven-plugin + + + + + + + + + sonatype + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + @@ -865,16 +958,22 @@ org.apache.maven.plugins maven-jar-plugin - 2.6 + 3.0.2 - true + + + ${project.name} + ${project.version} + ${java-module-name} + + org.apache.maven.plugins maven-source-plugin - 2.4 + 3.0.1 attach-sources @@ -905,12 +1004,18 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.1 + 3.0.0-M3 false + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + @@ -919,6 +1024,11 @@ spring-plugins-release https://repo.spring.io/plugins-release + + bintray-plugins + bintray-plugins + https://jcenter.bintray.com + @@ -932,9 +1042,9 @@ - https://github.com/spring-projects/spring-session-mongodb - scm:git:git://github.com/spring-projects/spring-session-mongodb.git - scm:git:ssh://git@github.com:spring-projects/spring-session-mongodb.git + https://github.com/spring-projects/spring-session-data-mongodb + scm:git:git://github.com/spring-projects/spring-session-data-mongodb.git + scm:git:ssh://git@github.com:spring-projects/spring-session-data-mongodb.git diff --git a/settings.xml b/settings.xml index 829f33c..7368837 100644 --- a/settings.xml +++ b/settings.xml @@ -1,16 +1,11 @@ - sonatype-nexus-snapshots - ${env.USERNAME} - ${env.PASSWORD} - - - sonatype-nexus-staging + sonatype ${env.USERNAME} ${env.PASSWORD} diff --git a/src/docs/resources/assemblies/docs.xml b/src/docs/resources/assemblies/docs.xml new file mode 100644 index 0000000..7a83dcd --- /dev/null +++ b/src/docs/resources/assemblies/docs.xml @@ -0,0 +1,40 @@ + + + docs + + dir + zip + + false + + + + + + + + + + + + + + + + + target/site/reference + reference + + + + target/site/apidocs + api + + +