Jenkins-如何设置XML属性,然后写回XML文件

时间:2019-06-13 10:11:26

标签: jenkins jenkins-pipeline jenkins-groovy

从上一则文章here开始,向我展示了如何读取XML属性,现在我的最后一项任务是设置,例如我将增加read属性,然后写回。

所以,我再次拥有以下XML文件

 <?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="com.mycomp.myapp" ios-CFBundleVersion="15" version="1.3.0.b4" windows-packageVersion="1.2.6.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>My App</name>
    <description>My app description</description>
    <author>mycom.com.au</author>

我了解到,根据帮助,以下内容无效...

def xml = readFile "${env.WORKSPACE}/config.xml"
def rootNode = new XmlParser().parseText(xml)
def version = rootNode.@version

但以下内容会..

def version = rootNode.attributes()['version']

我现在似乎在写回属性时也遇到了同样的问题。

this post之后,我尝试了以下方法来设置属性。

 def filePath = "${env.WORKSPACE}/config.xml"
 def xml = readFile filePath
 def rootNode = new XmlParser().parseText(xml)         
 rootNode.@version = "12345"         
 def writer = new FileWriter(filePath)
 new XmlNodePrinter(new PrintWriter(writer)).print(rootNode)

但是我收到与尝试读取属性时类似的错误...

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field groovy.util.Node version
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onSetAttribute(SandboxInterceptor.java:447)
at org.kohsuke.groovy.sandbox.impl.Checker$9.call(Checker.java:405)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedSetAttribute(Checker.java:411)

我确实在Groovey操场上尝试了一下,但它确实起作用了,但是在詹金斯这里却没有。

因此,它再次看起来.@version语法不起作用,而且我无法找到设置该属性的替代调用(例如获取属性)。

有人对此有任何想法吗?

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在我进行了更多测试之后,我们可以简单地使用@访问权限内的[]选择器(编辑:其名为map notation),似乎脚本沙箱可以处理此问题。在詹金斯允许批准的背景下,它翻译成getAt()putAt()

node() {
    def xml = readFile "${env.WORKSPACE}/config.xml"
    def rootNode = new XmlParser().parseText(xml)
    print rootNode['@version']
    rootNode['@version'] = 123
    print rootNode['@version']
}

结果

Running on Jenkins in /var/jenkins_home/workspace/xmltest
[Pipeline] {
[Pipeline] readFile
[Pipeline] echo
1.3.0.b4
[Pipeline] echo
123
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS