Jenkins/vars/cpkg.groovy

139 lines
4.7 KiB
Groovy

import java.util.regex.Matcher
// 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 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 gitCredentialsType = params.gitCredentialsType ? params.gitCredentialsType : 'http'
def gitEmail = params.gitEmail ? params.gitEmail : 'jenkins@cadoles.com'
def gitUsername = params.gitUsername ? params.gitUsername : 'Jenkins'
def skipCi = params.containsKey('skipCi') ? params.skipCi : false
def skipPush = params.containsKey('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}'")
// Add git username/email
sh("git config user.email '${gitEmail}'")
sh("git config user.username '${gitUsername}'")
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.trim()
println("Last tag is '${result['previousTag']}'")
// Extract version number from last tag
def lastVersionNumber = lastTag.split('/').last().trim()
result['previousVersionNumber'] = lastVersionNumber
println("Last version number is '${lastVersionNumber}'")
String versionRoot = extractVersionRoot(lastVersionNumber)
String versionNumber = ''
if (versionRoot) {
versionNumber = versionRoot
} else {
versionNumber = sh(
script: "git describe --always ${currentRef}",
returnStdout: true,
).split('/').last().trim()
Boolean isCommitRef = !versionNumber.matches(/^[0-9]+\.[0-9]+\.[0-9]+.*$/)
if (isCommitRef) {
versionNumber = "0.0.0-${versionNumber}"
}
}
versionNumber = "${versionNumber}-${env.BUILD_NUMBER}"
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 -f -a '${tag}' -m '${tagComment}'")
// Push tag
if (!skipPush) {
sh('git push --tags -f')
} 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) {
if (gitCredentialsType == 'http') {
git.withHTTPCredentials(gitCredentials) {
proc.call()
}
} else if (gitCredentialsType == 'ssh') {
git.withSSHCredentials(gitCredentials) {
proc.call()
}
} else {
throw new Exception("Unknown git credentials type '${gitCredentialsType}' ! Expected 'ssh' or 'http' (default).")
}
} else {
proc.call()
}
return result
}
@NonCPS
String extractVersionRoot(String fullVersion) {
Matcher fullVersionMatcher = fullVersion =~ /^([0-9]+\.[0-9]+\.[0-9]+).*$/
if (!fullVersionMatcher.matches()) {
return ""
}
return fullVersionMatcher.group(1)
}