Jenkinsfile执行shell脚本返回exit code 1问题求助
Jenkinsfile 文本提取操作问题修复与注意事项
报错直接原因
你当前执行报错的核心问题是变量作用域混淆:
你代码中logFile是Groovy脚本域存储文件内容的变量,直接在sh块中写echo logFile时,shell进程会将其识别为shell环境变量,而shell环境中不存在该变量,只会输出纯文本logFile,自然无法grep到目标内容,最终返回非0退出码中断流程。
修复方案
有两种常用实现方式可选:
方案1:直接在Groovy域做匹配(性能更优,无跨环境问题)
不需要调用shell,直接对读取到的字符串做筛选:
adminRepoLogLine = logFile.readLines().find { it.contains('Admin repo url is :::') }
方案2:正确传参调用shell执行匹配
如果确实需要走shell处理,需要先把Groovy变量插值到shell命令中,同时指定返回标准输出:
adminRepoLogLine = sh( script: "echo '${logFile}' | grep 'Admin repo url is :::' || true", returnStdout: true ).trim()
其中|| true用于避免grep无匹配时返回非0退出码导致流水线失败,.trim()用于去除返回结果末尾的默认换行符。
Jenkinsfile 此类操作的通用注意事项
- Groovy与shell变量作用域完全隔离:sh块运行在独立的shell子进程中,无法直接读取Groovy域变量,需要通过
${变量名}做Groovy字符串插值把值传入shell;如果变量包含换行、特殊符号,需要用单引号包裹插值后的内容,避免shell误解析。 - sh步骤返回值规则:默认sh步骤返回的是命令执行的退出码(0为成功,非0为失败),如果需要获取命令的标准输出内容,必须显式添加
returnStdout: true参数。 - 非0退出码的中断逻辑:Jenkins默认会将返回非0退出码的步骤判定为执行失败,直接终止流水线,对grep这类无匹配就返回非0的命令,按需添加
|| true避免误中断。 - 路径上下文一致性:
readFile默认读取当前Jenkins工作区根目录的文件,sh步骤如果切换了工作目录,要注意输出文件的路径是否和readFile的读取路径匹配。 - 双重转义规则:如果sh命令用双引号包裹,Groovy会先做一次字符串解析,shell进程会再做一次解析,引号、反斜杠等特殊符号需要做双重转义,推荐不需要插值的场景优先用单引号包裹shell命令,降低转义复杂度。
内容的提问来源于stack exchange,提问作者Suraj Menon
相关产品推荐
相关产品推荐

