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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:21:04