我正在尝试创建一个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'}]
感谢您的帮助。
坦率
答案 0 :(得分:1)
您的 toString 方法缺少@NonCPS注释:
@Override @NonCPS
public String toString() {
return "ProjectVersion{" +
"version='" + version + '\'' +
'}';
}