为什么 exit /b 从 Jenkins(但其他任何地方)调用时不能正常工作?

Why does exit /b not work properly when called from Jenkins (but everywhere else)?

我遇到了以下问题:我的项目有一个 make_all.bat 文件,它执行多个这样的构建:

call make_first_component.bat
if %ERRORLEVEL% gtr 0 ( exit /b %ERRORLEVEL% )

call make_second_component.bat
if %ERRORLEVEL% gtr 0 ( exit /b %ERRORLEVEL% )

该脚本中没有其他行(echo 命令除外)。

现在,当我通过双击或从命令行手动调用该脚本时,make_first_component.bat 执行类似 exit /b 1 的操作时,make_all.bat 按预期退出。

当我从 jenkins 作业(下面的代码)调用脚本时,make_all.bat 继续第二个组件,即使第一个组件失败。 如果我随后以这种行为登录到构建从站并在那里手动启动批处理文件,如果第一个组件失败,它就会退出。

那么jenkins做了什么打破了%ERRORLEVEL%的概念呢?

PS:我尝试过 setlocal enabledelayedexpansion 然后使用 !ERRORLEVEL!,但它始终为 0。


注意:jenkins 作业有一个 "Execute Windows batch command" 步骤,如下所示:

cd %WORKSPACE%\src\bat

echo Setting up Visual Studio environment
call "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" amd64

echo Building Project
call make_all.bat
if %ERRORLEVEL% gtr 0 ( exit /b %ERRORLEVEL% )

(这就是完整的步骤)

ERRORLEVEL被覆盖时会出现这种效果。

样本

set errorlevel=0
cd ThisDoesntExist
echo %errorlevel%
set "errorlevel="
echo %errorlevel%

输出

0
1

结论:使用 set "errorlevel=" 您可以恢复正常的 %ERRORLEVEL% 行为