From 31aa194399b11e6cc239a0c020e18343bb8d8f0b Mon Sep 17 00:00:00 2001 From: William Petit Date: Thu, 19 Mar 2020 09:45:07 +0100 Subject: [PATCH] Add CPKG port to trigger package from Jenkins See https://forge.cadoles.com/Cadoles/cpkg --- vars/cpkg.groovy | 143 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 vars/cpkg.groovy diff --git a/vars/cpkg.groovy b/vars/cpkg.groovy new file mode 100644 index 0000000..076bc62 --- /dev/null +++ b/vars/cpkg.groovy @@ -0,0 +1,143 @@ +// Basic port of https://forge.cadoles.com/Cadoles/cpkg +def call(Map params = [:]) { + + def currentRef = sh(script: 'git rev-parse HEAD', returnStdout: true).trim() + def baseRef = params.baseRef ? params.baseRef : currentRef + def distRepo = params.distRepo ? params.distRepo : 'dev' + def dist = params.dist ? params.dist : 'eole' + def distVersion = params.distVersion ? params.distVersion : '2.7.0' + def distBranchName = params.distBranchName ? params.distBranchName : env.GIT_BRANCH + def gitCredentials = params.gitCredentials ? params.gitCredentials : null + def gitEmail = params.gitEmail ? params.gitEmail : 'jenkins@cadoles.com' + def gitUsername = params.gitUsername ? params.gitUsername : 'Jenkins' + def skipCi = params.skipCi ? params.skipCi : false + def skipPush = params.skipPush ? params.skipPush: true + + // Define dist branch based on provided informations and base branch name + def distBranch = "dist/${dist}/${distVersion}/${distBranchName}" + + def result = [:] + result['distBranch'] = distBranch + result['distVersion'] = distVersion + result['distRepo'] = distRepo + result['distBranchName'] = distBranchName + + def proc = { + // Add distBranch to fetched refs + sh("git config --add remote.origin.fetch +refs/heads/${distBranch}:refs/remotes/origin/${distBranch}") + + // Update branches + sh("git fetch --all") + + // Merge currentRef into distBranch and push + sh("git checkout -b '${distBranch}' 'origin/${distBranch}'") + sh("git merge ${currentRef}") + + if (!skipPush) { + sh("git push") + } else { + println("Skipping push. Set skipPush param to 'true' to enable remote repository update.") + } + + // Retrieve last tag matching pattern pkg/${distRepo}/${dist}-${distVersion}/* + def lastTag = sh( + script: "git tag -l 'pkg/${distRepo}/${dist}-${distVersion}/*' --sort=v:refname | tail -n 1", + returnStdout: true, + ) + + result['previousTag'] = lastTag + + println("Last tag is '${lastTag}'") + + // Extract version number from last tag + def lastVersionNumber = lastTag.split('/').last() + result['previousVersionNumber'] = lastVersionNumber + + println("Last version number is '${lastVersionNumber}'") + + def versionNumber = incrementVersionNumber(lastVersionNumber) + + println("New version number will be '${versionNumber}'") + result['newVersionNumber'] = versionNumber + + // Generate tag with incremented version number + def tag = "pkg/${distRepo}/${dist}-${distVersion}/${versionNumber}" + + result['newTag'] = tag + + def tagComment="Build ${versionNumber} ${distRepo} package for ${dist}-${distVersion}." + if (skipCi) { + tagComment += ' [ci skip]' + } + + sh("git tag -a '${tag}' -m '${tagComment}'") + + // Push tag + if (!skipPush) { + sh("git push --tags") + } else { + println("Skipping push. Set skipPush param to 'true' to enable remote repository update.") + } + + // Switch back to previous ref + sh("git checkout ${currentRef}") + } + + if (gitCredentials != null) { + withCredentials([ + usernamePassword( + credentialsId: gitCredentials, + usernameVariable: 'GIT_USERNAME', + passwordVariable: 'GIT_PASSWORD' + ) + ]) { + def randomUUID = UUID.randomUUID().toString() + def tmpAskPassScript = pwd(tmp:true) + "/${randomUUID}" + try { + node { + writeFile( + file: tmpAskPassScript, + text: ''' + #!/bin/sh + case "$1" in + Username*) echo $GIT_USERNAME ;; + Password*) echo $GIT_PASSWORD ;; + esac + ''' + ) + } + sh(script: "git config user.email '${gitEmail}'") + sh(script: "git config user.name '${gitUsername}'") + sh(script: "chmod +x '${tmpAskPassScript}'") + withEnv(["GIT_ASKPASS=${tmpAskPassScript}"]) { + proc.call() + } + } finally { + sh(script: "rm -f '${tmpAskPassScript}'") + } + + } + } else { + proc.call() + } + + return result +} + +def incrementVersionNumber(String versionNumber) { + // Split versionNumber (typical pattern: ..) + def versionNumberParts = versionNumber.split(/\./) + + // Extract path number + def patchNumber = versionNumberParts.last() + + // Split patch number (typical pattern: -) + def patchNumberParts = patchNumber.split('-') + + // If version number matches pattern ..- + if (patchNumberParts.size() > 1) { + return versionNumberParts[0..-2].join('.') + '.' + patchNumberParts[0..-2].join('-') + '-' + (patchNumberParts.last().toInteger() + 1) + } else { // Else version number matches pattern .. + return versionNumberParts[0..-2].join('.') + '.' + (patchNumber.toInteger() + 1) + } +} \ No newline at end of file