Jenkins-pipeline 在对 HashMap 进行排序时用新值“-1”替换变量
Jenkins-pipeline replaces variable with new value '-1' while sorting HashMap
首先,我创建一个地图并用值填充它。然后我想按值对地图进行排序。我在示例中使用 sort 方法。
在我的 IDE 控制台中,我看到程序的行为符合我的预期。
但是,当我从groovy管道中运行程序时,排序后发生了莫名其妙的事情。由于输入灵活,地图被数字取代。
node("Linux_Default") {
Map painters = ["Rubens": 1, "Bosch": 2, "Repin": 5, "DaVinci": 10] as HashMap<String, Integer>
println('unordered')
for (String i : painters) {
println('* ' + i)
}
def sortedPainters = painters.sort(){ a, b -> b.value <=> a.value }
try {
println('ordered')
for (String i : sortedPainters) {
println('* ' + i)
}
} catch (Exception e) {
println(e.toString())
}
}
来自 IDE
的输出
unordered
* Rubens=1
* Bosch=2
* Repin=5
* DaVinci=10
ordered
* DaVinci=10
* Repin=5
* Bosch=2
* Rubens=1
管道控制台的输出
Running in Durability level: PERFORMANCE_OPTIMIZED
Running on jenkins-agent-linux-008 in /u01/jenkins_slave/workspace/KMD/maps_sort_test
unordered
* Rubens=1
* Bosch=2
* Repin=5
* DaVinci=10
ordered
* -1
Finished: SUCCESS
在带有自定义闭包的 Jenkins 中,某些方法在 CPS 下处理得不好。解决方案是在 @NonCPS
闭包中隔离有问题的代码,例如:
@NonCPS
def getSorted(def map) {
map.sort(){ a, b -> b.value <=> a.value }
}
然后您会看到 def sortedPainters = getSorted(painters)
returns 排序映射而不是奇怪的标量。
另请参阅:
Jenkins sort method behaviour not as expected
pipeline groovy script - Sort a list with custom comparator or closure not sorting
首先,我创建一个地图并用值填充它。然后我想按值对地图进行排序。我在示例中使用 sort 方法。 在我的 IDE 控制台中,我看到程序的行为符合我的预期。
但是,当我从groovy管道中运行程序时,排序后发生了莫名其妙的事情。由于输入灵活,地图被数字取代。
node("Linux_Default") {
Map painters = ["Rubens": 1, "Bosch": 2, "Repin": 5, "DaVinci": 10] as HashMap<String, Integer>
println('unordered')
for (String i : painters) {
println('* ' + i)
}
def sortedPainters = painters.sort(){ a, b -> b.value <=> a.value }
try {
println('ordered')
for (String i : sortedPainters) {
println('* ' + i)
}
} catch (Exception e) {
println(e.toString())
}
}
来自 IDE
的输出unordered
* Rubens=1
* Bosch=2
* Repin=5
* DaVinci=10
ordered
* DaVinci=10
* Repin=5
* Bosch=2
* Rubens=1
管道控制台的输出
Running in Durability level: PERFORMANCE_OPTIMIZED
Running on jenkins-agent-linux-008 in /u01/jenkins_slave/workspace/KMD/maps_sort_test
unordered
* Rubens=1
* Bosch=2
* Repin=5
* DaVinci=10
ordered
* -1
Finished: SUCCESS
在带有自定义闭包的 Jenkins 中,某些方法在 CPS 下处理得不好。解决方案是在 @NonCPS
闭包中隔离有问题的代码,例如:
@NonCPS
def getSorted(def map) {
map.sort(){ a, b -> b.value <=> a.value }
}
然后您会看到 def sortedPainters = getSorted(painters)
returns 排序映射而不是奇怪的标量。
另请参阅:
Jenkins sort method behaviour not as expected
pipeline groovy script - Sort a list with custom comparator or closure not sorting