我有一个非常基本的bat文件,包含代码(如下)
@echo off
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild CaptainHook.sln /m /nr:false /p:Platform="Any CPU" /v:M /fl /flp:LogFile=bin\msbuild.log;Verbosity=Normal
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild Tests.sln /m /nr:false /p:Platform="Any CPU" /v:M /fl /flp:LogFile=bin\msbuild.log;Verbosity=Normal
"%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE\mstest.exe" /testcontainer:%CD%\src\UnitTests\bin\Debug\UnitTests.dll"
我能够将其作为preoutgoing.build_test钩子执行,但即使构建失败,也不会中止提交,但如果测试失败,则提交中止。我错过了什么?
答案 0 :(得分:1)
您在构建后无条件地运行测试。如果最后执行的命令返回零退出代码,则它将覆盖先前命令中的任何非零退出代码。
因此,您需要在每个命令之间检查退出代码(Windows批处理中的ERRORLEVEL),如果非零,则退出。或者,如果要在构建失败时运行测试,请保存退出代码并在结束时退出。
立即退出:
@ECHO OFF
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild CaptainHook.sln /m /nr:false /p:Platform="Any CPU" /v:M /fl /flp:LogFile=bin\msbuild.log;Verbosity=Normal
IF ERRORLEVEL 1 GOTO :EOF
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild Tests.sln /m /nr:false /p:Platform="Any CPU" /v:M /fl /flp:LogFile=bin\msbuild.log;Verbosity=Normal
IF ERRORLEVEL 1 GOTO :EOF
"%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE\mstest.exe" /testcontainer:%CD%\src\UnitTests\bin\Debug\UnitTests.dll"
IF ERRORLEVEL 1 GOTO :EOF
(最后的额外行允许轻松添加更多命令)。
执行all并以最高错误级别退出:
@ECHO OFF
SETLOCAL
SET EXITCODE=0
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild CaptainHook.sln /m /nr:false /p:Platform="Any CPU" /v:M /fl /flp:LogFile=bin\msbuild.log;Verbosity=Normal
IF %ERRORLEVEL% GTR %EXITCODE% SET EXITCODE=%ERRORLEVEL%
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\msbuild Tests.sln /m /nr:false /p:Platform="Any CPU" /v:M /fl /flp:LogFile=bin\msbuild.log;Verbosity=Normal
IF %ERRORLEVEL% GTR %EXITCODE% SET EXITCODE=%ERRORLEVEL%
"%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE\mstest.exe" /testcontainer:%CD%\src\UnitTests\bin\Debug\UnitTests.dll"
IF %ERRORLEVEL% GTR %EXITCODE% SET EXITCODE=%ERRORLEVEL%
EXIT /B %EXITCODE%