Jenkins Pipeline替代XmlSlurper

时间:2017-12-12 10:19:11

标签: xml jenkins jenkins-pipeline

我需要在我的管道中创建一个步骤来获取Xml文件并在其上更改特定元素(基于变量和其他构建输出),然后再进行下一步。

虽然我可以轻松地创建一个C#或Java程序,但我决定尝试在我的管道中添加一个新步骤并直接处理Xml。

根据这些帖子,我面临的问题是XmlSlurper尚未列入白名单:

  • https://issues.jenkins-ci.org/browse/JENKINS-33024

      

    XmlSlurper太有问题,不会受到支持。   它对线程上下文类加载器问题很敏感,这可能会导致显然不相关的插件出现神秘错误。某些方法也不适合白名单。

目前我必须处理一些文件,这没关系。 Jenkins Pipeline Utility Steps已经提供了一些函数来读取和处理JSON。但XmlSlurper或与此相关的任何内容都没有其他选择。

不幸的是我正在处理一些我无法更改为JSON的工具,并且由于XML仍在使用,是否有人知道XmlSlurper 的任何替代方案?

我宁愿不尝试手动处理这些XML,比如处理正则表达式。

1 个答案:

答案 0 :(得分:0)

在groovy的共享库中将XML转换为json。我在src / org / config的共享库中有一个名为GroovyUtils的类。

package org.config

import groovy.text.SimpleTemplateEngine
import java.nio.charset.StandardCharsets
import groovy.json.JsonSlurper
import org.json.JSONObject
import org.json.XML
import java.util.ArrayList
import hudson.model.*;

public class GroovyUtils implements Serializable {
    def engine = new SimpleTemplateEngine()
    def config
    def steps

    def GroovyUtils(config, steps) {
        this.config = config
        this.steps = steps
    }

    def log(msg){
        steps.println(msg)
    }

    def getFinalAttr(thingToSearchFor){
        def fileContents = new File("YourXMLFile.xml").text;
        def json = xmlToJson(fileContents);
        def jsonObj = new JsonSlurper().parseText(json)
        def foo = jsonObj["someAttr"].someArr["anotherArr"]
        def bar = foo.find { it.name == thingToSearchFor }
        return bar.finalAttr
    }

    def xmlToJson(input) {
        JSONObject xmlJSONObj = XML.toJSONObject(input)
        return xmlJSONObj.toString(2)
    }
}

上面的关键方法是getFinalAttr(thingToSearchFor)。

对foo和bar局部变量的分配将取决于您的jsonObj的结构,但向您显示可以遍历它以获取所需的内容。