gpt4 book ai didi

dictionary - 无法在 Jenkins Pipeline 中使用 Groovy 迭代 Map

转载 作者:行者123 更新时间:2023-12-03 21:28:50 31 4
gpt4 key购买 nike

我们正在尝试迭代 Map ,但没有任何成功。我们将问题简化为这个最小的例子:

def map = [
'monday': 'mon',
'tuesday': 'tue',
]

如果我们尝试迭代:
map.each{ k, v -> println "${k}:${v}" }

仅输出第一个条目: monday:mon
我们知道的替代方案甚至无法进入循环:
for (e in map)
{
println "key = ${e.key}, value = ${e.value}"
}

或者
for (Map.Entry<String, String> e: map.entrySet())
{
println "key = ${e.key}, value = ${e.value}"
}

都失败了,都只显示异常 java.io.NotSerializableException: java.util.LinkedHashMap$Entry . (这可能与引发“真正”异常时发生的异常有关,使我们无法知道发生了什么)。

我们正在使用最新的稳定 jenkins (2.19.1),所有插件截至今天 (2016/10/20) 都是最新的。

是否有迭代 Map 中的元素的解决方案?在 Jenkins 管道 Groovy 脚本中?

最佳答案

自从我玩这个已经有一段时间了,但是遍历 map (和其他容器)的最佳方法是使用“经典”for 循环或“for in”。见 Bug: Mishandling of binary methods accepting Closure

对于您的具体问题,大多数(所有?)管道 DSL 命令都会添加一个序列点,我的意思是可以保存管道的状态并在以后恢复它。例如,考虑等待用户输入,您希望即使重启也能保持此状态。
结果是每个实时实例都必须被序列化——但遗憾的是标准 Map 迭代器是不可序列化的。 Original Thread

我能想到的最佳解决方案是定义一个函数来将 Map 转换为可序列化 MapEntries 的列表。该函数不使用任何管道步骤,因此无需在其中进行任何可序列化。

@NonCPS
def mapToList(depmap) {
def dlist = []
for (def entry2 in depmap) {
dlist.add(new java.util.AbstractMap.SimpleImmutableEntry(entry2.key, entry2.value))
}
dlist
}

这显然必须为您想要迭代的每个 map 调用,但好处是,循环体保持不变。

for (def e in mapToList(map))
{
println "key = ${e.key}, value = ${e.value}"
}

您必须批准 SimpleImmutableEntry构造函数,或者很可能您可以通过将 mapToList 函数放在工作流库中来解决这个问题。

关于dictionary - 无法在 Jenkins Pipeline 中使用 Groovy 迭代 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40159258/

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