Jenkins流水线在批处理失败时不会使阶段失败

5
在 Jenkins 的声明式流水线中,如果我添加了这样的步骤:
bat '''dir QWERTY'''

由于没有这样的目录,所以预计它将失败。

然而,这是一个有许多语句的批处理脚本,所以我希望一旦出现错误就立即失败。我已经习惯了添加 || exit /b 来处理这个问题。但作为 Jenkins 流水线的一部分,这似乎不起作用。

bat '''dir QWERTY || exit /b'''
bat '''dir QWERTY || exit /b %ERRORLEVEL%'''

以上选项均未在该阶段失败。为什么?

第三个选项:

bat '''dir QWERTY
if %errorlevel% neq 0 exit /b %ERRORLEVEL%
'''

似乎可以工作,但这会损害脚本的可读性。


你能否尝试运行 bat '''dir QWERTY && echo success || echo Failed''' 并回复它打印的结果? - Gerhard
2个回答

2

目前我没有Jenkins,所以无法测试所有方法,但从技术上讲,您可以通过以下方式测试链是否有效:

bat '''dir QWERTY && echo success || echo Failed'''

如果 failed 是消息,这应该打印出两个命令中的一个,进程应该工作。然后您可以设置一个更易读的字符串:

bat '''dir QWERTY && echo. || exit /b'''

你可以通过调用一个标签来保留你的if %errorlevel%方法:
bat '''
:error
if %errorlevel% neq 0 exit /b!

dir QWERTY & call :error
dir AZERTY & call :error
'''

回声命令确实会打印“失败”,但将其替换为“exit /b”后,仍未使阶段失败。最后证明,如果我去掉“/b”,只留下“exit”,它就能正常工作。这部分让我感到困惑,因为在我的旧的非管道式 Jenkins 设置中,它可以使用“/b”。 - Zitrax
很奇怪。如果你没有使用/b,只是使用exit %errorlevel%,它也应该可以工作吗? - Gerhard

2
原来在Jenkins管道中我不能使用/b。因此:
bat '''dir QWERTY || exit'''

工作。


是的,这似乎就是它。exit /b 1 在批处理文件中除了 if 之外的任何地方都适用于 Jenkins。它必须简单地是 exit 1 - Cameron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接