Отчеты Jenkins XmlParser Не найдено такого поля для атрибута корневого узла - PullRequest
0 голосов
/ 11 июня 2019

У меня есть проект со следующим XML-файлом (config.xml для проекта Cordova) ...

    <?xml version='1.0' encoding='utf-8'?>
    <widget android-versionCode="16" id="com.mycomp.myapp" ios-CFBundleVersion="15" version="1.3.0.b4" windows-packageVersion="1.2.6.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
        <name>My App</name>
        <description>My app description</description>
        <author>mycom.com.au</author>
           ....

Все, что я хочу сделать, это прочитать значение атрибута version (чтобы получить строку 1.3.0.b4) корневого элемента (widget). Следуя примеру здесь , где говорится использовать .@ для получения атрибута.

В моем файле-сценарии Jenkins есть следующее ...

        script {
              def xml = readFile "${env.WORKSPACE}/config.xml"
              def rootNode = new XmlParser().parseText(xml)
              def version = rootNode.@version
              echo 'version is...'
              echo version

Но когда я запускаю его, я получаю следующую ошибку ..

        org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.Node version
        at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
        at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetAttribute(SandboxInterceptor.java:436)
        at org.kohsuke.groovy.sandbox.impl.Checker$8.call(Checker.java:370)
        at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetAttribute(Checker.java:375)
        at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getAttribute(SandboxInvoker.java:37)

Я пробовал rootNode.@version (как указано выше) rootNode[0].@version и rootNode[3].@version, но ничего не работает.

Кто-нибудь имеет представление о том, что не так с вышеуказанным?

Заранее спасибо

[EDIT1]

Если я использую следующее ...

def xml = readFile "${env.WORKSPACE}/config.xml"
def rootNode = new XmlParser().parseText(xml)
def version = rootNode.text()
echo 'version is...'
echo version

выводит My app description, что немного странно (спрыгивает на узел описания)

[EDIT2]

Я пытался использовать следующее ..

 def rootNode = new XmlSlurper().parse("${env.WORKSPACE}/config.xml")
 def version = rootNode.@'version'

но я все еще получаю похожую ошибку ...

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.slurpersupport.NodeChild version
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetAttribute(SandboxInterceptor.java:436)
at org.kohsuke.groovy.sandbox.impl.Checker$8.call(Checker.java:370)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetAttribute(Checker.java:375)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getAttribute(SandboxInvoker.java:37)
at com.cloudbees.groovy.cps.impl.AttributeAccessBlock.rawGet(AttributeAccessBlock.java:20)
at WorkflowScript.run(WorkflowScript:15)
at ___cps.transform___(Native Method)

Если я позвоню echo rootNode.text(), снова, похоже, просто распечатывает содержимое первых 3 тегов внутри основного тега ,widget, т.е. My AppMy app descriptionmycom.com.au.

1 Ответ

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

Edit:

Я протестировал еще кое-что в связи с возможностью изменения атрибута и обнаружил, что при использовании доступа [] селектор @ для атрибутов действительно работает. Кажется, это приводит к использованию различных методов под капотом, которые вы можете одобрить в jenkins (getAt и putAt).

Мы можем просто использовать

def rootNode = new XmlParser().parseText(xml)
println rootNode['@version']

Оригинальный ответ:

Кажется, есть некоторая ошибка, связанная с прямым доступом к атрибутам с помощью селектора @ для объекта groovy.util.Node с изолированной программной средой сценария.

Обходной путь - использовать метод .attributes(), чтобы получить полную Карту атрибутов, и получить доступ к значению с помощью ключа, как показано ниже:

def rootNode = new XmlParser().parseText(xml)
println rootNode.attributes()['version']

При первом запуске произойдет сбой, и вам будет предложено утвердить использование method groovy.util.Node attributes, но после подтверждения будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...