В принятом здесь ответе говорится, что это известная ошибка и используется обходной путь, который мне не помог, поэтому я предложу обновление с тем, что я нашел в последнее время.
Несмотря на разрешение JENKINS-26481 (довольно недавнее, на момент написания этой статьи), многие люди могут застрять в более старой версии Jenkins, где исправление недоступно. Итерация цикла for по буквальному списку иногда может работать, но связанные с этим проблемы, такие как JENKINS-46749 и, похоже, продолжают беспокоить многих пользователей. Кроме того, в зависимости от точного контекста в вашем файле Jenkins, возможно, echo
будет работать, тогда как sh
завершится сбоем, и что-то может выйти из строя автоматически или может привести к сбою сборки с ошибками сериализации.
Если вам не нравятся сюрпризы (пропущенные циклы и тихие сбои) и если вы хотите, чтобы ваши Jenkinsfiles были наиболее переносимыми между несколькими версиями Jenkins, основная идея, по-видимому, заключается в том, что вы всегда должны использовать классические счетчики в своих циклах for и игнорировать другие отличные функции.
Это краткое описание — лучший справочник, который я когда-либо видел. работают одинаково, но ведут себя на удивление по-разному. Это хорошая отправная точка для проверки работоспособности и отладки вашей установки, независимо от того, какую итерацию вы рассматриваете, и независимо от того, пытаетесь ли вы использовать @NonCPS
, выполнять итерацию непосредственно внутри node{}
или вызывать отдельную функцию.
Опять же, я не беру на себя ответственность за саму работу, но я включаю суть итерационных тестовых случаев ниже для потомков:
abcs = ['a', 'b', 'c']
node('master') {
stage('Test 1: loop of echo statements') {
echo_all(abcs)
}
stage('Test 2: loop of sh commands') {
loop_of_sh(abcs)
}
stage('Test 3: loop with preceding SH') {
loop_with_preceding_sh(abcs)
}
stage('Test 4: traditional for loop') {
traditional_int_for_loop(abcs)
}
}
@NonCPS // has to be NonCPS or the build breaks on the call to .each
def echo_all(list) {
list.each { item ->
echo "Hello ${item}"
}
}
// outputs all items as expected
@NonCPS
def loop_of_sh(list) {
list.each { item ->
sh "echo Hello ${item}"
}
}
// outputs only the first item
@NonCPS
def loop_with_preceding_sh(list) {
sh "echo Going to echo a list"
list.each { item ->
sh "echo Hello ${item}"
}
}
// outputs only the "Going to echo a list" bit
//No NonCPS required
def traditional_int_for_loop(list) {
sh "echo Going to echo a list"
for (int i = 0; i < list.size(); i++) {
sh "echo Hello ${list[i]}"
}
}
// echoes everything as expected
person
mvr
schedule
31.10.2017
println "${it}"
? - person Gerold Broser   schedule 02.06.2016println
и интерполяцией строк. - person Eric Citaire   schedule 02.06.2016