【问题标题】:Jenkins always considers a build successful using batch/batJenkins 总是认为使用批处理/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%

标签: batch-file jenkins


【解决方案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)。 “^”让我们将命令分成多行。这种方法的缺点是构建进度条无法准确显示。

        【讨论】:

          猜你喜欢
          • 2016-03-24
          • 1970-01-01
          • 2013-12-28
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          • 2020-11-01
          • 2019-05-24
          • 1970-01-01
          相关资源
          最近更新 更多