为什么从詹金斯(但在其他所有地方)调用exit / b不能正常工作?

Tim*_*yer 5 windows batch-file jenkins

我遇到以下问题:我的项目有一个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% )
Run Code Online (Sandbox Code Playgroud)

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

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

当我从詹金斯工作中调用脚本(下面的代码)时, make_all.bat即使第一个组件失败继续第二个组件。如果然后我以这种行为登录到构建从站并在那里手动启动批处理文件,则在第一个组件出现故障时它将退出。

那么詹金斯做了什么打破了这个%ERRORLEVEL%概念?

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


注意:jenkins作业具有“执行Windows批处理命令”步骤,如下所示:

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

(这是完整的步骤)

jeb*_*jeb 2

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

样本

set errorlevel=0
cd ThisDoesntExist
echo %errorlevel%
set "errorlevel="
echo %errorlevel%
Run Code Online (Sandbox Code Playgroud)

它输出

0
1

结论:有了set "errorlevel="你就可以恢复正常%ERRORLEVEL%行为