Jenkins, плагин Cygpath не конвертирует пути
Я использую Jenkins с установленным плагином Cygpath.
У меня есть несколько скриптов, которые работают в Cygwin Bash без проблем
#!/bin/bash
pwd
SCRIPTFILENAME=$(readlink -f $0)
SCRIPTPATH=`dirname $SCRIPTFILENAME`
cd $SCRIPTPATH
(python check_for_clip_duplicates.py) || exit $?
Но когда я пытаюсь построить его с Дженкинсом, у меня есть ошибка:
$ D:\cygwin\bin\cygpath -w d:\cygwin\bin\bash.exe
[default] $ D:\cygwin\bin\bash.exe -xe C:\Windows\TEMP\hudson2178008588278192726.sh
cygwin warning:
MS-DOS style path detected: C:\Windows\TEMP\hudson2178008588278192726.sh
Preferred POSIX equivalent is: /cygdrive/c/Windows/TEMP/hudson2178008588278192726.sh
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
+ sh tools/generate_all.sh pc compress reset --use-texture-packer
tools/generate_all.sh: line 2: $'\r': command not found
tools/generate_all.sh: line 3: $'pwd\r': command not found
tools/generate_all.sh: line 4: $'\r': command not found
tools/generate_all.sh: line 7: cd: /cygdrive/d/Jenkins/workspace/default/tools
: No such file or directory
C:\Python27\python.exe: can't open file 'check_for_clip_duplicates.py': [Errno 2] No such file or directory
tools/generate_all.sh: line 8: exit: 2
: numeric argument required
Build step 'Execute shell' marked build as failure
Finished: FAILURE
В конфигурации Jenkins в исполняемом файле Shell у меня есть: d:\cygwin\bin\bash.exe.
Основная проблема в том, что пути cygdrive не работают:
tools/generate_all.sh: line 7: cd: /cygdrive/d/Jenkins/workspace/default/tools
: No such file or directory
Есть идеи?
2 ответа
Сценарий, скорее всего, не работает, потому что ваш cd $SCRIPTPATH
не удается (из-за трейлинга \r
символы), а затем пытается найти check_for_clip_duplicates.py
в текущем каталоге скрипта (вместо tools
каталог), которого нет.
Почему все предыдущие команды терпят неудачу и выполняется только последняя? Потому что последний не имеет новой строки, поэтому нет \r
там.
Загрузите Notepad ++, это важный инструмент и имеет отличную поддержку для преобразования файлов EOL (ваша проблема с \r
)
- Открыть Блокнот ++
- Нажмите Файл -> Новый
- Обратите внимание, что внизу справа в строке состояния будет отображаться Dos \ Windows (EOL по умолчанию)
- Нажмите Редактировать -> Преобразование EOL -> Формат UNIX
- Обратите внимание, что внизу справа в строке состояния теперь будет отображаться UNIX
- Пожалуйста, напечатайте (не копируйте и не вставляйте) содержимое вашего
generate_all.sh
скрипт - Сохраните этот файл на свой
tools/generate_all.sh
место нахождения. Вы можете не заметить разницу, но окончания строк невидимы в обычном представлении. - Важное замечание: Если вы используете SVN или другой SCM для возврата в рабочее пространство Jenkins, вам нужно сохранить изменения обратно в SVN/SCM!
Наконец, чтобы этого не случилось снова, вы можете поставить dos2unix
введите команду на шаг сборки Execute Shell, которую вы используете для запуска generate_all.sh
:
dos2unix toos/generate_all.sh
tools/generate_all.sh pc compress reset --use-texture-packer
Pro совет:
Чтобы на самом деле просмотреть окончания строк, в Блокноте ++ нажмите Вид -> Показать символ -> Показать все символы
РЕДАКТИРОВАТЬ:
Вы вызываете python из своего скрипта, который в свою очередь вызывает исполняемый файл Windows C:\Python27\python.exe
, Как внешний исполняемый файл, он не знает ни о каких плагинах Jenkins (cygpath) или даже о самом Jenkins.
Анализируя ваш вопрос далее, Cygwin в первую очередь не нуждается, вы можете сделать все это с помощью обычного шага по сборке команд Windows.
cd
Windows эквивалентно pwd
, $WORKSPACE
переменная среды, указывающая путь к рабочему пространству вашей работы, и вы знаете, что сценарий находится в tools
папка.
|| exit $?
можно заменить на || exit %ERRORLEVEL%
но это полностью избыточно, если это последняя строка на этапе сборки (собственно скрипт). Jenkins будет использовать код завершения последнего оператора шага сборки в качестве кода выхода для всего шага сборки
Поэтому измените весь ваш шаг сборки Cygwin на обычный шаг " Выполнить пакетную сборку окна" следующим образом:
cd
cd $WORKSPACE/tools
C:\Python27\python.exe check_for_clip_duplicates.py
Если ваш каталог python уже находится в %PATH%
переменная, вы можете просто использовать python
вместо полного пути.
Похоже, у вас есть некоторые окончания Windows в вашем файле - попробуйте запустить dos2unix
в теме:
$ dos2unix /cygdrive/c/Windows/TEMP/hudson2178008588278192726.sh
Затем попробуйте снова запустить скрипт.