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
相关产品推荐
相关产品推荐

