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) }