Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy (错误)管道jenkins,在循环中调用sh+;序列化json_Groovy_Jenkins Pipeline_Jenkins Groovy - Fatal编程技术网

Groovy (错误)管道jenkins,在循环中调用sh+;序列化json

Groovy (错误)管道jenkins,在循环中调用sh+;序列化json,groovy,jenkins-pipeline,jenkins-groovy,Groovy,Jenkins Pipeline,Jenkins Groovy,我不明白为什么会发生错误: stage('name') { steps { script { def jsonObj = new JsonSlurper().parseText( env.work_servers ) for(item in jsonObj){ cmd("my command --param1=${item.srv} --param2=${item.port}")

我不明白为什么会发生错误:

stage('name') {
    steps {
        script {
            def jsonObj = new JsonSlurper().parseText( env.work_servers )
            for(item in jsonObj){
                cmd("my command --param1=${item.srv} --param2=${item.port}")
            }
        }
    }
}
获取错误,错误堆栈

即使将cmd方法调用替换为sh,也不会有任何更改

如果在没有循环的情况下调用命令,一切都会正常工作

stage('name') {
    steps {
        script {
            def srv = "..."
            def port = "..."
            cmd("my command --param1=${srv} --param2=${port}")

            srv = "..."
            port = "..."
            cmd("my command --param1=${srv} --param2=${port}")
        }
    }
}
这同样有效

stage('name') {
    steps {
        script {
            def jsonObj = new JsonSlurper().parseText( env.work_servers )
            for(item in jsonObj){
                echo item 
            }
        }
    }
}

您会看到这个问题,因为
new JsonSlurper().parseText(text)
返回类型为
groovy.json.internal.LazyMap
的映射,该映射不可序列化。在stage中运行的任何代码都必须对可序列化对象进行操作。(使用
@NonCPS
注释的提取方法可以应用异常)

这个问题的解决方案很简单-将
JsonSlurper
替换为
JsonSlurperClassic
,它从
parseText(text)
方法返回
HashMap

stage('name') {
    steps {
        script {
            def jsonObj = new JsonSlurperClassic().parseText( env.work_servers )
            for(item in jsonObj){
                cmd("my command --param1=${item.srv} --param2=${item.port}")
            }
        }
    }
}
或者,如果您需要继续使用
JsonSlurper
,您可以将解析JSON并对JSON对象执行任何操作的部分提取到单独的方法中,并使用
@NonCPS
对其进行注释。如果JSON是一个巨大的,并且使用<代码> LazyMap <代码>,你可以考虑这个备选方案。否则,切换到
JsonSlurperClassic
是解决问题的最佳方法

stage('name') {
    steps {
        script {
            def jsonObj = new JsonSlurperClassic().parseText( env.work_servers )
            for(item in jsonObj){
                cmd("my command --param1=${item.srv} --param2=${item.port}")
            }
        }
    }
}