Jenkins 总是认为使用批处理/bat 构建成功
Posted
技术标签:
【中文标题】Jenkins 总是认为使用批处理/bat 构建成功【英文标题】:Jenkins always considers a build successful using batch/bat 【发布时间】:2012-12-08 00:00:51 【问题描述】:我刚刚加入了一家使用批处理文件构建 C++ 项目的公司。批处理做各种事情(更新 svn,现在由 jenkins 完成),创建构建文件夹,构建后删除不必要的文件,将库文件复制到构建文件夹等。
我的问题是 Jenkins 总是认为构建成功,即使它不是。当出现问题时,.bat 文件会创建一个名为 errormake.txt 的文件。如何让 jenkins 阅读并将构建标记为失败?
另外,有什么方法可以找出 Jenkins 从 .bat 文件中创建的构建文件夹(可能在我调用批处理文件时发送一个变量)?
这是我目前用来调用 .bat 文件的单行代码:
call "C:\Source\BuildVersion\AppName\build_version.bat"
编辑:此外,这个项目被分成几个 SVN 存储库。 %SVN_REVISION%
为空白。如何从第一个存储库(主存储库)中获取正确的 %SVN_REVISION%
?
【问题讨论】:
我无法回答您的全部问题,但对于您的最后一个查询,您可以访问$WORKSPACE
环境变量,这有助于了解 Jenkins 的构建源。我在批处理脚本中使用它。
谢谢。 %WORKSPACE% 有帮助。 %BUILD_ID% 也有帮助,我想我只是将批处理文件指向构建在 %WORKSPACE%\builds\%BUILD_ID%
【参考方案1】:
回答你的每一个问题-
Jenkins 总是返回“SUCCESS”,即使作业实际上失败了:
Jenkins 根据最后一条命令的返回码设置 Job 的状态
在每个“执行 windows 批处理命令”块中运行。
如果您的最后一条命令是copy some.log D:
,
詹金斯认为一切都很好
(如果 'copy
' 命令运行良好...)
使用 EXIT xx
或 EXIT /B xx
,具体取决于您的操作系统,
其中 'xx' 是大于零的整数。
如何让 Jenkins 根据日志文件将构建标记为失败:
使用 Text-finder Plugin,如 sdmythos_gr 所述。
有什么方法可以找到 Jenkins 创建的构建文件夹:
有一些参数可用作环境变量 对于在 Jenkins 下运行的每个脚本 - 有关这些参数的列表,请参见此处:Jenkins Environment Variables。
对于您的问题:
%WORKSPACE%
- 工作区的绝对路径
%BUILD_NUMBER%
- 当前版本号,例如“153”
%BUILD_ID%
- 当前构建 ID,例如“2005-08-22_23-59-59”
(YYYY-MM-DD_hh-mm-ss)
如何从第一个存储库中获取正确的 %SVN_REVISION%:
这个答案来自同一个链接:
%SVN_REVISION%
- 对于基于 Subversion 的项目,
此变量包含模块的修订号。如果您指定了多个模块,则不会设置此值。
希望有帮助
【讨论】:
不错的编译,但就像我说的,%SVN_REVISION% 是空的。不过 %SVN_REVISION_1% 有效。 好吧,要么你有多个模块,要么就是一个错误。 > "如果您的最后一个命令是 ECHO FAILURE !!!,Jenkins 认为一切正常" - 我试过了,但 Jenkins 返回失败,因为上一个命令失败 将“echo”示例替换为“copy”,更准确。【参考方案2】:Jenkins 使用 windows 错误代码来了解构建是否失败。 当您的构建失败时,您应该返回一个不同于 0 的值,例如“exit /B 1”。
【讨论】:
谢谢,bat 已经处理了编译错误,但是使用了一个简单的“exit”。出口 1 解决了我的问题。 听起来不错。此外,您可以在“exit 1”之前将结果写入文本文件(发生错误),然后另一个进程可以读取该文件以获得结果。【参考方案3】:在“较新”版本的 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%
【讨论】:
【参考方案4】:我也将只回答你的部分问题。
您可以使用 Jenkins 的文本查找器插件。 https://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin
您可以在构建结束时将构建标记为不稳定或失败,具体取决于文件的内容或控制台输出。
也许这会有所帮助...
【讨论】:
【参考方案5】:我知道这个问题已经很老了,但可能对某些人有用。要执行您的 bat 文件,而不是使用以下行,
call "C:\Source\BuildVersion\AppName\build_version.bat"
您可以使用以下格式,
<someRelativeOrAbsolutePath>\<.batFileName> <param1> <param2> <and so on>
在 Jenkins 的 Build 部分的 Execute Windows Batch Command 中以这种方式执行命令将使用您最后的命令返回码。 $BUILD_STATUS
将取决于此。而且您不必修改脚本来返回一些基于条件的错误代码。
【讨论】:
【参考方案6】:正如其他用户所说,您的批处理文件应使用“exit /B 1”。这是一个技巧,可以将您的调用链接在一起,导致 Jenkins 在失败时返回失败:
call a.bat &&^
echo "a success" &&^
call b.bat &&^
echo "b success"
"&&" 表示下一个动作应该只在成功时运行(退出代码 0)。 “^”让我们将命令分成多行。这种方法的缺点是构建进度条无法准确显示。
【讨论】:
以上是关于Jenkins 总是认为使用批处理/bat 构建成功的主要内容,如果未能解决你的问题,请参考以下文章