最近同事拿了段代码让我看看为啥获取不到想要的值?(已脱敏处理)
@NonCPS
def ImageJson(url) {
pkg_name = url.split("/")[-1]
image_json_file = "image.json"
sh """
wget ${url}
tar -xvf ${pkg_name}
rm -f ${pkg_name}
sshpass -p ***** scp image.json ***@#######:/srv/ftp/tmp/
"""
def text = new URL("#########/tmp/image.json").text //@Tag
def object = new groovy.json.JsonSlurper().parseText(text)
def images = object.images
def imageList = []
images.each { def it ->
def imageName = it.image.substring(0, it.image.lastIndexOf(":"))
def imageTag = it.image.substring(it.image.lastIndexOf(":") + 1, it.image.length())
imageList.add("imageName": imageName, "imageTag": imageTag)
}
return imageList
}
在标注@Tag的地方获取不到json的内容,jenkins也没报任何错误,甚至在debug的时候发现在它前后的代码都不执行。感觉就像丢弃了一般。
一开始没有注意到方法体前面的标注@NonCPS,就想着把它拆成两个方法,测试是可以拿到数据的,侧面验证了代码块是没有问题的。那为啥合起来就不行呢?以前用的时候只知道它可以绕过一些安全检查,可以处理没有序列化的对象啥的。但是这里面的情况并不存在上述代码里。就去爬了下官网
里面说加上这个,方法体内部不允许打断,可以做一些计算啥的。所以还是要慎用。不建议在sh/bat这种管道操作里使用它,实在用了,也只能用一次,而且覆盖整个方法,像上述代码管道之后又去做了其它的事情,就被丢掉了。去掉这个标签,就可以正常执行了。
网友评论