2015-04-20 199 views
3

我试图在Jenkins Windows从属节点上构建一个Java项目,并且当我尝试从Jenkins服务对从属节点运行任何mvn命令时,错误消息,命令无法找到:在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主页的网页上,如果我在Windows从节点上运行Groovy脚本println System.getenv("PATH"),我可以看到它具有正确的扩展路径,用于Maven的bin目录。

Groovy脚本:

我还可以验证Maven的bin目录可以通过运行下面可以看到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)项目的构建,并且这些构建的工具都可以正常工作(composerbundle,devenv.com)。但是,如果在尝试运行mvn命令时,从节点的脚本控制台返回相同的错误,我认为构建的执行方式应该没有关系。


编辑2:我越考虑这一点,少我觉得这有什么关系詹金斯多用怎样的shell脚本在Windows上执行的事情。当我使用脚本控制台调用从节点上的Groovy脚本时,Jenkins只是将它写到从节点上的临时文件中,并使用sh -xe <script>来调用它。当我在Windows计算机上直接尝试类似的方法时,除非我在sh之前加上命令,否则每个基于脚本的命令(例如mvn,composer)都无法从shell脚本中运行。这很不幸,因为我正在运行的脚本可能在将来运行在Linux或Mac节点上,我宁愿不使用特定于Windows的命令来散布它。我已经用Git Bash和Msysgit尝试过了,我得到了相同的结果。接下来,我将尝试Cygwin以查看它是否可行...

+0

你用什么构建步骤来触发'mvn'? – Slav

+0

@Slav我使用自定义的shell执行的Python脚本在包含Maven调用的从站上运行。除了Maven,该脚本中的所有内容都可以工作。出于某种原因,运行在从属服务器上的Jenkins服务不会将'mvn'识别为命令,即使所有内容似乎都已正确设置。 FWIW,Python脚本也用于在从站(PHP,Ruby,.NET,Node)上使用其他语言构建项目,并且所有这些工作都很好('composer','bundle','devenv'和一些额外的手持:P) –

+0

好吧,从头开始,'composer','bundle','npm',以及其他几乎所有基于脚本的命令都会返回相同的错误。我们的詹金斯大师最近升级了,所以我想知道它是否与此有关。我将尝试卸载从服务并从(现在升级的)主服务器重新安装。 –

回答

0

事实证明,这与在不同工具环境下在Windows上调用shell命令的方式有关。

詹金斯脚本控制台& Groovy的

在詹金斯,使用Windows节点的脚本控制台,Groovy脚本时候执行脚本命令时,尽管它们是Win32应用程序或批处理脚本调用(如"mvn --version".execute()不会因为mvn是一个shell脚本 - "mvn.cmd --version".execute()将工作,因为mvn.cmd是一个BATCH脚本)。

在Windows节点上运行Groovy脚本命令时,需要在sh之前加上使用shell脚本的命令,以便明确。这假定您的Windows节点在其系统环境变量PATH中有一个到可执行文件的路径。

在Windows节点上调用时工作

样品Groovy脚本:

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

Windows上的Python

我也意识到,我的Python构建脚本有点类似的问题困扰。如果您尝试在Windows上运行一个通过subprocess调用shell脚本的Python脚本,它将不起作用,除非在调用中包含shell=True。另外,您也可以在前面加上sh的命令来显式调用一个shell

注:这不会像bundle对Ruby一些工具的工作 - 这些命令,使用shell=True只似乎工作。

样品Python脚本在shell环境调用Windows上时的作品: “#!的/ usr/bin中/ env的zsh的--login”

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

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

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

+0

master是一个Linux机器,而slave是一个Windows机器,所以我不认为可以在同一个目录中安装Maven。我还应该注意到,我没有使用Jenkins来运行Maven,而是从脚本调用Maven(我将会添加这个注释)。无论如何,我希望能够直接从脚本控制台为从节点进行mvn调用。 关于env。属性,一切都在系统属性下完成,因为Jenkins奴隶服务作为本地系统配置文件帐户(或类似的东西)运行。 –

+0

好吧..我以为你已经配置Jenkins作为'构建maven2/3项目'项目,并直接从构建步骤调用maven命令。你是什​​么意思,你是从脚本中调用maven?它是'执行Windows批处理命令'或'执行Apache Ant'或Jenkins中的其他内容。 此外,在詹金斯,点击奴隶节点 - >配置 - >节点属性,并检查是否为'环境变量'和'工具位置'设置正确的值 – ABose

+0

是的,对不起,我正在执行一个Python脚本使用Execute壳'并试图从那里运行命令。但我越看到这一点,我越觉得它甚至与詹金斯有关。看起来,在shell脚本中运行任何shell脚本都会失败,除非我在命令的前面添加'sh'。当我在节点上使用脚本控制台时,Jenkins将Groovy脚本转换为shell脚本文件,并在节点上用'sh ...'调用它。 –

0

我解决这个问题,加入执行Shell窗口标题。 这很容易。

+0

我使用MAC PC不是windows –