Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Auto-increment release version Jenkins

I have an application that builds in Jenkins and that I want to deploy to Octopus. When I am doing this I have to create a release version that is send to Octopus. For this release version I have to give a number (ex: "C:\Octopus\Octo.exe" create-release --project APP --version 4.8 --packageversion=4.8)

How can I make so that version number will be auto-incremented ? (ex: I have build the application and created in Octopus the release version number 4.8, the next time I build the application I want to create the release version number 4.9)

Thank you

like image 600
Sebastian Avatar asked Jun 08 '16 11:06

Sebastian


People also ask

How do I create a release version of Jenkins?

On the job configuration page, enable the release build configuration under the Build Wrapper heading and add your required release version template string, release parameters, pre and post build steps that you need to complete a release.

What is semantic versioning Jenkins?

The SemanticVersioning plugin for Jenkins is a plugin that reads the base version (Major, Minor, SNAPSHOT) settings from various build definition file formats. The plugin currently supports POM and SBT (Build. scala).


2 Answers

If you are doing deployments from a git repo, you are probably already creating tags for each release (or you should at least, so that you can more easily track what was deployed). If that's the case, you can just derive the next release version from those tags, without having to store the version anywhere else (just make sure Jenkins is fetching tags in advanced clone behaviours).

Then, you can calculate the next version with something like this:

def nextVersionFromGit(scope) {
    def latestVersion = sh(returnStdout: true, script: 'git describe --tags --abbrev=0 --match *.*.* 2> /dev/null || echo 0.0.0').trim()
    def (major, minor, patch) = latestVersion.tokenize('.').collect { it.toInteger() }
    def nextVersion
    switch (scope) {
        case 'major':
            nextVersion = "${major + 1}.0.0"
            break
        case 'minor':
            nextVersion = "${major}.${minor + 1}.0"
            break
        case 'patch':
            nextVersion = "${major}.${minor}.${patch + 1}"
            break
    }
    nextVersion
}

This method uses Semantic Versioning format, but it can be easily adapted if you want versions with only 2 numbers.

like image 94
Helder Pereira Avatar answered Sep 19 '22 22:09

Helder Pereira


You can use a job property to store the version, and then update it on each run with the following script (executed by "Execute system groovy script" build step):

import jenkins.model.Jenkins
import hudson.model.*

def jenkins = Jenkins.getInstance()
def jobName = "yourJobName"
String versionType = "minor"
def job = jenkins.getItem(jobName)

//get the current version parameter and update its default value
paramsDef = job.getProperty(ParametersDefinitionProperty.class)
if (paramsDef) {
   paramsDef.parameterDefinitions.each{
       if("version".equals(it.name)){
           println "Current version is ${it.defaultValue}"
           it.defaultValue = getUpdatedVersion(versionType, it.defaultValue)
           println "Next version is ${it.defaultValue}"
       }
   }
}

//determine the next version by the required type 
//and incrementing the current version

def getUpdatedVersion(String versionType, String currentVersion){

    def split = currentVersion.split('\\.')
    switch (versionType){
        case "minor.minor":
            split[2]=++Integer.parseInt(split[2])
            break
        case "minor":
            split[1]=++Integer.parseInt(split[1])
            break;
        case "major":
           split[0]=++Integer.parseInt(split[0])
           break;
    }
    return split.join('.')
}
like image 23
Tidhar Klein Orbach Avatar answered Sep 18 '22 22:09

Tidhar Klein Orbach