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

Groovy读取AssemblyFileVersion后Jenkins报序列化异常,求解决方案

Jenkins Pipeline获取AssemblyFileVersion时遇NotSerializableException的解决办法

你这段代码能成功提取并打印AssemblyFileVersion,但后续构建步骤失败,核心原因是java.util.regex.Matcher类不支持序列化——Jenkins Pipeline会在各个阶段之间序列化保存上下文状态,而你的versionMatch变量是Matcher实例,Jenkins尝试序列化它时就会抛出NotSerializableException,导致流水线中断。

这里提供两种可靠的解决方法:

方法一:用@NonCPS注解封装版本提取逻辑

把匹配和提取版本的逻辑放到带@NonCPS注解的函数中,这个注解会告诉Jenkins不要序列化该函数内部的对象,彻底规避Matcher的序列化问题:

@NonCPS
def getAssemblyFileVersion(String filePath) {
    def content = readFile(filePath)
    def versionPattern = /AssemblyFileVersion\("([^"]+)"\)/
    def versionMatch = content =~ versionPattern
    return versionMatch[0][1]
}

// 在构建阶段中调用函数
def newbuildversion = getAssemblyFileVersion(assemblyfile)
echo "AssemblyFileversion Version: ${newbuildversion}"

方法二:直接一次性提取版本,不保留Matcher变量

如果不想封装函数,可以直接将匹配和提取操作合并为一行,不让Matcher对象留在流水线的上下文中:

def newbuildversion = (readFile(assemblyfile) =~ /AssemblyFileVersion\("([^"]+)"\)/)[0][1]
echo "AssemblyFileversion Version: ${newbuildversion}"

采用任意一种方法后,流水线上下文里就不会留存不可序列化的Matcher实例,Jenkins可以正常保存状态,后续的bat构建步骤就能顺利执行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:56:08