L'analyse d'un fichier XML dans un pipeline Jenkins
J'ai un fichier XML que je voudrais utiliser comme entrée pour un pipeline de script. Le problème est le parseur xml n'est pas sérialisable donc je l'ai mis dans un NonCPS fonction, mais j'ai perdu le Nœud de l'objet à cause de cela.
C'est le pipeline de script:
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
}
C'est un échantillon d'entrée:
<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>
C'est le résultat:
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
Je suis en utilisant Jenkins 2.7 pipeline 2.1, qui sont actuellement les plus récentes.
C'est peut-être mieux formater la configuration en groovy, plutôt qu'en XML et de la charge comme n'importe quel autre morceau de code...
OriginalL'auteur towel | 2016-06-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser XmlSlurper, ça fonctionne pour moi.
OriginalL'auteur Kirill
De branche qui est l'élément racine, vous n'avez pas besoin de le spécifier explicitement lors de l'accès à votre analysé les nœuds
Essayez de changer
À
Imprimer le stade de nœuds
MissingPropertyException
. En fait mon problème est avec la sérialisation - je n'ai pas encore appris comment puis-je garder legroovy.util.Node
objet denew XmlParser().parseText(readFile(path))
sans la transformer en une chaîne de caractèresqu'entendez-vous par "garder"?
Je voulais dire que je voulais le Nœud de l'objet lui-même à être renvoyé (ainsi, la déclaration à la fonction), mais au lieu de cela je l'ai perdu et a obtenu sa représentation sous forme de chaîne en tant que valeur de retour
OriginalL'auteur tim_yates
Un
@NonCPS
méthode ne doit accepter ou de retourSerializable
types. Essayer de retourner.branch
de la méthode.new XmlParser().parseText(readFile(path))
semble être ignoré...je pourrais le type de ce que je voulais et encore obtenu l'ensemble du contenu du fichier sous forme de chaîne (j'ai essayé.branch
,.branch[0]
,branch[0].stage[1]
... même.nonExistentTag
)OriginalL'auteur Jesse Glick
À la fin, je pense que mon approche était erronée: j'ai décidé de convertir le fichier XML dans un autre script groovy et de le charger dans le pipeline
Mise à jour: Récemment, les gens ont commencé à éditer ma réponse pour plus de clarté, mais le fait est que j'ai juste abandonné le stockage de ma configuration dans des fichiers XML et opté pour des scripts groovy, ce qui m'a donné plus de flexibilité. Je comprends qu'il ne peut pas être une pratique courante, mais elle convient parfaitement à mes besoins.
Par exemple - au lieu de:
J'ai utilisé:
Et dans le pipeline de script:
J'espère que c'est une meilleure réponse 🙂
OriginalL'auteur towel