| #!/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" | 
 |             } | 
 |         } | 
 |     } | 
 | } |