Jenkins Pipeline报错:String.filterLine()不匹配CpsClosure2参数求助
问题分析与解决方案
错误核心原因
你遇到的MissingMethodException本质是调用对象类型不匹配:
currentBuild.rawBuild.log返回的是普通字符串(java.lang.String),而filterLine()是Groovy中针对Reader/InputStream这类可逐行迭代对象的方法,字符串没有这个方法,因此报错。- 至于
org.jenkinsci.plugins.workflow.cps.CpsClosure2,这只是Jenkins Pipeline对闭包做CPS序列化后生成的类名,它就是你写的{ line -> line.contains(...) }这个过滤闭包,不是问题根源。
修正代码方案
方案1:分割日志字符串后过滤
直接把日志按行拆分,再筛选匹配内容:
failure { script { def logContent = currentBuild.rawBuild.log // 按行分割日志,过滤包含指定字符串的行 def matchedLines = logContent.split('\n').findAll { line -> line.contains('my search string') } // 找到匹配行则重试构建 if (matchedLines.size() > 0) { retry(1) { // 注意:不要直接写stage('build'),要执行阶段内的实际逻辑 // 示例:调用封装好的构建函数 runBuildStage() } } } } // 把build阶段的逻辑封装成可复用函数 def runBuildStage() { stage('build') { // 这里放你原来build阶段的所有步骤,比如: sh 'mvn clean package' // ...其他构建操作 } }
方案2:用批准的getLog()方法获取日志流
利用你已审批的hudson.model.Run getLog方法,获取可逐行读取的日志对象:
failure { script { // 获取最后1000行日志(参数可根据需求调整) def logReader = currentBuild.rawBuild.getLog(1000) def hasMatch = false logReader.eachLine { line -> if (line.contains('my search string')) { hasMatch = true // 找到匹配后提前终止遍历 return } } if (hasMatch) { retry(1) { runBuildStage() } } } } def runBuildStage() { stage('build') { // 原build阶段逻辑 sh 'mvn clean package' } }
关键注意点
- 不要直接在
retry块里写stage('build'),这只是声明阶段,不会执行阶段内的实际步骤,必须把构建逻辑封装成函数调用。 - 检查匹配结果时,用
matchedLines.size() > 0或hasMatch比data != null更准确,因为空过滤结果会返回空列表而非null。
内容的提问来源于stack exchange,提问作者Olivia Brown
相关产品推荐
相关产品推荐

