Jenkinsfile XmlParser (). ParseText (xml_file) не работает с XML именами узлов - PullRequest
0 голосов
/ 13 января 2020

необходимо для извлечения некоторого значения из файла XML. Извлечение инициируется из файла Jenkinsfile. Следующий код прекрасно работает в моем Jenkinsfile:

    def xml_file_contents = new XmlParser().parseText(xml_file)
    def value_i_need_to_extract = xml_file_contents.children()[4].children()[0].children()[0].children()[0].text().toString()

Однако, файл XML, который анализируется, может измениться позже, поэтому обход по именам узлов XML, а не по методу children (), будет быть намного лучшей идеей Однако каждый раз, когда я применяю что-то вроде этого:

    def value_i_need_to_extract = xml_file_contents.nodename.nodename.nodename.nodename.text().toString()

я получаю следующую ошибку:

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

Я пробовал обход по именам узлов с разными файлами XML и разными узлами имена, но результат всегда ошибка.

И эта ошибка появляется, несмотря на то, что я одобрил все функции безопасности, необходимые для утверждения сценариев в процессе работы Jenkins.

Примеры проблем:

Код A:

def remote_repo = xml_file_contents.children()[3].children()[0].children()[0].children()[0]
echo 'Remote repository is:' + remote_repo.toString()

Выход A:

Remote repository is:remote[attributes={}; value=[http://LAPTOP/svn/localrepo/app/component/RC]]

Код B:

def remote_repo = xml_file_contents.children()[3].children()[0].children()[0].children()[0].text()
echo 'Remote repository is:' + remote_repo.toString()

Выход B:

Remote repository is:http://LAPTOP/svn/localrepo/app/component/RC

Код C:

def remote_repo = xml_file_contents.children()[3].children()[0].children()[0].remote.text()

Выход C:

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

Знаете ли вы, что может быть причина такого поведения? Есть ли способ пройти XML по именам узлов?

Образец XML Файл:

    <?xml version='1.1' encoding='UTF-8'?>
    <project>
      <description>Just a sample build job</description>
      <keepDependencies>false</keepDependencies>
      <properties>
        <hudson.plugins.jira.JiraProjectProperty plugin="jira@3.0.11"/>
      </properties>
      <scm class="hudson.scm.SubversionSCM" plugin="subversion@2.12.2">
        <locations>
          <hudson.scm.SubversionSCM_-ModuleLocation>
            <remote>http://LAPTOP/svn/localrepo/subfolder/componentname/RC</remote>
            <credentialsId>justsomeid</credentialsId>
            <local>.</local>
            <depthOption>infinity</depthOption>
            <ignoreExternalsOption>true</ignoreExternalsOption>
            <cancelProcessOnExternalsFail>true</cancelProcessOnExternalsFail>
          </hudson.scm.SubversionSCM_-ModuleLocation>
        </locations>
        <excludedRegions></excludedRegions>
        <includedRegions></includedRegions>
        <excludedUsers></excludedUsers>
        <excludedRevprop></excludedRevprop>
        <excludedCommitMessages></excludedCommitMessages>
        <workspaceUpdater class="hudson.scm.subversion.UpdateUpdater"/>
        <ignoreDirPropChanges>false</ignoreDirPropChanges>
        <filterChangelog>false</filterChangelog>
        <quietOperation>true</quietOperation>
      </scm>
      <canRoam>true</canRoam>
      <disabled>false</disabled>
      <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
      <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
      <triggers/>
      <concurrentBuild>false</concurrentBuild>
      <builders/>
      <publishers>
        <hudson.plugins.ws__cleanup.WsCleanup plugin="ws-cleanup@0.37">
          <patterns class="empty-list"/>
          <deleteDirs>false</deleteDirs>
          <skipWhenFailed>false</skipWhenFailed>
          <cleanWhenSuccess>true</cleanWhenSuccess>
          <cleanWhenUnstable>true</cleanWhenUnstable>
          <cleanWhenFailure>true</cleanWhenFailure>
          <cleanWhenNotBuilt>true</cleanWhenNotBuilt>
          <cleanWhenAborted>true</cleanWhenAborted>
          <notFailBuild>false</notFailBuild>
          <cleanupMatrixParent>false</cleanupMatrixParent>
          <externalDelete></externalDelete>
          <disableDeferredWipeout>false</disableDeferredWipeout>
        </hudson.plugins.ws__cleanup.WsCleanup>
      </publishers>
      <buildWrappers/>
    </project>

Ответы [ 2 ]

0 голосов
/ 14 января 2020

На моей консоли Groovy работает:

def xml_file = """<?xml version='1.1' encoding='UTF-8'?>
    <project>
      <description>Just a sample build job</description>
      <keepDependencies>false</keepDependencies>
      <properties>
        <hudson.plugins.jira.JiraProjectProperty plugin="jira@3.0.11"/>
      </properties>
      <scm class="hudson.scm.SubversionSCM" plugin="subversion@2.12.2">
        <locations>
          <hudson.scm.SubversionSCM_-ModuleLocation>
            <remote>http://LAPTOP/svn/localrepo/subfolder/componentname/RC</remote>
            <credentialsId>justsomeid</credentialsId>
            <local>.</local>
            <depthOption>infinity</depthOption>
            <ignoreExternalsOption>true</ignoreExternalsOption>
            <cancelProcessOnExternalsFail>true</cancelProcessOnExternalsFail>
          </hudson.scm.SubversionSCM_-ModuleLocation>
        </locations>
        <excludedRegions></excludedRegions>
        <includedRegions></includedRegions>
        <excludedUsers></excludedUsers>
        <excludedRevprop></excludedRevprop>
        <excludedCommitMessages></excludedCommitMessages>
        <workspaceUpdater class="hudson.scm.subversion.UpdateUpdater"/>
        <ignoreDirPropChanges>false</ignoreDirPropChanges>
        <filterChangelog>false</filterChangelog>
        <quietOperation>true</quietOperation>
      </scm>
      <canRoam>true</canRoam>
      <disabled>false</disabled>
      <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
      <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
      <triggers/>
      <concurrentBuild>false</concurrentBuild>
      <builders/>
      <publishers>
        <hudson.plugins.ws__cleanup.WsCleanup plugin="ws-cleanup@0.37">
          <patterns class="empty-list"/>
          <deleteDirs>false</deleteDirs>
          <skipWhenFailed>false</skipWhenFailed>
          <cleanWhenSuccess>true</cleanWhenSuccess>
          <cleanWhenUnstable>true</cleanWhenUnstable>
          <cleanWhenFailure>true</cleanWhenFailure>
          <cleanWhenNotBuilt>true</cleanWhenNotBuilt>
          <cleanWhenAborted>true</cleanWhenAborted>
          <notFailBuild>false</notFailBuild>
          <cleanupMatrixParent>false</cleanupMatrixParent>
          <externalDelete></externalDelete>
          <disableDeferredWipeout>false</disableDeferredWipeout>
        </hudson.plugins.ws__cleanup.WsCleanup>
      </publishers>
      <buildWrappers/>
    </project>"""

def xml_file_contents = new XmlParser().parseText(xml_file)
println xml_file_contents.scm.locations[0].children()[0].remote.text()

Вывод:

http://LAPTOP/svn/localrepo/subfolder/componentname/RC
0 голосов
/ 13 января 2020

XmlParser не должен использоваться , поскольку он не сериализуется (он работает только в главном узле, который не должен иметь исполнителей).

К сожалению, Jenkins не предлагает сериализуемый шаг, как это происходит с JSON и YAML (см. Pipeline Utility Steps ).

Если вы можете превратить ваш XML в JSON или YAML, вы сможете используйте шаги readJSON / readYaml соответствующим образом, и вам также будет легче перемещаться по ним. Если это невозможно, вы должны написать небольшую утилиту, которая поможет вам обрабатывать файлы XML: таким образом вы сможете запускать сценарий конвейера на агентах, которые не являются главным узлом.

...