1

在我的 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:在步骤 [VersionNumber、archive、awaitDeployment、...

列出的步骤来自 Pipeline DSL,因此“methodMissing”查找似乎将转到 Pipeline DSL,而不是 MarkupBuilder 类。

请注意,我尝试将“@NonCPS”添加到方法定义中。那没什么区别。

更新

我已经找到了解决方案。将“statement”更改为“delegate.statement”可以解决这个问题。

4

0 回答 0