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

Jenkins Pipeline使用XmlUtil.serialize报NotSerializableException异常

解决Jenkins Pipeline中XmlSlurper序列化异常问题

问题原因

Jenkins流水线依赖序列化/反序列化机制实现断点续跑,所有在流水线中传递的对象必须支持序列化。而groovy.util.slurpersupport.NodeChild(XmlSlurper解析生成的XML节点对象)本身不具备序列化能力,当流水线尝试保存该对象状态时就会抛出java.io.NotSerializableException。之前添加@NonCPS注解无效,大概率是因为注解覆盖范围不对——如果方法中包含Jenkins的CPS步骤(如readFile、writeFile),@NonCPS会失效,因为这类步骤依赖CPS转换逻辑,无法在非CPS方法中执行。

解决方法

将XML解析、修改、序列化的核心逻辑单独封装在@NonCPS注解的方法中,仅处理字符串输入输出;Jenkins的文件读写操作(readFile、writeFile)放在注解方法外部执行,避免CPS步骤与非CPS逻辑混合。

修改后的完整代码:

pipeline {
    agent {
        label 'agent-1'
    }

    stages {
        stage('Update File') {
            steps {
                script {
                    // 读取文件(CPS步骤,放在非@NonCPS区域)
                    def originalContent = readFile(file: filePath)
                    // 调用@NonCPS方法处理XML,输入输出均为可序列化的字符串
                    def modifiedContent = updateXml(originalContent)
                    // 写入文件(CPS步骤,放在非@NonCPS区域)
                    writeFile(file: filePath, text: modifiedContent)
                }
            }
        }
    }
}

// 仅处理XML逻辑,不包含任何Jenkins CPS步骤
@NonCPS
def updateXml(String originalXml) {
    def xml = new XmlSlurper().parseText(originalXml)
    
    // 在这里添加你的XML更新逻辑,示例:
    // xml.settings.version = "1.0.1"
    
    // 序列化XML节点为字符串返回
    return XmlUtil.serialize(xml)
}

关键说明

  • @NonCPS注解的方法不能调用任何Jenkins提供的CPS步骤(如readFile、sh、writeFile等),只能使用Groovy原生API。
  • 注解方法的输入和输出必须是可序列化的类型(如字符串、数字、列表等),避免传递非序列化对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:30:24