作为 Jenkins 管道的一部分进行操作时,Map 变量变为 null

问题描述 投票:0回答:1

我正在构建一个 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,将其保存在单独的变量中以维持范围,但这些似乎都没有效果。

jenkins groovy jenkins-pipeline jenkins-groovy
1个回答
0
投票

您仍然可以使用

readJSON
步骤,只需传递
returnPojo: true
参数即可。

在返回之前将输出转换为 POJO 类型(LinkedHashMap 或 ArrayList)。默认情况下停用 (false),并返回 JSON 对象(来自 json-lib 的 JSONObject 或 JSONArray)。

而且

JSONObject
确实做了一些不直观的事情。

© www.soinside.com 2019 - 2024. All rights reserved.