在我的Jenkinsfile中,我需要构造一个由参数值组成的XML字符串。一些值需要" xml转义"所以可以将它们设置为XML属性。
一种显而易见的简单方法是调用" XmlUtil.escapeXml(text)" (虽然我猜这不会做空格)。
然而,这在高级别失败,因为Jenkinsfile不允许调用静态方法。
在Jenkinsfile中执行此类操作的最简单策略是什么?
更新:
在记住了一些更多的Groovy原则之后,我意识到MarkupBuilder将是解决方案,但它甚至不允许:"脚本不允许使用新的groovy.xml.MarkupBuilder"。
更新:
好的,我已经能够覆盖安全限制,但现在我发现在Pipeline DSL中使用MarkupBuilder DSL存在问题。
我在Jenkinsfile的末尾定义了以下方法(在整个"节点"块之后):
def constructMessageXML(String qid, String qpassword, String contactID, String text, boolean isMeeting) {
def writer = new StringWriter()
MarkupBuilder mb = new MarkupBuilder(writer)
mb.message (type:"contact.send.message", id:qid, password:qpassword, contactId:contactID) {
statement (isMeeting ? [from:qid, to:contactID, text:text, type:"meeting"] : [from:qid, to:contactID, text:text]) {}
}
return writer.toString()
}
我在groovyConsole中对此进行了测试,它运行正常。
但是,当我运行调用此方法的作业时,我会得到以下结果:
java.lang.NoSuchMethodError:没有这样的DSL方法'陈述'发现 步骤之间[VersionNumber,archive,awaitDeployment,...
所列出的步骤来自Pipeline DSL,因此看来" methodMissing"查找将转到Pipeline DSL,而不是MarkupBuilder类。
请注意,我尝试添加" @ NonCPS"到方法定义。这没有任何区别。
更新:
我找到了解决方法。改变"陈述" to" delegate.statement"过了这个。