blob: 6fce5ed3deae761287fad675dc681d22f9333ec9 [file] [log] [blame]
#!/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"
}
}
}
}