【发布时间】:2013-10-15 23:28:33
【问题描述】:
我有一个简单的 Windows 批处理命令 (robocopy),它返回零错误,但在 Jenkins 中始终标记为失败。我想知道为什么?
D:\Jenkins\jobs\Jenkins 配置备份\workspace>exit 1 构建步骤“执行 Windows 批处理命令”将构建标记为失败 完成:失败
【问题讨论】:
标签: batch-file jenkins exit-code robocopy
我有一个简单的 Windows 批处理命令 (robocopy),它返回零错误,但在 Jenkins 中始终标记为失败。我想知道为什么?
D:\Jenkins\jobs\Jenkins 配置备份\workspace>exit 1 构建步骤“执行 Windows 批处理命令”将构建标记为失败 完成:失败
【问题讨论】:
标签: batch-file jenkins exit-code robocopy
robocopy 返回位图
详情见这里:http://ss64.com/nt/robocopy-exit.html
总结:直到“3”的所有退出代码都可以。
这是我常用的批处理文件代码:
set SOURCE= ...
set DESTINATION= ...
robocopy /MIR %SOURCE% %DESTINATION%
@echo robocopy exit code: %ERRORLEVEL%
@if %ERRORLEVEL% GTR 3 ( echo robocopy ERROR )
@if %ERRORLEVEL% GTR 3 ( exit %ERRORLEVEL% )
@set ERRORLEVEL=0
您也可以执行“goto”而不退出。
【讨论】:
当批处理脚本的现有代码不为 0 时,Jenkins 将构建标记为失败。如果 robocopy 是脚本中的最后一个命令,则将采用 robocopy 退出代码。
Robocopy 不遵守退出代码不是 0 表示构建失败的标准。您需要评估 robocopy 退出代码并以 exit 0 或 exit 1 结束脚本,具体取决于 robocopy 的成功与否。
【讨论】:
exit 0放在脚本末尾。由于您使用的 if 语句,如果 ERRORLEVEL 为 1 或更大,则该语句为真。您应该在其上方有以下声明if ERRORLEVEL 4 exit 1。
为詹金斯管道更新这个问题 - 这对我有用:
def robocopy(cmd)
{
// robocopy uses non-zero exit code even on success, status below 3 is fine
def status = bat returnStatus: true, script: "ROBOCOPY ${cmd}"
println "ROBOCOPY returned ${status}"
if (status < 0 || status > 3)
{
error("ROBOCOPY failed")
}
}
或者,您可能想查看File Operations Plugin
【讨论】: