From 72780b2320ea7f314268f6f6997199a913fb3701 Mon Sep 17 00:00:00 2001 From: CJ Hare Date: Wed, 24 Oct 2018 13:37:51 +1000 Subject: [PATCH] [NC-1628] Release Jenkins Jobs (#126) Supporting / scripting for creating a branch from a tag --- Jenkinsfile.release | 22 +++++++++++++++- Jenkinsfile.release.branch | 37 +++++++++++++++++++++++++++ branch-from-tag.sh | 51 ++++++++++++++++++++++++++++++++++++++ build.gradle | 4 +-- 4 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 Jenkinsfile.release.branch create mode 100755 branch-from-tag.sh diff --git a/Jenkinsfile.release b/Jenkinsfile.release index fe7af4be7f..aa012d398d 100644 --- a/Jenkinsfile.release +++ b/Jenkinsfile.release @@ -11,6 +11,12 @@ pipeline { agent { docker { image 'pegasyseng/pantheon-build:0.0.2' } } + parameters { + string(name: 'BRANCH_NAME', defaultValue: 'master', description: '[MANDATORY] The name of the branch to create the release from') + string(name: 'RELEASE_VERSION', defaultValue: '', description: '[OPTIONAL] When empty: defaults to the current project version') + string(name: 'NEXT_VERSION', defaultValue: '', description: '[OPTIONAL] When empty: defaults to next patch version after current project version') + } + stages { stage('Release') { steps { @@ -31,7 +37,21 @@ pipeline { 'GIT_AUTHOR_EMAIL="pegasys.manager@gmail.com"' ]) { tryAddKnownHost('github.com') - sh './gradlew release -Prelease.useAutomaticVersion=true -Prelease.releaseVersion=0.8.0-RC2 -Prelease.newVersion=0.8.0-SNAPSHOT' + + script{ + releaseVersion = '' + if( params.RELEASE_VERSION?.trim() ){ + releaseVersion = "-Prelease.releaseVersion=${params.RELEASE_VERSION}" + } + + nextVersion = '' + if( params.NEXT_VERSION?.trim() ){ + nextVersion = "-Prelease.newVersion=${params.NEXT_VERSION}" + } + } + + + sh "./gradlew release -Prelease.useAutomaticVersion=true -Prelease.branch=${params.BRANCH_NAME} ${releaseVersion} ${nextVersion}" } } } diff --git a/Jenkinsfile.release.branch b/Jenkinsfile.release.branch new file mode 100644 index 0000000000..46e6ac7363 --- /dev/null +++ b/Jenkinsfile.release.branch @@ -0,0 +1,37 @@ +void tryAddKnownHost(String hostUrl){ + // ssh-keygen -F ${hostUrl} will fail (in bash that means status code != 0) if ${hostUrl} is not yet a known host + def statusCode = sh script:"ssh-keygen -F ${hostUrl}", returnStatus:true + if(statusCode != 0){ + sh "mkdir -p ~/.ssh" + sh "ssh-keyscan ${hostUrl} >> ~/.ssh/known_hosts" + } +} + +pipeline { + agent { + docker { image 'pegasyseng/pantheon-build:0.0.2' } + } + parameters { + string(name: 'TAG_NAME', defaultValue: '', description: '[MANDATORY] Name of the Tag to create the branch from') + string(name: 'BRANCH_NAME', defaultValue: '', description: '[MANDATORY] The desired name of the new branch') + } + stages { + stage('Release') { + steps { + sshagent( + credentials: ['pegasys-admin-github-ssh-private-key'] + ) { + withEnv([ + 'GIT_COMMITTER_NAME="PegaSys Admin"', + 'GIT_COMMITTER_EMAIL="pegasys.manager@gmail.com"', + 'GIT_AUTHOR_NAME="PegaSys Admin"', + 'GIT_AUTHOR_EMAIL="pegasys.manager@gmail.com"' + ]) { + tryAddKnownHost('github.com') + sh "./branch-from-tag.sh ${params.TAG_NAME} ${params.BRANCH_NAME}" + } + } + } + } + } +} diff --git a/branch-from-tag.sh b/branch-from-tag.sh new file mode 100755 index 0000000000..8381f2e786 --- /dev/null +++ b/branch-from-tag.sh @@ -0,0 +1,51 @@ +#!/bin/sh -e + +# +# Creates a new branch from a release tag, updating the gradle.properties version number. +# +# Assumed format of the version number: major.minor.bugfix +# Assumed location of the version number: gradle.properties +# +# NOTE: Any additional markers after the bugfix (i.e. -RC2) will be lost. + +if [ -z "${1}" ] +then + echo "[ERROR] Missing required first argument of tag name" + exit 1 +fi + +if [ -z "${2}" ] +then + echo "[ERROR] Missing required second argument of branch name" + exit 1 +fi + + +tag_name=${1} +branch_name=${2} + +# Locally create a branch from the tag +git checkout -b ${branch_name} ${tag_name} + +# extract the version from gradle.properties +tag_version=$(grep "^version" gradle.properties | cut -d'=' -f2) + +# Assuming semantic naming format of major.minor.bugfix[-RC|-SNAPSHOT|-other] +major_version=$(echo ${tag_version} | cut -d'.' -f1) +minor_version=$(echo ${tag_version} | cut -d'.' -f2) +bugfix_version=$(echo ${tag_version} | cut -d'.' -f3 | cut -d'-' -f1) + +# Increment the bugfix version that goes on the new branch +branch_bugfix_version=$((${bugfix_version}+1)) + +# Reconstruct the version number for the branch +branch_version="${major_version}.${minor_version}.${branch_bugfix_version}-SNAPSHOT" + +# Change the local gradle.properties version to branch version +sed -i "s/${tag_version}/${branch_version}/g" gradle.properties + +# Update the Jenkins job default branch name +sed -i "s/defaultValue: 'master'/defaultValue: '${branch_name}'/g" Jenkinsfile.release + +git commit -am"[Release Script] Updating version to ${branch_version}" +git push --set-upstream origin ${branch_name} diff --git a/build.gradle b/build.gradle index 3e44792a68..c63791a35d 100644 --- a/build.gradle +++ b/build.gradle @@ -419,9 +419,7 @@ release { ] git { - requireBranch = 'master' - pushToRemote = 'origin' - pushToBranchPrefix = project.version.replace('SNAPSHOT','') + requireBranch = project.hasProperty('release.branch') ? project.property('release.branch') : 'master' } }