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 xxEXIT /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 构建成功的主要内容,如果未能解决你的问题,请参考以下文章

bat脚本隐藏窗口运行

docker中使用docker

即使 ROBOCOPY 命令在 BAT 脚本中成功执行,JENKINS 作业也会失败

jenkins集群测试环境原理部署

使用jenkins流水线完成自动部署服务到K8s

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像