Batch file Jenkins管道未在批次失败阶段失败
在jenkins声明性管道中,如果我添加以下步骤:Batch file Jenkins管道未在批次失败阶段失败,batch-file,jenkins,jenkins-pipeline,Batch File,Jenkins,Jenkins Pipeline,在jenkins声明性管道中,如果我添加以下步骤: bat '''dir QWERTY''' 由于没有这样的目录,它将按预期失败 然而,这是一个包含许多语句的bat脚本,因此我希望在出现错误时立即失败。我已经习惯于附加| | exit/b来处理这个问题。但作为詹金斯管道的一部分,这似乎不起作用 bat '''dir QWERTY || exit /b''' bat '''dir QWERTY || exit /b %ERRORLEVEL%''' 上述各项都没有一项不合格。为什么? 第三种选择
bat '''dir QWERTY'''
由于没有这样的目录,它将按预期失败
然而,这是一个包含许多语句的bat脚本,因此我希望在出现错误时立即失败。我已经习惯于附加| | exit/b
来处理这个问题。但作为詹金斯管道的一部分,这似乎不起作用
bat '''dir QWERTY || exit /b'''
bat '''dir QWERTY || exit /b %ERRORLEVEL%'''
上述各项都没有一项不合格。为什么?
第三种选择:
bat '''dir QWERTY
if %errorlevel% neq 0 exit /b %ERRORLEVEL%
'''
虽然似乎有效,但这会影响脚本的可读性。我目前没有Jenkins,因此我无法真正测试所有方法,但从技术上讲,您可以通过以下方法测试链是否有效:
bat '''dir QWERTY && echo success || echo 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
'''
结果是在Jenkins管道中,我不能使用
/b
。因此:
bat '''dir QWERTY || exit'''
有效。多么有趣/可怕的话题。我不相信Jenkins会在构建过程中发现错误。我所处的公司环境限制我使用windows主机。我通常运行gnu环境,因此我不习惯cmd对ERRORLEVEL的态度,但在
bat
中似乎存在%ERRORLEVEL%的问题
我尝试的是:
在詹金斯:bat'exit 1'
——步骤/阶段失败,作业失败。因此,可以向上传播错误状态
在CMD:dirqeqcd中;echo%ERRORLEVEL%
---文件不存在,但不进行任何回显(因为%ERRORLEVEL%已计算为空字符串?)
在CMD:dir qeQcd | | echo%ERRORLEVEL%
---文件不存在,ERRORLEVEL计算为1。所以,是的,强制CMD在设置它之前不计算ERRORLEVEL
在jenkins中:bat'dir qe0cd | | echo%ERRORLEVEL%
——此文本的计算结果为控制台日志中的dir qe0cd | | echo 0,即jenkins或中间环境已经计算了ERRORLEVEL。请注意,回显确实发生,因此从dir返回非零状态
在CMD:bat'dorqe0cd | | echo%ERRORLEVEL%'
——它抱怨dir没有作为可执行文件找到,并回显1
在jenkins中:bat'dor qe0cd | | echo%ERRORLEVEL%'
——它抱怨dir没有作为可执行文件找到,但再次回显0
在jenkins中:bat'dor qe0cd | | exit'
——实际上使步骤、阶段和作业失败。所以这看起来像是一个健壮的成语
我想知道CMD在完成字符串解析之前是否有失败的机会,它可能仍然返回零状态并允许jenkins通过…?请尝试
bat''dir QWERTY&&echo success'.\124; echo Failed'.
并发布它打印的内容?echo命令确实打印失败,但是,再次用exit/b
替换它并没有使该阶段失败。结果证明,如果我放下/b
,然后退出,它就会工作。这一部分让我感到困惑,因为在我以前的非流水线jenkins设置中,它和/b
一起工作。这很奇怪。如果您退出%errorlevel%
而不使用/b
,它也应该可以工作?是的,似乎就是这样<代码>退出/b 1适用于Jenkins,但批处理文件中的if
中除外。它必须简单地退出1
。