Jenkins属性持久化 版本号自动递增

Jenkins属性持久化以实现版本号自动递增

环境确认

环境 版本
Jenkins 2.332.3
JenkinsFile 声明式语法 1.9.3

适用于Jenkins版本 2.99+ , 声明式语法版本 1.2.8+

情况说明

场景

最近使用Jenkins的过程中,参数化构建过程中,产生了持续化参数的场景:
同样一条流水线, 在进行调用的时候能够实现版本号的自动递增.
如:
该流水线第一次调用成功, 版本号为v0.1
那第二次调用时, 产出的版本号应该为v0.2

背景

因为使用的Jenkins版本较新,22年5月底发布.
找遍全网, 大部分解决方案对应的版本较旧, 与现在相比语法和使用方式发生了比较大的改变.已经不再适用.

解决

1. 添加参数化构建

流水线配置 ==> 参数化构建过程 ==> 增加参数
图片:

此处设置参数为PROJECT_VERSION为0.1

UI界面设置后, 此时点击构建, 该参数出现在顺序位置


2. 流水线JenkinsFile添加参数重写的步骤

pipeline {
    ...
    
    parameters {
        string (defaultValue: '1.1', description: '版本号', name: 'TEST_VERSION', trim: true)
    }
    
    stages {
    ...
    }
}

配置流水线JenkinsFile, 编辑了pipeline中parameter节点后, 保存并运行.
运行之后该参数已经重写, 此时点击构建, 该参数出现在第一位(JenkinsFile内重写后顺序前移)


3. JenkinsFile实现版本号自增

// 版本号自增并保存, 当次运行流水不生效
def getNextVersion() {
    NEXT_VERSION = params.PROJECT_VERSION
    VERSION = NEXT_VERSION.tokenize('.')
    LARGE_VERSION = VERSION.get(0)
    MINOR_VERSION = VERSION.get(1)
    MINOR_VERSION = MINOR_VERSION.toInteger() + 1
    NEXT_VERSION = "${LARGE_VERSION}.${MINOR_VERSION}"
    return NEXT_VERSION
}

pipeline {
    ...
    
    parameters {
        string (defaultValue: getNextVersion(), description: '版本号', name: 'TEST_VERSION', trim: true)
    }
    
    stages {
    ...
    }
}

为自增小版本号, 且小版本号为自然数
此处应注意:
直接使用 params.PROJECT_VERSION + 1 会报错
environment节点内的变量无法作用于平行的parameters节点内
只能通过pipeline外定义函数的方式来实现自增
此时点击构建, 每次构建之后, 小版本号已经可以实现自增+1


4. 添加版本号自增条件

并不是什么时候都需要自增的, 如果流水线调用的频率较高或者不需要频繁实现自增则可增加条件判断. 如时间, 名称等
此处增加了时间维度的周版本判断, 当有周版本出现时, 小版本号+1


// 1: 周日
// 2: 周一
// 3: 周二
// 4: 周三
// 5: 周四
// 6: 周五
// 7: 周六
// Sunday ==> Saturday
def getWeeklyFlag() {
    WEEKLY_FLAG = false
    TODAY_FLAG = new Date().getAt(Calendar.DAY_OF_WEEK)
    HOUR_FLAG = new Date().getHours()
    // 周四凌晨0-6点之间
    if (TODAY_FLAG == 5 && HOUR_FLAG < 6) {
        WEEKLY_FLAG = true
    }
    return WEEKLY_FLAG
}

def getNextVersion() {
    NEXT_VERSION = params.PROJECT_VERSION
    if (getWeeklyFlag()) {
        VERSION = NEXT_VERSION.tokenize('.')
        LARGE_VERSION = VERSION.get(0)
        MINOR_VERSION = VERSION.get(1)
        MINOR_VERSION = MINOR_VERSION.toInteger() + 1
        NEXT_VERSION = "${LARGE_VERSION}.${MINOR_VERSION}"
    }
    return NEXT_VERSION
}

pipeline {
    ...
    
    parameters {
        string (defaultValue: getNextVersion(), description: '版本号', name: 'TEST_VERSION', trim: true)
    }
    
    stages {
    ...
    }
}


参考

有价值问答

https://stackoverflow.com/questions/17585615/how-to-store-last-value-of-parameter-in-parameterized-job-as-a-default-value-for
https://stackoverflow.com/questions/35370810/how-do-i-use-jenkins-pipeline-properties-step
https://stackoverflow.com/questions/46827883/how-to-store-the-previous-parameters-values-in-a-jenkins-pipeline

底层实现

https://javadoc.jenkins-ci.org/hudson/model/ParameterDefinition.html
https://javadoc.jenkins-ci.org/hudson/model/ParametersDefinitionProperty.html

Jenkins声明式语法变更

版本 发布时间 变更
0.1 2016-8-30 -
0.2 2016-9-8 -
0.3 2016-10-10 -
0.4 2016-10-11 -
0.5 2016-11-2 -
0.6 2016-11-4 -
0.7 2017-12-1 -
0.8.1 2017-1 https://www.jenkins.io/blog/2017/01/12/declarative-pipeline-beta-2/
1 2017-2-1 https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/#content-top
1.2.8 2018-4-5 https://www.jenkins.io/blog/2018/04/09/whats-in-declarative/#content-top
1.3 2018-6-14 https://www.jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/
1.4 2019-11-5 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
1.5 2019-12-1 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
1.6 2020-3-10 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
1.7 2020-5-30 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
1.8 2021-2-2 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
1.9 2021-7-29 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
1.9.3 2021-11-18 https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/CHANGELOG.md
posted @ 2022-06-09 14:48  Jrri  阅读(2383)  评论(0)    收藏  举报