繁体   English   中英

Jenkins Windows从属节点上无法识别'mvn'命令

[英]'mvn' command not recognized on Jenkins Windows slave node

我正在尝试在Jenkins Windows从属节点上构建一个Java项目,当我尝试从Jenkins服务在从属服务器上运行任何mvn命令时,我收到一条错误消息,指出无法找到该命令:

java.io.IOException: Cannot run program "mvn": CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
...

注意:如果我直接登录到机器,运行任何mvn命令都可以正常工作。

Windows从节点设置

Maven安装在目录D:\\Apache\\Maven

设置系统环境变量:

  • JAVA_HOME = C:\\Program Files\\Java\\jdk1.8.0_40
  • M2 = %M2_HOME%\\bin
  • M2_HOME = D:\\Apache\\Maven

PATH系统环境变量设置为%M2%;...

在Jenkins master的网页上,如果我在Windows从属节点上运行Groovy脚本println System.getenv("PATH") ,我可以看到它具有Maven的bin目录的正确扩展路径。

我还可以通过运行以下命令来验证Maven的bin目录:

Groovy脚本: println "ls -al D:/Apache/Maven/bin".execute().text

 total 14 drwxr-xr-x 8 D-AUN-00 Administ 4096 Apr 20 12:35 . drwxr-xr-x 9 D-AUN-00 Administ 4096 Mar 31 11:46 .. -rw-r--r-- 1 D-AUN-00 Administ 230 Mar 31 11:46 m2.conf -rwxr-xr-x 1 D-AUN-00 Administ 7085 Apr 20 11:49 mvn -rw-r--r-- 1 D-AUN-00 Administ 6007 Mar 31 11:46 mvn.cmd -rwxr-xr-x 1 D-AUN-00 Administ 1796 Mar 31 11:46 mvnDebug -rw-r--r-- 1 D-AUN-00 Administ 1513 Mar 31 11:46 mvnDebug.cmd -rwxr-xr-x 1 D-AUN-00 Administ 1843 Mar 31 11:46 mvnyjp 

奇怪的是,如果我用mvn.cmd运行Maven,那么Maven运行得很好:

Groovy脚本: println "mvn.cmd --version".execute().text

 Apache Maven 3.3.1 (cab6659f9874fa96462afef40fcf6bc033d58c1c; 2015-03-13T15:10:27-05:00) Maven home: D:\\Apache\\Maven Java version: 1.8.0_40, vendor: Oracle Corporation Java home: C:\\Program Files\\Java\\jdk1.8.0_40\\jre Default locale: en_US, platform encoding: Cp1252 OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos" 

问题:是否存在我缺少或未正确设置会导致mvn命令无法识别的问题?


编辑:我正在运行的构建使用自定义Python bash脚本来调用Maven。 该脚本还设置为运行其他语言(PHP,Ruby,.NET,Node)项目的构建,并且这些构建的工具都可以正常工作( composerbundledevenv.com )。 但是,我认为如果从属节点的脚本控制台在尝试运行mvn命令时返回相同的错误,那么构建的执行方式也无关紧要。


编辑2:我对此的研究越多,我就越不认为这与Jenkins有什么关系,而是与在Windows上执行shell脚本的方式有关。 当我使用脚本控制台在从属节点上调用Groovy脚本时,Jenkins只是将其写入从属节点上的临时文件并使用sh -xe <script>来调用它。 当我在Windows机器上直接尝试类似的方法时,每个基于脚本的命令(例如mvncomposer )都无法在shell脚本中运行,除非我在命令前加上sh 这很不幸,因为我正在运行的脚本将来可能会在Linux或Mac节点上运行,而我宁愿不使用特定于Windows的命令。 我用Git Bash和Msysgit尝试了这个,我得到了相同的结果。 接下来,我将尝试Cygwin看看它是否有效......

Jenkins主服务器和客户端上的maven安装文件夹应该相同。 检查主站和从站上的文件夹位置是否相同。

除了你的环境。 属性是正确的,但请检查是否已在用户或系统属性下添加了属性。 如果您已在用户下添加属性并将Jenkins从属服务器作为Windows服务启动,我不认为Jenkins会获取这些值。

事实证明,这与在不同工具的上下文中如何在Windows上调用shell命令有关。

Jenkins脚本控制台和Groovy

在Jenkins中,当使用Windows节点的脚本控制台时 ,Groovy脚本将调用脚本命令,就好像它们是Win32应用程序或BATCH脚本调用一样(例如"mvn --version".execute()将无效,因为mvn是一个shell脚本 - "mvn.cmd --version".execute()将起作用,因为mvn.cmd是一个BATCH脚本)。

在Windows节点上运行Groovy脚本命令时,需要使用sh前缀使用shell脚本的命令才能显式化。 这假设您的Windows节点在其PATH系统环境变量中具有指向shell可执行文件的PATH

示例Groovy脚本在Windows节点上调用时有效:

println "sh mvn --version".execute().text

Windows上的Python

我也意识到我的Python构建脚本遇到了类似的问题。 如果您尝试在Windows上运行通过subprocess调用shell脚本的Python脚本,除非在调用中包含shell=True ,否则它将无效。 或者,您可以在命令前加上sh以显式调用shell

注意:这不会像一些工具的工作bundle的Ruby -这些命令,利用shell=True好像只是工作。

在Windows上的shell环境中调用时可以使用的示例Python脚本:

#!/usr/bin/env python
import subprocess
subprocess.call("mvn --version", shell=True)

我解决了这个问题,在Execute Shell窗口标题中添加“#!/ usr / bin / env zsh --login”。 这很容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM