Jenkins Groovy Pipeline org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:找不到这样的字段:groovy.util.Node

时间:2019-05-17 04:24:01

标签: jenkins groovy

我正在从远程主机检索XML文件,并使用XmlParser对其进行解析。该文件的内容如下:

<?xml version="1.0" encoding="utf-8"?><Metrics> <Safety> <score>81.00</score> <Percentrules>98.00</Percentrules> </Safety> </Metrics> 

当我在Groovy沙箱外部执行脚本时,可以通过以下方式检索得分值。

         def report = readFile(file: 'Qualitycheck.xml')
         def metrics = new XmlParser().parseText(report)
         println metrics
         double score = Double.parseDouble(metrics.Safety.score[0].value()[0])

但是,当我使用SCM执行脚本时,会得到以下信息:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.Node

即使我已安装Permissive-Script-Security-Plugin并使用-Dpermissive-script-security.enabled=no_security JVM选项启用了插件,问题仍然存在。这种方法有什么不同吗?没有其他方法引起问题。为什么?

修改

我决定使用XmlSlurper(),并检索了值81.00。但是结果是类型groovy.util.slurpersupport.NodeChildren

         def metrics2 = new XmlSlurper().parseText(report)
         def score = metrics2.Safety.score
         print score
         print score.getClass()
         => 81.0098.00
         => groovy.util.slurpersupport.NodeChildren

如何使用XmlSlurper提取值81.00并将其转换为double?那会是一个很好的选择吗?

1 个答案:

答案 0 :(得分:1)

具有“节点”和“节点列表”字段访问权限的脚本沙箱似乎存在一些问题。您可以按照以下方法解决此问题,虽然效果不好,但至少可以正常工作。

node() {
    def xml = readFile "${env.WORKSPACE}/Qualitycheck.xml"
    def rootNode = new XmlParser().parseText(xml)
    print Double.parseDouble(rootNode.value()[0].value()[0].value()[0])
    // Next line if position isnt fixed, can return an array
    // if theres more than 1 with structure "Safety.score", [0] at the end takes the first.
    print Double.parseDouble(rootNode.find{it.name() == "Safety"}.value().find{it.name() == "score"}.value()[0])
}

您还需要在“管理Jenkins”菜单的“进程内脚本批准”部分中批准以下签名。

method groovy.util.Node name
method groovy.util.Node value
method groovy.util.XmlParser parseText java.lang.String
new groovy.util.XmlParser
staticMethod java.lang.Double parseDouble java.lang.String
staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods find java.lang.Object groovy.lang.Closure