Jenkins管道中具有类的逻辑不起作用

时间:2020-02-17 14:39:56

标签: jenkins groovy jenkins-pipeline

我正在尝试创建一个jenkins管道,该管道采用项目的最新版本并将其人工制品(例如docker镜像)用于端到端测试。

管道可能看起来很复杂,但是非常简单。 ProjectVersion类用于对版本进行排序。最复杂的部分是compareTo方法,该方法应在选择最大版本时使用(稍后会通过正则表达式匹配来实现更复杂的逻辑)

在注释中删除了一部分,因为使用时它会失败。

管道:

class ProjectVersion implements Comparable<ProjectVersion>, Serializable {

    private String version;

    public final String get() {
        return this.version;
    }

    public ProjectVersion(String version) {
        this.version = version;
    }

    public int compareTo(ProjectVersion that) {
        if(that == null)
            return 1;
        String[] thisParts = this.get().split("\\.");
        String[] thatParts = that.get().split("\\.");
        int length = Math.max(thisParts.length, thatParts.length);
        for(int i = 0; i < length; i++) {
            int thisPart = i < thisParts.length ?
                    tryToParse(thisParts[i]) : 0;
            int thatPart = i < thatParts.length ?
                    tryToParse(thatParts[i]) : 0;
            if(thisPart < thatPart)
                return -1;
            if(thisPart > thatPart)
                return 1;
        }
        return 0;
    }

    private int tryToParse(String part) {
        try {
            return Integer.parseInt(part)
        } catch (NumberFormatException e) {
            return 0;
        }
    }

    boolean equals(Object that) {
        if(this == that)
            return true;
        if(that == null)
            return false;
        if(this.getClass() != that.getClass())
            return false;
        return this.compareTo((ProjectVersion) that) == 0;
    }


    @Override
    public String toString() {
        return "ProjectVersion{" +
                "version='" + version + '\'' +
                '}';
    }
}


def getJSON(url) {
    sh(returnStdout: true, script: "curl -s ${url} 2>&1 | tee result.json")
    readFile('result.json').trim()
}

def getVersions(String url) {
    def json =   readJSON text: getJSON(url)
    def allVersions = json.children.findAll { child -> child.folder }
            .collect { it.uri.substring(1).trim() }
    return sort(allVersions)
}

@NonCPS
def sort(allVersions) {
    return allVersions
            .collect { it-> new ProjectVersion(it) }
//            .sort{it1, it2 -> it1.compareTo(it2)}
//            .reverse()

}

def getVersions() {
    def versions = getVersions(MVN_ARTIFACTORY)
    println(versions.toString())
    def lastVersion = versions.iterator().next()
    println(lastVersion.toString())
    versions
}

pipeline {
    agent {
        label JENKINS_NODES
    }
    stages {
        stage('Get the right version') {
            steps {
                getVersions()
            }
        }
    }

结果:

// not important stuff here

+ curl -s ************************ // not important
+ tee result.json
[Pipeline] readFile
[Pipeline] readJSON
[Pipeline] echo
ProjectVersion{version='1.5.10'}
[Pipeline] echo
ProjectVersion{version='1.5.10'}
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

第一个回显应打印集合中的所有版本-但该变量显然是ProjectVersion 类的实例不是列表。怎么可能?

我正尝试使用@NonCPS注释,但没有运气。

我非常确定groovy代码部分正在运行。当我尝试从groovy控制台运行它(并将json解析替换为new groovy.json.JsonSlurper().parseText(new URL(url).getText()))时,它可以工作。预期结果(不进行排序)是:

[ProjectVersion{version='1.5.10'}, ProjectVersion{version='1.5.11'}, ProjectVersion{version='1.6.0.31'}, ProjectVersion{version='1.6.0.32'}, ProjectVersion{version='1.6.0.33'}, ProjectVersion{version='1.6.0.34'}, ProjectVersion{version='1.6.0.35'}, ProjectVersion{version='1.6.0.36'}, ProjectVersion{version='2.0.0'}, ProjectVersion{version='2.0.10'}]

感谢您的帮助。

坦率

1 个答案:

答案 0 :(得分:1)

您的 toString 方法缺少@NonCPS注释:

@Override @NonCPS
public String toString() {
    return "ProjectVersion{" +
            "version='" + version + '\'' +
            '}';
}