我正在构建一个 Jenkins 管道,我有这个方法:
private Map processServerMapping(Map serverMapping, List newVersions) {
def currentVersions = serverMapping.values().toSet()
def removedVersions = currentVersions - newVersions.toSet()
if (removedVersions) {
def newVersionsToAssign = newVersions - currentVersions
def serversToClear = []
serverMapping.each { server, version ->
if (removedVersions.contains(version)) {
serversToClear.add(server)
}
}
serversToClear.each { server ->
serverMapping[server] = null
}
def availableServers = serverMapping.findAll { it.value == null }.keySet()
newVersionsToAssign.eachWithIndex { version, index ->
if (index < availableServers.size()) {
serverMapping[availableServers[index]] = version
}
}
}
return serverMapping
}
目的是将版本分配给服务器,并在新版本发布时保持此映射最新。
当我在 Jenkins 脚本控制台中这样调用它时:
Map currentMapping = ["bm05-ibm":"4.16.0", "bm06-ibm":"4.15.3"]
List nearestReleases = ["4.14.7", "4.17.0"]
processServerMapping(currentMapping,nearestReleases)
这就是我得到的:
Result: {bm05-ibm=4.14.7, bm06-ibm=4.17.0}
所以,按预期工作。
但是,当我在 Jenkins 管道中调用此函数时,此函数返回
null
。
我添加了打印来调试这个:
echo "processServerMapping:serverMappingBeforeClear = ${serverMapping}"
serverMapping.each { server, version ->
if (removedVersions.contains(version)) {
serversToClear.add(server)
}
}
serversToClear.each { server ->
serverMapping[server] = null
}
echo "processServerMapping:serverMappingAfterClear = ${serverMapping}"
这些是管道中的打印:
11:26:53 [Pipeline] echo
11:26:53 processServerMapping:serverMappingBeforeClear = [bm05-ibm:4.16.0, bm06-ibm:4.15.3]
11:26:53 [Pipeline] echo
11:26:53 processServerMapping:serverMappingAfterClear = [:]
看起来
serverMapping[server] = null
正在使整个地图无效,我不知道为什么。
为什么脚本控制台和实际管道之间的行为不同?
我尝试在迭代器中操作 Map,将其保存在单独的变量中以维持范围,但这些似乎都没有效果。
您仍然可以使用
readJSON
步骤,只需传递returnPojo: true
参数即可。
在返回之前将输出转换为 POJO 类型(LinkedHashMap 或 ArrayList)。默认情况下停用 (false),并返回 JSON 对象(来自 json-lib 的 JSONObject 或 JSONArray)。
而且
JSONObject
确实做了一些不直观的事情。