gpt4 book ai didi

jenkins - 为什么 Jenkinsfile 中的 each 循环在第一次迭代时停止

转载 作者:行者123 更新时间:2023-12-03 21:19:53 24 4
gpt4 key购买 nike

这是我的Jenkinsfile的内容:

node {
// prints only the first element 'a'
[ 'a', 'b', 'c' ].each {
echo it
}
}

在 Jenkins 中执行作业时(使用 Pipeline plugin ),只打印列表中的第一项。

有人可以向我解释这种奇怪的行为吗?这是一个错误吗?还是只是我不理解 Groovy 语法?

编辑 : for (i in items)按预期工作:
node {
// prints 'a', 'b' and 'c'
for (i in [ 'a', 'b', 'c' ]) {
echo i
}
}

最佳答案

此处接受的答案指出这是一个已知错误,并使用了一种对我不起作用的解决方法,因此我将提供我最近发现的更新。

尽管决议JENKINS-26481 (最近,在撰写本文时)许多人可能会坚持使用旧版本的 Jenkins,其中修复程序不可用。对文字列表的 For 循环迭代有时可能有效,但相关问题如 JENKINS-46749JENKINS-46747似乎继续困扰着许多用户。此外,根据 Jenkinsfile 中的确切上下文,可能是 echo会工作,而 sh失败,事情可能会默默地失败,或者他们可能会因序列化失败而导致构建崩溃。

如果你不喜欢意外(跳过循环和静默失败),并且如果你希望你的 Jenkinsfiles 在 Jenkins 的多个版本中是最可移植的,主要的想法似乎是你应该总是在你的 for 循环中使用经典计数器并忽略其他常规特征。

This gist是我见过的最好的引用资料,并阐明了许多您认为应该工作相同但行为惊人不同的情况。这是建立健全性检查和调试设置的良好起点,无论您正在查看哪种迭代,也无论您是否尝试使用 @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

关于jenkins - 为什么 Jenkinsfile 中的 each 循环在第一次迭代时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com