热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

Jenkins属性持久化以实现版本号自动递增环境确认环境版本Jenkins2.332.3JenkinsFile声明式语法1.3适用于Jenkins版本2.100+,声明语法版本0.

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

环境确认



















环境版本
Jenkins2.332.3
JenkinsFile声明式语法 1.3

适用于Jenkins版本 2.100+ , 声明语法版本 0.8+


情况说明


场景

最近使用Jenkins的过程中,参数化构建过程中,产生了持续化参数的场景:

同样一条流水线, 在进行调用的时候能够实现版本号的自动递增.

如:

该流水线第一次调用成功, 版本号为v0.1

那第二次调用时, 产出的版本号应该为v0.2


背景

因为使用的Jenkins版本较新,22年5月底刚发布.

找遍全网, 大部分解决方案对应的是 Jenkins 2.70及以下,或脚本式语法的版本.

70 -- 300之间语法和使用方式又或者插件支持发生了比较大的变化, 都不再适用.

尝试过


解决


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



推荐阅读
author-avatar
Pingac
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有