Jenkins-конвейер заменяет переменную новым значением -1 при сортировке HashMap - PullRequest
2 голосов
/ 04 апреля 2019

Сначала я создаю карту и заполняю ее значениями. Затем я хочу отсортировать карту по значению. И я использую метод сортировки, как в примере. В моей 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

1 Ответ

1 голос
/ 04 апреля 2019

Некоторые методы плохо обрабатываются в CPS в Jenkins с пользовательскими замыканиями. Решение состоит в том, чтобы изолировать проблемный код в закрытии @NonCPS, например:

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

Тогда вы увидите, что def sortedPainters = getSorted(painters) возвращает отсортированную карту, а не странный скаляр.

Смотри также:

Поведение метода сортировки Дженкинса не соответствует ожиданиям

конвейер Groovy скрипт - сортировка списка с пользовательским компаратором или закрытие не сортировка

...