Jenkins总是认为使用batch / bat成功构建

时间:2012-12-20 12:51:42

标签: batch-file jenkins

我刚刚加入了一家使用批处理文件构建C ++项目的公司。批处理可以执行各种操作(更新svn,现在由jenkins完成),创建构建文件夹,在构建后删除不必要的文件,将库文件复制到构建文件夹等。

我的问题是Jenkins总是认为构建成功,即使不是。当出现问题时,.bat文件会创建一个名为errormake.txt的文件。如何让jenkins读取并将构建标记为失败?

另外,有什么方法可以找到Jenkins从.bat文件中创建的构建文件夹(可能在调用批处理文件时发送变量)?

这是我目前用于调用.bat文件的单行:

call "C:\Source\BuildVersion\AppName\build_version.bat"

编辑:此外,此项目分为几个SVN存储库。 %SVN_REVISION%是空白的。如何从第一个存储库(主存储库)中获取正确的%SVN_REVISION%

6 个答案:

答案 0 :(得分:31)

回答你的每个问题 -

  • Jenkins总是返回“SUCCESS”,即使Job真的失败了

    Jenkins根据最后一个命令的返回码设置作业的状态 在每个“执行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毫米-SS)

  • 如何从第一个存储库中获取正确的%SVN_REVISION%

    这个答案来自同一个链接:

    • %SVN_REVISION% - 对于基于Subversion的项目,
      此变量包含模块的修订号 如果您指定了多个模块,则不会设置

希望有所帮助

答案 1 :(得分:5)

Jenkins使用Windows错误代码来了解构建是否失败。 当你的构建失败时,你应该返回一个不同于0的值,例如“exit / B 1”。

答案 2 :(得分:4)

我也会回答你问题的一部分。

您可以使用Jenkins的Text Finder插件。 https://wiki.jenkins-ci.org/display/JENKINS/Text-finder+Plugin

您可以在构建结束时将构建标记为不稳定或失败,具体取决于文件或控制台输出的内容。

也许这可以帮助......

答案 3 :(得分: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 :(得分:0)

我知道这个问题相当古老,但可能对某些人有用。要执行您的bat文件,而不是使用以下行,

call "C:\Source\BuildVersion\AppName\build_version.bat"

您可以使用以下格式

<someRelativeOrAbsolutePath>\<.batFileName> <param1> <param2> <and so on>

在Jenkins的构建部分的执行Windows批处理命令内以这种方式执行命令将使用您命令的最后一个返回代码。 ${BUILD_STATUS}将取决于此。并且您不必修改脚本以返回基于条件的错误代码。

答案 5 :(得分:0)

正如其他用户所说,您的批处理文件应使用“ exit / B 1”。这是将您的呼叫链接在一起的一个技巧,如果一个失败,则导致詹金斯返回失败:

call a.bat &&^
echo "a success" &&^
call b.bat &&^
echo "b success"

“ &&”表示下一个操作应仅在成功(退出代码0)时运行。 “ ^”让我们将命令分成多行。这种方法的缺点是构建进度条无法正确显示。