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

