2010-09-09 6 views
27

Мы используем бегун командной строки TeamCity для вызова bat-файла. Bat-файл создает наше решение, вызывая Visual Studio 2008 «devenv.exe», а затем выполняет модульные тесты и создает правильную структуру папок.Командная строка TeamCity: как сделать сборку неудачной?

Что мы хотели бы сделать, это прекратить выполнение bat-файла, если вызов devenv не удался и заставить TeamCity понять, что сборка завершилась неудачно. Мы можем поймать неудавшийся вызов devenv, проверив ErrorLevel (который равен 1, если сборка завершилась неудачно), и мы можем выйти из нашего bat-файла в этой точке. Но как мы можем сообщить TeamCity, что сбой сборки?

Это то, что мы пытались:

call "build.bat" 
IF ERRORLEVEL 1 EXIT /B 1 

Но TeamCity не признает наш код выхода. Вместо этого журнал построения выглядит так:

[08:52:12]: ========== Build: 28 succeeded or up-to-date, 1 failed, 0 skipped ========== 
[08:52:13]: C:\_work\BuildAgent\work\bcd14331c8d63b39\Build>IF ERRORLEVEL 1 EXIT /B 1 
[08:52:13]: Process exited with code 0 
[08:52:13]: Publishing artifacts 
[08:52:13]: [Publishing artifacts] Paths to publish: [build/install, teamcity-info.xml] 
[08:52:13]: [Publishing artifacts] Artifacts path build/install not found 
[08:52:13]: [Publishing artifacts] Publishing files 
[08:52:13]: Build finished 

Так TeamCity сообщит, что сборка была успешной. Как мы можем это исправить?

Решение:

TeamCity обеспечивает механизм, называемый Service Messages, который может быть использован для обработки таких ситуаций. Я обновил свой сценарий сборки, чтобы выглядеть следующим образом:

IF %ERRORLEVEL% == 0 GOTO OK 
echo ##teamcity[buildStatus status='FAILURE' text='{build.status.text} in compilation'] 
EXIT /B 1 
:OK 

В результате TeamCity сообщит мой билд, как не удалось из-за «сбоя в компиляции».

+1

Где находится «ГОТО ОК»? А что такое% ERRORLEVEL%? –

ответ

21

См. Build Script Interaction with TeamCity topic.

Вы можете сообщить сообщения для журнала сборки следующим образом:

##teamcity[message text='<message text>' errorDetails='<error details>' status='<status value>']

где:

  • Атрибут статус может принимать следующие значения: NORMAL, WARNING, FAILURE, ОШИБКА. Значение по умолчанию - NORMAL.
  • Атрибут errorDetails используется только в том случае, если статус ОШИБКИ, в других случаях это игнорируется.

Это сообщение не строить в случае его статус ERROR и «Сбой построения, если сообщение об ошибке заносится сборки бегуна» флажок проверяется на конфигурации сборки странице общих настроек. Например:

##teamcity[message text='Exception text' errorDetails='stack trace' status='ERROR']

Обновление 2013-08-30:

По состоянию TeamCity 7.1 следует сообщать с использованием служебного сообщения buildProblem:

##teamcity[buildProblem description='<description>' identity='<identity>'] 
+0

Спасибо! Я смог получить то, что работает, используя сообщение buildStatus. Я буду обновлять исходное сообщение этой информацией. –

+3

Это также работает с сценариями powershell, например. 'echo '## teamcity [message text =' oops 'errorDetails =' 'status =' ERROR ']" ' –