美文网首页
jenkins @NonCPS 标注使用

jenkins @NonCPS 标注使用

作者: jaymz明 | 来源:发表于2021-01-15 11:08 被阅读0次

最近同事拿了段代码让我看看为啥获取不到想要的值?(已脱敏处理)

@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,就想着把它拆成两个方法,测试是可以拿到数据的,侧面验证了代码块是没有问题的。那为啥合起来就不行呢?以前用的时候只知道它可以绕过一些安全检查,可以处理没有序列化的对象啥的。但是这里面的情况并不存在上述代码里。就去爬了下官网

image.png

里面说加上这个,方法体内部不允许打断,可以做一些计算啥的。所以还是要慎用。不建议在sh/bat这种管道操作里使用它,实在用了,也只能用一次,而且覆盖整个方法,像上述代码管道之后又去做了其它的事情,就被丢掉了。去掉这个标签,就可以正常执行了。

相关文章

网友评论

      本文标题:jenkins @NonCPS 标注使用

      本文链接:https://www.haomeiwen.com/subject/gvviaktx.html