2015-04-20 3 views
3

Я пытаюсь создать проект Java на подчиненном узле Jenkins Windows, и когда я пытаюсь запустить любую команду mvn на подчиненном устройстве из службы Jenkins, я получаю ошибка произнося команды не может быть найдено:Команда mvn не распознана на Jenkins Windows slave node

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%;...

С веб-страницы мастера Дженкинс, если я бегу Groovy скрипт println System.getenv("PATH") на ведомом узле Windows я могу видеть, что есть имеет правильный, расширенный путь для bin директории в Maven.

Я могу также проверить bin каталог Maven можно увидеть, выполнив следующие действия:

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 

Любопытно, что если я бегу Maven с mvn.cmd, то 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 не признается?


EDIT: Билд Я бегу использует пользовательский Python Баш скрипт для вызова Maven. Сценарий также настроен для запуска сборок для проектов на других языках (PHP, Ruby, .NET, Node), а инструменты для этих сборок все работают отлично (composer, bundle, devenv.com). Тем не менее, я бы подумал, что выполнение сборки не имеет значения, если консоль сценария для подчиненного узла возвращает ту же ошибку при попытке выполнить команды mvn.


EDIT 2: Чем больше я смотрю на это, тем меньше я чувствую, что это не имеет ничего общего с Дженкинс и больше, чтобы сделать с тем, как скорлупа скрипты выполняются на Windows. Когда я использую Консоль сценариев для вызова Groovy Script на подчиненном узле, Jenkins просто записывает это во временный файл на подчиненном узле и использует sh -xe <script> для его вызова. Когда я пытаюсь использовать подобный подход непосредственно на машине Windows, каждая команда на основе сценариев (например, mvn, composer) не запускается из сценария оболочки, если я не добавлю команду sh. Это печально, потому что скрипты, которые я запускаю, могут запускаться на узле Linux или Mac в будущем, и я предпочел бы не мутировать его командами, специфичными для Windows. Я пробовал это как с Git Bash, так и с Msysgit, и получаю те же результаты. Затем я попробую Cygwin, чтобы узнать, работает ли это ...

+0

Какой шаг сборки вы используете для запуска 'mvn'? – Slav

+0

@Slav Я использую собственный скрипт Python, исполняемый оболочкой, для запуска на подчиненном устройстве, который включает вызовы Maven. Все в этом скрипте работает, кроме Maven. По какой-то причине служба Jenkins, работающая на подчиненном устройстве, не распознает команду 'mvn' как команду, хотя все, кажется, правильно настроено. FWIW, скрипт Python также используется для создания проектов на других языках на подчиненном устройстве (PHP, Ruby, .NET, Node), и все они прекрасно работают ('composer',' bundle', 'devenv' с некоторыми дополнительными hand-holding: P) –

+0

Хорошо, поцарапайте это, 'composer',' bundle', 'npm' и почти любую другую написанную на основе скрипта команду, которая ранее работала, возвращает ту же ошибку. Наш мастер Jenkins был недавно обновлен, поэтому мне интересно, связано ли это с этим. Я попытаюсь удалить ведомую службу и переустановить ее из мастера (теперь обновленного). –

ответ

0

Так получилось, что это связано с тем, как команды оболочки вызывается в Windows в контексте различных инструментов.

Дженкинс Сценарий консоли & Groovy

В Дженкинс, при использовании сценария консоли, то Groovy скрипт будет вызывать скриптовые команды Узла в Windows, как если бы они Win32 приложение или ПАРТИЯ сценарий вызывает (например "mvn --version".execute() не будет потому что mvn - это скрипт оболочки - "mvn.cmd --version".execute() будет работать, потому что mvn.cmd - скрипт BATCH).

При выполнении команд сценария Groovy на узле Windows команды, которые используют сценарии оболочки, должны быть добавлены с sh, чтобы быть явным. Это предполагает, что ваш узел Windows имеет путь к исполняемому файлу оболочки в своей переменной окружения PATH.

Пример Groovy скрипт, который работает при запуске на узле с Windows:

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

Python на Windows,

Я также понял, что мой Python сценарий сборки страдает несколько аналогичный вопрос. Если вы попытаетесь запустить сценарий Python в Windows, который вызывает сценарий оболочки через subprocess, он не будет работать, если вы не включили в вызов shell=True. В качестве альтернативы, вы можете предварять sh в команду для явного вызова оболочки,

ПРИМЕЧАНИЕ: Это не будет работать для некоторых инструментов, таких как bundle для Ruby, - для тех команд, с помощью shell=True, казалось, только работать.

сценарий Python Пример, который работает при запуске в среде оболочки на Windows: "#!/USR/бен/окр ЗШ --login"

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

Папка установки maven должна быть одинаковой как для мастера, так и для клиента Jenkins. Проверьте, совпадает ли местоположение папки на главном и подчиненном.

За исключением этого вашего env. свойства верны, но проверьте, добавили ли вы свойства под пользовательскими или системными свойствами. Если вы добавили свойства под пользователем и запускаете подчиненный Jenkins в качестве службы Windows, я не думаю, что Дженкинс подбирает значения.

+0

Мастер - это ящик Linux, а подчиненный - это окно Windows, поэтому я не думаю, что Maven можно установить как в том же каталоге. Я также должен отметить, что я не использую Jenkins для запуска Maven, но вместо этого вызывается Maven из сценария (я добавлю эту заметку). Независимо от того, я ожидаю, что вы сможете делать вызовы 'mvn' непосредственно из консоли сценария для подчиненного узла. Относительно env. свойства все делается по свойствам системы, поскольку подчиненная служба Jenkins работает как учетная запись системного профиля (или что-то в этом роде). –

+0

Хорошо .. Я думал, что вы настроили работу Jenkins как проект «Построить проект maven2/3» и вызывать команду maven непосредственно со стадии сборки. Что вы имеете в виду, что вы вызываете maven из скрипта? Это «Выполнить пакетную команду Windows» или «Выполнить Apache Ant» или что-то еще в Jenkins. Также, в Jenkins, щелкните по свойствам slave node-> Configure-> Node и проверьте, установлены ли правильные значения для «Переменные среды» и «Местоположение инструмента» – ABose

+0

Да, извините, я выполняю скрипт Python, используя 'Execute shell 'и пытаюсь запустить команды оттуда. Чем больше я смотрю на это, тем меньше чувствую, что это даже связано с Дженкинсом. Кажется, что запуск любых сценариев оболочки из сценария оболочки не выполняется, если я не добавлю 'sh' в начало команды. Когда я использую Консоль сценариев на узле, Jenkins преобразует Groovy Script в файл сценария оболочки и вызывает его с помощью 'sh ...' на узле. –

0

Я решить эту проблему добавить в Execute Название окна раковины. Это очень просто.

+0

Я использую MAC PC не окна –

Смежные вопросы