簡體   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