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

Jenkins Pipeline Groovy脚本调用pwd进程报错求助

问题原因分析与解决方案

这个问题我之前也碰到过,核心原因是Jenkins的sh步骤和Groovy原生execute()方法的运行环境存在本质差异,具体拆解如下:

1. 执行环境的本质区别

  • sh 'pwd'的运行逻辑:Jenkins的sh步骤会在目标节点上启动一个标准的shell环境(比如Linux的bash、Windows上的Git Bash/WSL/Cygwin),这个shell环境内置了pwd命令,并且会自动处理跨平台的命令适配,所以能正常执行。
  • "pwd".execute()的运行逻辑:Groovy的execute()方法是直接调用操作系统的原生进程,没有经过shell层的解析。如果你的Jenkins节点是Windows系统,Windows原生并没有pwd.exe这个可执行文件,系统找不到对应命令,就会抛出CreateProcess error=2的错误。

2. 环境变量PATH的差异

即使你的Windows节点安装了Git Bash这类包含pwd命令的工具,Groovy的execute()使用的是JVM进程的PATH环境变量,这个PATH可能没有包含Git Bash等工具的安装路径;而Jenkins的sh步骤会加载shell自身的环境变量,所以能找到pwd命令。

推荐的解决方案

方案一:用Groovy原生API获取路径(最推荐)

完全不需要调用外部进程,直接用Groovy自带的方法获取当前工作目录,跨平台且高效:

def currentPath = new File(".").absolutePath.trim()
// 或者
def currentPath = System.getProperty("user.dir").trim()

方案二:通过Jenkinssh步骤捕获输出

利用Jenkins的sh步骤自带的跨平台适配能力,直接捕获命令输出:

def currentPath = sh(script: 'pwd', returnStdout: true).trim()

方案三:Groovy中显式调用shell执行命令

如果一定要用Groovy的execute(),需要明确指定shell来解析命令,适配不同操作系统:

def os = System.getProperty('os.name').toLowerCase()
def currentPath
if (os.contains('win')) {
    // Windows下用cmd的cd命令获取当前目录,或者调用Git Bash的pwd
    currentPath = "cmd /c cd".execute().text.trim()
    // 或者用Git Bash:"C:/Program Files/Git/bin/bash.exe -c pwd".execute().text.trim()
} else {
    // Linux/macOS下调用bash执行pwd
    currentPath = "/bin/bash -c pwd".execute().text.trim()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:02:50