首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Jenkins Groovy Pipeline org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:未找到这样的字段: field groovy.util.Node

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

Stack Overflow用户
提问于 2019-05-17 12:24:01
回答 1查看 9K关注 0票数 1

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

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?><Metrics> <Safety> <score>81.00</score> <Percentrules>98.00</Percentrules> </Safety> </Metrics> 

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

代码语言:javascript
复制
         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执行脚本时,我得到以下结果:

代码语言:javascript
复制
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.Node

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

编辑

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

代码语言:javascript
复制
         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?这会是一个很好的选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 03:55:08

使用Node和NodeList字段访问的脚本沙箱似乎有一些问题。你可以像下面这样解决这个问题,这不是很好,但至少可以工作。

代码语言:javascript
复制
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])
}

您还需要在Manage Jenkins菜单的In-process Script Approval部分中批准以下签名。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56179580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档