You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:05