Groovy Jenkins管道将变量替换为新值'-1';排序HashMap时

Groovy Jenkins管道将变量替换为新值'-1';排序HashMap时,groovy,jenkins-pipeline,jenkins-groovy,Groovy,Jenkins Pipeline,Jenkins Groovy,首先,我创建一个映射并用值填充它。然后我想按值对地图进行排序。我使用示例中的排序方法。 在控制台的IDE中,我看到程序的行为符合我的期望 然而,当我从groovy管道运行程序时,排序之后发生了一件无法解释的事情。由于打字灵活,地图被数字所取代 node("Linux_Default") { Map painters = ["Rubens": 1, "Bosch": 2, "Repin": 5, "DaVinci": 10] as HashMap<String, Integer>

首先,我创建一个映射并用值填充它。然后我想按值对地图进行排序。我使用示例中的排序方法。 在控制台的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())
    }
}
来自管道控制台的输出

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 }
}
@NonCPS
def getSorted(def映射){
map.sort(){a,b->b.value a.value}
}
然后您将看到
def sortedPainters=getSorted(painters)
返回一个排序的映射,而不是一个奇怪的标量

另见:

@NonCPS
def getSorted(def map) {
    map.sort(){ a, b -> b.value <=> a.value }
}