Дженкинс всегда считает, что сборка успешна, используя партию/bat
Я только что присоединился к компании, которая использует командные файлы для создания проекта на С++. Пакет выполняет всевозможные действия (обновления svn, которые теперь выполняются jenkins), создает папки сборки, удаляет ненужные файлы после создания, копирует файлы библиотеки в папку сборки и т.д.
Моя проблема - Дженкинс всегда считает, что сборка успешна, даже если это не так. Файл .bat создает файл с именем errormake.txt, когда что-то идет не так. Как заставить jenkins прочитать это и пометить сборку как отказ?
Кроме того, можно ли каким-либо образом найти папку сборки Jenkins, созданную из файла .bat(возможно, отправить переменную при вызове командного файла)?
Это единственная строка, которую я использую для вызова файла .bat:
call "C:\Source\BuildVersion\AppName\build_version.bat"
Изменить: этот проект разделен на несколько репозиториев SVN. %SVN_REVISION%
пусто. Как я могу получить правильный %SVN_REVISION%
из первого репозитория (основного)?
Ответы
Ответ 1
Чтобы ответить на каждый из ваших вопросов -
-
Дженкинс всегда возвращает "УСПЕХ", даже когда Job действительно не удалось:
Дженкинс устанавливает статус задания на основе кода возврата последней команды
который запускался в каждом блоке "Выполнять пакетную команду Windows".
Если ваша последняя команда copy some.log D:
,
Дженкинс считает, что все в порядке
(Если команда "copy
" прошла нормально...)
Используйте EXIT xx
или EXIT /B xx
, в зависимости от вашей ОС,
где "xx" - некоторое целое число, большее нуля.
-
Как заставить Jenkins отмечать сборку как сбой на основе файла журнала:
Используйте плагин для поиска текста, как указано sdmythos_gr.
-
Можно ли найти папку создания Jenkins, созданную:
Существует несколько параметров, доступных в качестве переменных среды
для каждого script, который работает под Jenkins - см. здесь список этих параметров:
Переменные среды Jenkins.
На ваш вопрос:
-
%WORKSPACE%
- Абсолютный путь рабочей области
-
%BUILD_NUMBER%
- текущий номер сборки, например "153"
-
%BUILD_ID%
- текущий идентификатор сборки, например "2005-08-22_23-59-59"
(YYYY-MM-DD_hh-мм-сс)
-
Как я могу получить правильный% SVN_REVISION% из первого репозитория:
Этот ответ по той же ссылке:
-
%SVN_REVISION%
- для проектов на основе Subversion,
эта переменная содержит номер версии модуля.
Если у вас указано более одного модуля, это не будет установлено.
Надеюсь, что поможет
Ответ 2
Jenkins использует код ошибки Windows, чтобы узнать, не сработала ли сборка или нет.
Вы должны вернуть значение, отличное от 0, когда ваша сборка завершилась неудачно, например, "exit/B 1".
Ответ 3
Я также отвечу только на часть вашего вопроса.
Существует плагин Text Finder для Jenkins, который вы можете использовать.
https://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin
Вы можете пометить сборку как неустойчивую или не пройденную в конце сборки в зависимости от содержимого файла или выхода консоли.
Возможно, это может помочь...
Ответ 4
Я знаю, что вопрос довольно стар, но может быть полезен для некоторых людей. Чтобы выполнить файл bat, вместо использования следующей строки,
call "C:\Source\BuildVersion\AppName\build_version.bat"
Вы можете использовать формат ниже,
<someRelativeOrAbsolutePath>\<.batFileName> <param1> <param2> <and so on>
Выполняя команду таким образом внутри Выполнять командную команду Windows раздела Сборка, Jenkins будет использовать ваш последний код возврата команды. ${BUILD_STATUS}
будет зависеть от этого. И вам не придется изменять свой script, чтобы возвращать коды ошибок, основанных на определенных условиях.
Ответ 5
В "новых" версиях Windows (я тестировал на сервере Server 2012 R2) в конце каждой команды пакета Windows добавьте следующее:
@EXIT /b %ERRORLEVEL%
Это передаст код ошибки, который cmd.exe получит обратно вызывающему абоненту (т.е. Jenkins). "@" Отключает эхо, поэтому вы не загромождаете свой журнал.
Если у вас есть несколько строк в команде и вы хотите остановиться после первого сбоя, поместите следующую строку после каждой строки, которую вы хотите проверить (да, это не так):
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
Например:
step1.exe
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
step2.exe
@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
call "C:\Source\BuildVersion\AppName\build_version.bat"
@EXIT /b %ERRORLEVEL%