为何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
相关产品推荐
相关产品推荐

