Дженкинс - как установить атрибут XML и затем записать обратно в файл XML - PullRequest
0 голосов
/ 13 июня 2019

Исходя из моего последнего поста здесь , где мне было показано, как читать атрибут 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']

Кажется, теперь у меня та же проблема с записью атрибута обратно.

После в этом посте Я попробовал следующее, чтобы установить атрибут ..

 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 Ответ

1 голос
/ 13 июня 2019

После еще одного тестирования, которое я обнаружил, мы можем просто использовать селектор @ внутри доступа [] (Редактировать: он называется обозначение карты ), кажется, что песочница сценария может справиться с этим.Это переводится как 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
...