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

Затем попробуйте снова запустить скрипт.

Другие вопросы по тегам