如何在不调用静态方法的情况下在Groovy Jenkins文件中转义XML字符

时间:2016-11-15 01:01:57

标签: jenkins groovy jenkinsfile

在我的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"过了这个。

0 个答案:

没有答案
相关问题