32

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

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

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

这是我目前用来调用 .bat 文件的单行代码:

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

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

4

6 回答 6

41

回答你的每一个问题——

  • Jenkins 总是返回“SUCCESS”,即使作业实际上失败了

    Jenkins 根据在每个“执行 windows 批处理命令”块中运行的最后一个命令的返回码设置作业的状态。 如果您的最后一条命令是, Jenkins 认为一切正常 (如果 ' ' 命令运行良好......)

    copy some.log D:

    copy

    根据您的操作系统,使用EXIT xxor , 其中 'xx' 是大于零的整数。EXIT /B xx

  • 如何根据日志文件让 Jenkins 将构建标记为失败

    使用sdmythos_gr提到的Text-finder Plugin

  • 有什么办法可以找出詹金斯创建的构建文件夹

    对于在 Jenkins 下运行的每个脚本,有一些参数可用作环境变量
    - 请参阅此处以获取这些参数的列表:
    Jenkins 环境变量

    对于你的问题:

    • %WORKSPACE%- 工作区的绝对路径
    • %BUILD_NUMBER%- 当前版本号,例如“153”
    • %BUILD_ID%- 当前构建 id,例如“2005-08-22_23-59-59”
      (YYYY-MM-DD_hh-mm-ss)

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

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

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

希望有帮助

于 2012-12-21T17:04:08.373 回答
8

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

于 2012-12-20T15:13:41.173 回答
6

在“较新”版本的 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%
于 2017-09-11T23:55:48.910 回答
4

我也将回答你的部分问题。

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

您可以根据文件的内容或控制台输出在构建结束时将构建标记为不稳定或失败。

也许这可以帮助...

于 2012-12-20T15:17:42.763 回答
0

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

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

您可以使用以下格式,

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

在 Jenkins的Build部分的Execute Windows Batch Command中以这种方式执行命令将使用该命令的最后一个返回码。将取决于此。而且您不必修改脚本来返回一些基于条件的错误代码。${BUILD_STATUS}

于 2016-10-18T11:35:34.860 回答
0

正如其他用户所说,您的批处理文件应使用“exit /B 1”。这是一个技巧,可以将您的调用链接在一起,导致 Jenkins 在失败时返回失败:

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

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

于 2018-06-27T20:19:53.247 回答