You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins Pipeline中正确使用groovy.xml.StreamingMarkupBuilder?

解决Jenkins Pipeline中使用StreamingMarkupBuilder创建标签的问题

问题原因

Jenkins Pipeline的CPS转换机制会优先将闭包内的方法调用识别为Jenkins DSL步骤(比如stage、steps这类),而非Groovy MarkupBuilder的标签方法,因此直接使用span {}会被误判为不存在的DSL方法;加@NonCPS后报错通常是因为注解位置或方法结构不正确。

可行解决方案

通过将HTML标签生成逻辑封装到带@NonCPS注解的独立方法中,避免Jenkins对该部分代码进行DSL解析:

// 封装纯Groovy的HTML标签生成逻辑,@NonCPS标记后不会被Jenkins CPS转换处理
@NonCPS
def wrapTextWithSpan(String content) {
    def markupBuilder = new groovy.xml.StreamingMarkupBuilder()
    // 这里的span会被Groovy正确识别为HTML标签生成方法
    def spanMarkup = markupBuilder.bind {
        span {
            mkp.yield(content)
        }
    }
    // 转换为字符串方便后续写入HTML文件
    return spanMarkup.toString()
}

// 在Pipeline步骤中调用该方法
pipeline {
    agent any
    stages {
        stage('Generate HTML') {
            steps {
                script {
                    def wrappedContent = wrapTextWithSpan("需要放入<span>的内容")
                    // 示例:将生成的span标签写入HTML文件
                    writeFile file: 'output.html', text: "<div>${wrappedContent}</div>"
                }
            }
        }
    }
}

原理说明

  • @NonCPS注解标记的方法会以标准Groovy方式执行,跳过Jenkins的CPS转换和DSL方法解析,因此闭包内的span会被StreamingMarkupBuilder正确识别为创建<span>标签的指令。
  • 该方法仅处理纯Groovy的字符串和XML生成逻辑,不调用任何Jenkins DSL步骤,符合@NonCPS方法的使用规范。

内容的提问来源于stack exchange,提问作者frankM_DN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:20:31