环境 | 版本 |
---|---|
Jenkins | 2.332.3 |
JenkinsFile | 声明式语法 1.3 |
适用于Jenkins版本 2.100
+ , 声明语法版本 0.8
+
最近使用Jenkins的过程中,参数化构建过程中,产生了持续化参数的场景:
同样一条流水线, 在进行调用的时候能够实现版本号的自动递增.
如:
该流水线第一次调用成功, 版本号为v0.1
那第二次调用时, 产出的版本号应该为v0.2
因为使用的Jenkins版本较新,22年5月底刚发布.
找遍全网, 大部分解决方案对应的是 Jenkins 2.70及以下,或脚本式语法的版本.
70 -- 300之间语法和使用方式又或者插件支持发生了比较大的变化, 都不再适用.
尝试过
流水线配置 ==> 参数化构建过程 ==> 增加参数
图片:
此处设置参数为PROJECT_VERSION为0.1
UI界面设置后, 此时点击构建, 该参数出现在顺序位置
pipeline {
...
parameters {
string (defaultValue: '1.1', description: '版本号', name: 'TEST_VERSION', trim: true)
}
stages {
...
}
}
配置流水线JenkinsFile, 编辑了pipeline中parameter节点后, 保存并运行.
运行之后该参数已经重写, 此时点击构建, 该参数出现在第一位(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
并不是什么时候都需要自增的, 如果流水线调用的频率较高或者不需要频繁实现自增则可增加条件判断. 如时间, 名称等
此处增加了时间维度的周版本判断, 当有周版本出现时, 小版本号+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