Конвейер Jenkins Groovy org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: поле не найдено: поле groovy.util.Node - PullRequest
0 голосов
/ 17 мая 2019

Я извлекаю файл 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 Ответ

1 голос
/ 12 июня 2019

Кажется, есть некоторые проблемы с изолированной программной средой сценария с доступом к полям Node и NodeList. Вы можете обойти это следующим образом, это нехорошо, но работает по крайней мере.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...