自动增量发布版本 Jenkins

16

我有一个在Jenkins中构建的应用程序,想要将其部署到Octopus。在进行此操作时,我必须创建一个发布版本并发送到Octopus。对于这个发布版本,我必须给出一个编号(例如:"C:\Octopus\Octo.exe" create-release --project APP --version 4.8 --packageversion=4.8

如何使版本号自动递增?(例如:我已经构建了应用程序并在Octopus中创建了发布版本号4.8,下一次构建应用程序时,我希望创建发布版本号4.9)

谢谢


Jenkins是一个CI工具。管理版本号是构建管理工具的任务。在您的情况下,我看不到其他解决方案,只能使用手工流程。 - Gerold Broser
@GeroldBroser,你能否给我一个例子,告诉我如何实现这个?谢谢。 - Sebastian
请查看GROM - 通用发布顺序管理。一旦它被修订,我将在这里发布包括Jenkins的答案。 - Gerold Broser
Jenkins具有自动递增的BUILD_NUMBER。您能否传递像“--version 4.${BUILD_NUMBER}”这样的东西? - Jayan
5个回答

20

您可以使用作业属性来存储版本,然后使用以下脚本在每次运行时进行更新(由“执行系统Groovy脚本”构建步骤执行):

您可以使用作业属性来存储版本,并使用以下脚本在每次运行时进行更新(由“执行系统Groovy脚本”构建步骤执行):

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('.')
}

至少在我的Jenkins版本中,此代码不会更新作业的config.xml文件,因此在重新启动后,此递增数字可能会丢失。更新值后,您需要在脚本中添加一行job.save()以将更改保存到文件系统中。 - ItsComcastic
2
这个方法对于 getUpdatedVersion('minor', '0.1.13') 返回了 0.2.13。我期望它应该是 0.2.0。此外,对于不是变量的东西使用 ++ 看起来像是一个非常糟糕的做法。 - Helder Pereira

16

如果你从git库进行部署,那么你可能已经为每个版本创建了标签(或者至少应该这样做,以便更轻松地跟踪已部署的内容)。如果是这种情况,那么你可以直接从这些标签中派生出下一个版本的发布版本,而无需在其他地方存储版本信息(只需确保Jenkins在克隆高级行为中获取标签)。

然后,你可以使用类似于以下的方法计算下一个版本号:

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
}

这种方法使用语义化版本号格式,但如果你想要只有两个数字的版本号,它可以很容易地进行调整。


在Groovy中,如果只有主版本号和次版本号,是否有一种方法可以将补丁版本号默认设置为0? - undefined

9

Jenkins为每个构建命令提供了一些环境变量,其中之一是构建编号,一个递增的数值。

如果您可以在版本号中容纳空缺,可以将版本更改为包括构建编号,例如4.8-142,其中142是来自Jenkins的构建编号。这样就可以在semver意义上获得递增的版本号,并且仍然可以以更加实用的方式控制实际版本。

如果您不满意版本中的构建编号,则应该有一个后构建脚本来更新版本号并将其存储在某个文件中。然后,您可以使用EnvInject插件或使用参数化构建注入该文件内容。


在阅读了上面所有的答案之后,我想建议使用构建号。+1 - Larry Ricker

3

使用Jenkins插件中的版本号插件,它应该提供一个环境变量作为版本号,详见此链接


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接