|  | #!/usr/bin/env groovy | 
|  |  | 
|  | node { | 
|  |  | 
|  | def   MVN_HOME='/opt/tools/apache-maven/latest' | 
|  | def   HELP_PLUGIN='org.apache.maven.plugins:maven-help-plugin:2.1.1' | 
|  | def   TARGET = 'deploy' | 
|  | def   RELEASE_VERSION=RELEASE_VERSION | 
|  | def   NEXT_VERSION=NEXT_VERSION | 
|  | def   RELEASE_TAG='' | 
|  | def   OVERWRITE=OVERWRITE | 
|  | def   PROJECT_NAME='Jersey' | 
|  | def   LOGIN='jersey-bot' | 
|  | def   EMAIL = 'jersey-bot@eclipse.org' | 
|  | def   REPO='git@github.com:eclipse-ee4j/jersey.git' | 
|  | def   SECRET_FILE_ID='6474d9ed-eadc-47a0-8f60-43277c1cad52' | 
|  | def   SECURITY_FILE_ID='8e6103e6-a03e-44fe-bd9a-a4ed070d9b56' | 
|  | def   CONFIG_FILE_ID='c88e58d9-97bd-4f06-af82-fd469abcedea' | 
|  | def   CREDENTIALS_ID='f5848e71-9994-45e3-8214-137ce91ddbcf' | 
|  | def   GIT_ORIGIN='origin' | 
|  | def   RELEASE_FOLDER='.' | 
|  | def   RELEASE_BRANCH=BRANCH | 
|  |  | 
|  | env.JAVA_HOME="/opt/tools/java/oracle/jdk-8/1.8.0_181" | 
|  | env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" | 
|  | sh '/opt/tools/java/oracle/jdk-8/1.8.0_181/bin/java -version' | 
|  | sh 'java -version' | 
|  |  | 
|  | stage('Fetch from git') { | 
|  | git(branch: RELEASE_BRANCH, credentialsId: CREDENTIALS_ID, url: REPO) | 
|  | } | 
|  | stage('Prepare environment') { | 
|  |  | 
|  | dir (RELEASE_FOLDER) { | 
|  | //# Check whether top level pom.xml contains SNAPSHOT version | 
|  | if (!sh(returnStdout: true, script: "grep '<version>' pom.xml | grep 'SNAPSHOT'")?.trim()) { | 
|  | error('-[ Missing SNAPSHOT version in POM! ]-------------------------------------------') | 
|  | } | 
|  |  | 
|  | //# Compute release versions | 
|  | def SNAPSHOT_VERSION = sh(returnStdout: true, script: "${MVN_HOME}/bin/mvn -B ${HELP_PLUGIN}:evaluate -Dexpression=project.version 2> /dev/null | grep -E '^[0-9]+(.[0-9]+)+-SNAPSHOT\$'").trim() | 
|  |  | 
|  | if (!RELEASE_VERSION?.trim()) { | 
|  | if (!SNAPSHOT_VERSION?.trim()) { | 
|  | error('-[ Missing required snapshot version number! ]----------------------------------') | 
|  | } else { | 
|  | def versionTokens = SNAPSHOT_VERSION.split('-') | 
|  | RELEASE_VERSION = versionTokens[0] | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!NEXT_VERSION?.trim()) { | 
|  | def (MAJOR_VERSION, MINOR_VERSION) = RELEASE_VERSION.tokenize('.') | 
|  | def NEXT_MINOR_VERSION = (MINOR_VERSION as Integer) + 1 | 
|  | NEXT_VERSION = MAJOR_VERSION + '.' + NEXT_MINOR_VERSION + '-SNAPSHOT' | 
|  | } | 
|  |  | 
|  | RELEASE_TAG = RELEASE_VERSION + '-RELEASE' | 
|  |  | 
|  | echo "Current version: ${SNAPSHOT_VERSION}" | 
|  | echo "Release version: ${RELEASE_VERSION}" | 
|  | echo "Next version:    ${NEXT_VERSION}" | 
|  | echo "Release tag:     ${RELEASE_TAG}" | 
|  |  | 
|  | if (!SNAPSHOT_VERSION?.trim() || !RELEASE_VERSION?.trim() || !NEXT_VERSION?.trim()) { | 
|  | error '-[ Missing required version numbers! ]------------------------------------------' | 
|  | } | 
|  |  | 
|  | if (DRY_RUN == 'true') { | 
|  | echo '-[ Dry run turned on ]----------------------------------------------------------' | 
|  | TARGET = 'install' | 
|  | } | 
|  | echo '-[ Configure git user ]--------------------------------------------------------' | 
|  | sh "git config --local user.email \"${EMAIL}\"" | 
|  | sh "git config --local user.name \"$LOGIN\"" | 
|  |  | 
|  | } | 
|  |  | 
|  | } | 
|  | stage ('Prepare GPG') { | 
|  | withCredentials([file(credentialsId: SECRET_FILE_ID, variable: 'KEYRING')]) { | 
|  | //# Workaround: GPG initialization | 
|  | sh("gpg --batch --import ${KEYRING}") | 
|  | sh ''' | 
|  | for fpr in $(gpg --list-keys --with-colons  | awk -F: '/fpr:/ {print $10}' | sort -u); | 
|  | do | 
|  | echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key $fpr trust; | 
|  | done | 
|  | ''' | 
|  | } | 
|  | } | 
|  | stage ('Prepare branch') { | 
|  | echo '-[ Prepare branch ]-------------------------------------------------------------' | 
|  |  | 
|  | def BRANCH_CHECK = sh(returnStdout: true, script: "git branch -r").trim().contains(GIT_ORIGIN+'/'+RELEASE_VERSION) | 
|  |  | 
|  | if (BRANCH_CHECK) { | 
|  | if ( OVERWRITE == 'true' ) { | 
|  | echo "${GIT_ORIGIN}/${RELEASE_VERSION} branch already exists, deleting" | 
|  | sshagent([CREDENTIALS_ID]) { | 
|  | sh "git push ${GIT_ORIGIN} :${RELEASE_VERSION} && true" | 
|  | } | 
|  | } else { | 
|  | error "${GIT_ORIGIN}/${RELEASE_VERSION} branch already exists" | 
|  | } | 
|  | } | 
|  | echo '-[ Swiching to release branch ]-------------------------------------------------' | 
|  | sh """ | 
|  | git checkout ${GIT_ORIGIN}/${RELEASE_BRANCH} && true | 
|  | git reset --hard ${GIT_ORIGIN}/${RELEASE_BRANCH} && true | 
|  | # Always delete local branch if exists | 
|  | git branch --delete ${RELEASE_VERSION} && true | 
|  | git checkout -b ${RELEASE_VERSION} | 
|  | """ | 
|  | echo '-[ Release tag cleanup ]--------------------------------------------------------' | 
|  | def TAG_CHECK = sh(returnStdout: true, script: "git tag").trim().contains(RELEASE_TAG) | 
|  | if (TAG_CHECK) { | 
|  | if (OVERWRITE == 'true' ) { | 
|  | echo "${RELEASE_TAG} tag already exists, deleting" | 
|  | sshagent([CREDENTIALS_ID]) { | 
|  | sh "git push --delete origin ${RELEASE_TAG} && true" | 
|  | } | 
|  | } else { | 
|  | error "${RELEASE_TAG} tag already exists" | 
|  | } | 
|  | //# Always delete local tag if exists | 
|  | sh """ | 
|  | git tag --delete ${RELEASE_TAG} && true | 
|  | """ | 
|  | } | 
|  |  | 
|  | } | 
|  | stage("Build ${PROJECT_NAME}") { | 
|  | echo env.JAVA_HOME | 
|  | echo '-[ Run maven release ]---------------------------------------------------------' | 
|  | echo '-[ Set Release version ]-------------------------------------------------------' | 
|  | sh """ | 
|  | cd ${RELEASE_FOLDER} | 
|  | ${MVN_HOME}/bin/mvn -q versions:set -DnewVersion=${RELEASE_VERSION} | 
|  | ${MVN_HOME}/bin/mvn -q versions:commit | 
|  | """ | 
|  | echo '-[ Run release build ]---------------------------------------------------------' | 
|  | dir (RELEASE_FOLDER) { | 
|  | configFileProvider([configFile(fileId: SECURITY_FILE_ID, targetLocation: '/home/jenkins/.m2/')]) { | 
|  |  | 
|  | configFileProvider([configFile(fileId: CONFIG_FILE_ID, variable: 'MAVEN_SETTINGS_XML')]) { | 
|  | sh "${MVN_HOME}/bin/mvn -q -B -s ${MAVEN_SETTINGS_XML} -DskipTests -Ddoclint=none -Dadditionalparam='-Xdoclint:none' " + | 
|  | " -U -C clean package source:jar javadoc:jar ${TARGET}" | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | stage ('Prepare release') { | 
|  | echo '-[ Perform release commit to git ]---------------------------------------------' | 
|  | sh "git commit -a -m ${RELEASE_VERSION}" | 
|  | sh "git tag -m ${RELEASE_TAG} -a ${RELEASE_TAG}" | 
|  | echo '-[ Set next snapshot version ]-------------------------------------------------' | 
|  | dir (RELEASE_FOLDER) { | 
|  | sh "${MVN_HOME}/bin/mvn -q versions:set -DnewVersion=${NEXT_VERSION}" | 
|  | sh "${MVN_HOME}/bin/mvn -q versions:commit" | 
|  | } | 
|  | echo '-[ Perform commit to git ]-----------------------------------------------------' | 
|  | sh "git commit -a -m ${NEXT_VERSION}" | 
|  | } | 
|  | stage('Publish release') { | 
|  | if (DRY_RUN == 'true') { | 
|  | echo '-[ Prepared branch ]----------------------------------------------------------' | 
|  | sh "git branch --list ${RELEASE_VERSION}" | 
|  | echo '-[ Prepared tag ]-------------------------------------------------------------' | 
|  | sh "git tag --list ${RELEASE_TAG}" | 
|  | echo '-[ Prepared commits ]---------------------------------------------------------' | 
|  | sh 'git log -n 5' | 
|  | sshagent([CREDENTIALS_ID]) { | 
|  | sh "git push ${GIT_ORIGIN} ${RELEASE_VERSION} --dry-run" | 
|  | } | 
|  | return | 
|  | } else { | 
|  | sshagent([CREDENTIALS_ID]) { | 
|  | sh "git push ${GIT_ORIGIN} ${RELEASE_VERSION} --follow-tags" | 
|  | } | 
|  | } | 
|  | } | 
|  | } |