【问题标题】:Mercurial preoutgoing hook succeeds when a build fails当构建失败时,Mercurial preoutgoing hook 成功
【发布时间】:2013-07-25 19:37:25
【问题描述】:
我有一个非常基本的带有代码的 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 钩子执行,但是即使构建失败,提交也不会中止,但如果测试失败,提交也会中止。我错过了什么?
【问题讨论】:
标签:
batch-file
mercurial
msbuild
mstest
mercurial-hook
【解决方案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
(末尾的额外行可以轻松添加更多命令)。
执行所有并以最高错误级别退出:
@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%