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

HSN*_*SNN 26 batch-file jenkins

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

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

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

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

call "C:\Source\BuildVersion\AppName\build_version.bat"
Run Code Online (Sandbox Code Playgroud)

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

Gon*_*nen 34

回答你的每个问题 -

  • 詹金斯总是回归"成功",即使工作真的失败了:

    Jenkins根据 每个" 执行Windows批处理命令 "块中运行的最后一个命令的返回代码设置作业的状态. 如果你的最后一个命令是, Jenkins认为一切正常 (如果' '命令没问题......)

    copy some.log D:

    copy

    使用EXIT xxEXIT /B xx取决于您的操作系统,
    'xx'是大于零的整数.

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

    使用文本查找器插件,如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% 虽然有效。 (2认同)

Sté*_*tte 6

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


小智 5

在“较新”版本的 Windows 上(我在 Server 2012 R2 上测试过),将以下内容放在每个 Windows 批处理命令的末尾:

@EXIT /b %ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

这会将 cmd.exe 收到的错误代码传递回调用者(即 Jenkins)。“@”关闭回显,这样您就不会弄乱您的日志。

如果命令中有多行并希望在第一次失败后停止,请在要检查的每一行之后添加以下内容(是的,这不太好):

@IF NOT %ERRORLEVEL% == 0 EXIT /b %ERRORLEVEL%
Run Code Online (Sandbox Code Playgroud)

例如:

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%
Run Code Online (Sandbox Code Playgroud)