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