Подтвердить что ты не робот

Дженкинс всегда считает, что сборка успешна, используя партию/bat

Я только что присоединился к компании, которая использует командные файлы для создания проекта на С++. Пакет выполняет всевозможные действия (обновления svn, которые теперь выполняются jenkins), создает папки сборки, удаляет ненужные файлы после создания, копирует файлы библиотеки в папку сборки и т.д.

Моя проблема - Дженкинс всегда считает, что сборка успешна, даже если это не так. Файл .bat создает файл с именем errormake.txt, когда что-то идет не так. Как заставить jenkins прочитать это и пометить сборку как отказ?

Кроме того, можно ли каким-либо образом найти папку сборки Jenkins, созданную из файла .bat(возможно, отправить переменную при вызове командного файла)?

Это единственная строка, которую я использую для вызова файла .bat:

call "C:\Source\BuildVersion\AppName\build_version.bat"

Изменить: этот проект разделен на несколько репозиториев SVN. %SVN_REVISION% пусто. Как я могу получить правильный %SVN_REVISION% из первого репозитория (основного)?

4b9b3361

Ответ 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%