Groovy(Jenkinsfile)版本比较与按序部署功能实现求助
Groovy 实现Jenkins版本迭代部署代码修正方案
原代码核心问题
- 拉取到的Git标签为换行分隔的字符串,未拆分存入数组,无法单独遍历每个标签
- 未对版本号做语义化数值比较,直接对比字符串会出现
1.10 < 1.2的逻辑错误 - 存在语法错误:括号未闭合、未定义变量引用、循环逻辑方向错误等
修正后完整代码
pipeline { agent any parameters { string(name: 'USERINPUTVERSION', defaultValue: 'FS2_UP_1.10', description: '目标部署版本') } environment { GIT_REPO = '/path/to/your/repo' // 这里替换为你实际执行SQL获取已部署版本的逻辑 DEPLOYED_VERSION = 'FS2_UP_1.1.1' } stages { stage('迭代部署版本') { steps { script { // 1. 拉取并处理Git标签列表 def tagRaw = sh(script: """ cd "${GIT_REPO}" git tag --sort=v:refname | grep "^FS2_UP_" """, returnStdout: true).trim() // 拆分换行符转为标签数组 def allTags = tagRaw.split('\n').toList() echo "仓库所有有效标签:${allTags}" // 2. 相等判断,无需部署的场景 if (USERINPUTVERSION == DEPLOYED_VERSION) { echo "提供的版本为当前已部署最新版本,无需操作" return } // 3. 语义化版本比较方法,Jenkins流水线需加@NonCPS避免序列化问题 @NonCPS int compareVersion(String ver1, String ver2) { // 去掉前缀,拆分版本号为数字数组 def v1 = ver1.replace('FS2_UP_', '').split('\\.').collect { it.toInteger() } def v2 = ver2.replace('FS2_UP_', '').split('\\.').collect { it.toInteger() } // 补全长度不一致的版本号,比如1.10补为[1,10,0]和1.1.1的[1,1,1]比较 def maxLen = Math.max(v1.size(), v2.size()) while (v1.size() < maxLen) v1.add(0) while (v2.size() < maxLen) v2.add(0) // 逐位比较 for (int i = 0; i < maxLen; i++) { if (v1[i] > v2[i]) return 1 if (v1[i] < v2[i]) return -1 } return 0 } // 4. 筛选介于已部署版本和目标版本之间的标签,按顺序排列 def deployList = [] for (tag in allTags) { // 筛选条件:版本大于已部署版本,小于等于目标版本 if (compareVersion(tag, DEPLOYED_VERSION) > 0 && compareVersion(tag, USERINPUTVERSION) <= 0) { deployList.add(tag) } // 如果需要实现你示例中的包含低于已部署版本的逻辑,修改上面的条件即可 } // 5. 按顺序执行部署 echo "待部署版本列表:${deployList}" deployList.each { ver -> echo "正在部署版本:${ver}" // 这里替换为你实际的部署SQL执行逻辑 // sh "your deploy command for ${ver}" } echo "所有版本部署完成" } } } } }
内容的提问来源于stack exchange,提问作者user2995458
相关产品推荐
相关产品推荐

