Jenkins Groovy with XMLSlurper错误“无法序列化”

问题描述:

我在Jenksin 2.46.2上,并且有一个使用Active Choices Reactive Parameter的作业。我使用XMLSlurper从XML文件中选择我的第一个服务器,并参考我的第二个选择。当我硬编码服务器名称代码工作正常。当我在代码中使用该变量时,出现错误。Jenkins Groovy with XMLSlurper错误“无法序列化”

此代码:

def serverList = new XmlSlurper().parse("/app/jenkins/jobs/servers.xml") 
def SERVER = 'testserver1' 
def output = [] 
serverList.Server.find { [email protected] == SERVER}.CleanUp.GZIP.File.each{ 
    it.output.add(p) 
} 

return output 

当我从我以前选择的参考变量选择我得到的错误:

def serverList = new XmlSlurper().parse("/app/jenkins/jobs/servers.xml") 
def SERVER = SERVER 
def output = [] 
serverList.Server.find { [email protected] == SERVER}.CleanUp.GZIP.File.each{ 
    it.output.add(p) 
} 

return output 

,我得到的错误是下面。任何想法,为什么我得到一个错误?

WARNING: failed to serialize [[/app/test2/log], [/app/test2/log]] for ...*other text*... net.sf.json.JSONException: There is a cycle in the hierarchy! 

这里是我的XML文件:

<ServerList> 
    <Server name="testserver1"> 
     <CleanUP> 
     <GZIP> 
      <File KeepDays="30">/app/test1/log</File> 
     </GZIP> 
     </CleanUP> 
    </Server> 
    <Server name="testserver2"> 
    <CleanUP> 
     <GZIP> 
     <File KeepDays="30">/app/test2/log</File> 
     </GZIP> 
    </CleanUP> 
    </Server> 
</ServerList> 

NE.jpg

+0

什么是所需的输出? “日志”是? – Rao

+0

谢谢.....结果应该显示: /app/test1/log –

+0

但是你说过,如果你使用'testserver1',那么它已经工作了,那你试图改变什么标准呢? '你是什么意思'我引用我之前选择的变量选择我得到的错误:'? – Rao

下面是你需要的脚本,该脚本读取文件元素的值,并返回一个列表:

def serverList = new XmlSlurper().parse("/app/jenkins/jobs/servers.xml") 
return serverList.'**'.findAll{ it.name() == 'File'}*.text() 

输出:

[/app/test1/log, /app/test2/log] 

编辑:基于OP评论

def server = 'testserver1' 
def serverList = new XmlSlurper().parse("/app/jenkins/jobs/servers.xml") 
def result = serverList.'**'.find{ [email protected] == server}.CleanUP.GZIP.File 
println result 
return result 

EDIT2:

如果你想列表或数组,请尝试以下:

def server = 'testserver1' 
def serverList = new XmlSlurper().parse("/app/jenkins/jobs/servers.xml") 
def result = serverList.'**'.findAll{ [email protected] == server}*.CleanUP.GZIP.File.text() 
println result 
return result 
+0

我刚看到这.....我会试试看,并让你知道。谢谢! –

+0

@RyanJohnson,上面有帮助吗?如果不是,你能澄清需要什么吗? – Rao

+0

@RyanJohnson,你是否想要匹配'testserver1'的文件的值?这将是单个值不是列表。 – Rao