You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何GitHub Actions执行test.bat返回非零码仍标记任务成功?

GitHub Actions执行bat脚本时非零退出码未触发任务失败的问题

我在GitHub Actions中执行test.bat脚本时遇到异常:当test.bat返回非零退出码时,GitHub Actions仍将任务标记为成功。

GitHub Actions YAML配置

jobs: 
  run_test:
    runs-on: [self-hosted,Windows]
    steps: 
    - run: ./test.bat

test.bat内容

REM This runs test and returns non-zero exit code when test fails.
test.exe -fail     

REM Now, assume test failed, and it returns exit code 4.
echo %error_level%

现象

保留echo %error_level%语句时,GitHub Actions任务被标记为成功;删除该语句后,任务会正确标记为失败。请问这是什么原因?


回答

这是Windows批处理脚本的特性导致的:整个批处理脚本的最终退出码,由最后一条执行命令的退出码决定。

当test.exe -fail执行失败返回非零码(比如示例中的4)后,紧接着执行的echo %error_level%是一条执行成功的命令,它的退出码为0,这会直接覆盖掉test.exe留下的非零错误码。最终bat脚本返回的是echo命令的0退出码,GitHub Actions因此判定任务成功。

如果想要保留test.exe的错误码同时输出它,可以修改bat脚本,先保存错误码,最后用保存的错误码退出脚本:

REM This runs test and returns non-zero exit code when test fails.
test.exe -fail     
REM 保存test.exe的错误码
set "TEST_EXIT_CODE=%errorlevel%"
REM 输出错误码
echo %TEST_EXIT_CODE%
REM 以保存的错误码退出脚本
exit /b %TEST_EXIT_CODE%

这样修改后,不管后续执行了多少其他命令,脚本最终都会返回test.exe的退出码,GitHub Actions就能正确识别任务是否失败了。


内容的提问来源于stack exchange,提问作者M.I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:42:43