Jenkins无法执行Windows VM上的Jar文件,本地CMD正常运行求助
你遇到的这个情况很典型——手动登录虚拟机能正常跑,但Jenkins用PsExec远程执行就报错错误码1,大概率是执行上下文、环境或会话差异导致的,下面是几个常见的排查方向:
1. 执行用户权限与环境变量差异
Jenkins远程执行PsExec时,默认用的是Jenkins服务的运行用户(通常是本地系统账户或者专门的Jenkins服务账户),而你手动登录用的是自己的用户账户,两者的权限和环境变量可能完全不同:
- 权限问题:Jenkins的执行用户可能没有访问
c:\selenium\testautomation目录的权限,或者没有执行Java程序的权限。可以尝试在PsExec命令里指定和你手动登录相同的用户,比如:psexec \\W100001VM.corporate.abc.com -u DOMAIN\YourUsername -p YourPassword java -jar c:\selenium\testautomation\testautomation-3.0.0-20191018.3457.jar DEV RI - 环境变量问题:Jenkins执行用户的PATH里可能没有Java的路径,导致找不到
java.exe。可以试试用Java的完整路径替代java,比如:psexec \\W100001VM.corporate.abc.com "C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -jar c:\selenium\testautomation\testautomation-3.0.0-20191018.3457.jar DEV RI
2. 工作目录不匹配
你手动执行时是在c:\selenium\testautomation目录下运行命令,而PsExec默认的工作目录可能是系统盘的Windows目录(比如C:\Windows\System32),如果Jar依赖当前目录的配置文件,就会找不到文件报错。解决方法是指定工作目录:
psexec \\W100001VM.corporate.abc.com -w c:\selenium\testautomation java -jar testautomation-3.0.0-20191018.3457.jar DEV RI
-w参数就是指定PsExec执行时的工作目录。
3. Selenium需要GUI交互会话
Selenium运行需要浏览器的GUI环境,而Jenkins用PsExec远程执行时,默认会在Windows的Session 0(无交互会话)里运行,这个会话没有桌面环境,浏览器无法启动,导致Jar报错退出。解决方法:
- 确保虚拟机的用户会话处于登录状态(不要锁屏),然后用PsExec指定连接到当前交互会话,添加
-i参数:
这里的psexec \\W100001VM.corporate.abc.com -i 1 java -jar c:\selenium\testautomation\testautomation-3.0.0-20191018.3457.jar DEV RI1是会话ID,可以通过在虚拟机上运行query user命令查看当前登录用户的会话ID。
4. 捕获详细错误日志
目前只知道错误码1,但Java的具体报错信息没被捕获到,这很难定位问题。可以把Java的标准错误输出重定向到日志文件,方便排查:
psexec \\W100001VM.corporate.abc.com java -jar c:\selenium\testautomation\testautomation-3.0.0-20191018.3457.jar DEV RI > c:\selenium\testautomation\jenkins_test.log 2>&1
执行完后查看jenkins_test.log文件,里面会有Java的具体报错信息,比如找不到依赖、权限不足、浏览器启动失败等。
5. 路径或参数转义问题
如果Jar路径或者参数里有空格,需要用引号包裹,比如如果Java路径有空格:
psexec \\W100001VM.corporate.abc.com "\"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe\"" -jar "\"c:\selenium\testautomation\testautomation-3.0.0-20191018.3457.jar\"" DEV RI
注意这里的引号转义,不同的执行环境可能需要调整引号的写法。
你可以按照上面的顺序一步步排查,先尝试捕获详细日志,再检查用户权限和工作目录,应该能很快定位到问题。
内容的提问来源于stack exchange,提问作者Surya Guntupalli

