Parsing an XML file in the Jenkins pipeline

I have an XML file that I would like to use as input for the script pipeline. The problem is that XMLParser is not serializable, so I put it in a NonCPS function, but because of this I lost the Node object.

This is the script pipeline:

def buildPlanPath = 'C:\\buildPlan_test.xml' @NonCPS groovy.util.Node getBuildPlan(path) { new XmlParser().parseText(readFile(path)) } node { //def buildPlan = new XmlParser().parseText(readFile(buildPlanPath)) groovy.util.Node buildPlan = getBuildPlan(buildPlanPath) println buildPlan.getClass() println buildPlan println buildPlan.branch } 

This is an example input:

 <branch name='mybranch'> <stage> <job name='job11' /> <job name='job12' /> </stage> <stage> <job name='job21' /> <job name='job22' /> <job name='job23' /> </stage> <stage> <job name='job31' /> </stage> </branch> 

This is the result:

 Started by user admin [Pipeline] node Running on master in C:\Jenkins\workspace\pipeline-develop [Pipeline] { [Pipeline] readFile [Pipeline] echo class java.lang.String [Pipeline] echo <branch name='mybranch'> <stage> <job name='job11' /> <job name='job12' /> </stage> <stage> <job name='job21' /> <job name='job22' /> <job name='job23' /> </stage> <stage> <job name='job31' /> </stage> </branch> [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline groovy.lang.MissingPropertyException: No such property: branch for class: java.lang.String at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53) at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458) at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:25) at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:17) at WorkflowScript.run(WorkflowScript:16) at ___cps.transform___(Native Method) at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:62) at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30) at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:54) at sun.reflect.GeneratedMethodAccessor327.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21) at com.cloudbees.groovy.cps.Next.step(Next.java:58) at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154) at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:164) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:276) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.java:78) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:185) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:183) at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47) at java.util.concurrent.FutureTask.run(Unknown Source) at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Finished: FAILURE 

I am using Jenkins 2.7 with pipeline 2.1, which are currently the latest.

+3
source share
4 answers

In the end, I think my approach was wrong: I decided to convert the XML file to a separate groovy script and load it into the pipeline

0
source

You can use XmlSlurper, it works for me.

 def xmlText = new XmlSlurper().parse(MyURL) xmlText.data.artifact.each {****** 
+1
source

As the branch is the root element, you do not need to explicitly specify it when accessing your node parsing

Try to change

 println buildPlan.branch 

For

 println buildPlan.stage 

To print scene nodes

0
source

A @NonCPS method must accept or return Serializable types. Try returning .branch from the method.

0
source

All Articles