«Bash на Ubuntu в Windows» не работает с Jenkins — работа jenkins зависает

Мы используем инструменты repo и gerrit для управления нашими репозиториями git и проверки кода.

«repo init» и «repo sync» отлично работают на наших подчиненных устройствах Linux, но у нас были серьезные проблемы с подчиненными устройствами Windows:

  1. Инструкция Shebang игнорируется в Windows, если она указана в поле «Выполнить оболочку» Jenkins, поэтому, если у нас установлено несколько оболочек на ведомом устройстве Windows (MINGW_32, MINGW_64, CYGWIN64, Ubuntu Bash), невозможно принудительно запустить скрипт внутри конкретную оболочку, указав инструкцию shebang - это просто не работает.

  2. Нам удалось запустить «синхронизацию репо» на подчиненном устройстве Windows от jenkins в оболочке MINGW64, которая поставляется с Git для установки Windows. Однако «синхронизация репо» здесь очень медленная. Мы перепробовали почти все переключатели командной строки, и «синхронизация репо» по-прежнему остается узким местом. Выполнение «синхронизации репо» в существующей рабочей области занимает почти 10 минут, когда вносятся только несколько новых изменений.

  3. Мы установили «Bash на Ubuntu в Windows» на машину без jenkins и попробовали «синхронизацию репо» оттуда и вуаля!, она завершилась за пару минут.

  4. Теперь проблема в том, что мы не можем использовать «Bash на Ubuntu в Windows» от Jenkins. Если мы используем поле «Выполнить оболочку» Jenkins, мы не сможем понять, как заставить его использовать оболочку Ubuntu bash, поскольку инструкция shebang игнорируется на подчиненных устройствах Windows (известная проблема)

Если мы используем окно Jenkins «Выполнить пакетную команду Windows» и запускаем что-то, перечислите это: bash -c ls Это работает на локальной машине, но если запустить из jenkins на подчиненном устройстве Windows, задание просто зависает, и мы видим значок прогресса вращающейся шестерни, в конце концов мы должны убить работу Дженкинса.

Возможно, нам нужно изменить некоторую переменную среды Windows, чтобы заставить jenkins использовать эту оболочку. Bash.exe находится внутри C:\Windows\System32, который уже является первой записью в переменной PATH, поэтому мы не уверены, как мы в конечном итоге используем оболочку Ubuntu bash от Jenkins.


person user9711638    schedule 01.05.2018    source источник
comment
Если вы перейдете в «Управление Jenkins» -> «Настроить систему», вы найдете параметр (называемый «Исполняемый файл оболочки») для установки имени или абсолютного пути к оболочке, которую вы хотите использовать в своих сценариях оболочки. Возможно ли это для вас?   -  person Dan Wilson    schedule 01.05.2018
comment
К сожалению, это невозможно - поскольку у нас смешанная среда Windows и Linux, а мастер jenkins установлен на Linux, поэтому прикосновение к чему-либо в глобальной конфигурации приведет к поломке сборок Linux.   -  person user9711638    schedule 01.05.2018
comment
Хм, может быть, вы застряли тогда. Возможно, вам потребуется найти сопоставимые инструменты, специфичные для Windows (если они доступны), и использовать PowerShell, или, возможно, определить оболочку по умолчанию в пользовательской переменной среды и придумать какой-то хак для ее использования.   -  person Dan Wilson    schedule 01.05.2018
comment
Да, похоже, мы застряли. Мы попробовали несколько вещей, например, в командной строке cmd используйте bash -c 'команда linux' И в git bash msys windows /c/Windows/System32/bash -c 'команда linux', и обе работают на локальной машине, но когда мы Бегите от Дженкинса, мы получаем ужасный спиннинг   -  person user9711638    schedule 01.05.2018


Ответы (1)


Я полагаю, что это происходит потому, что агенту Jenkins не разрешено выполняться из C:\Windows\System32 в Windows 10 при работе в контексте пользователя. Как ни странно, вошедший в систему пользователь не испытывает такого же ограничения из командной строки.

Вы можете обойти эту проблему, скопировав нужный исполняемый файл (например, bash.exe, curl.exe и т. д.) из C:\Windows\System32 в C:\bin и добавив это новое местоположение в путь. Например:

set Path=C:\bin\;%Path%
bash -c ls .
person jpadams    schedule 22.07.2019