GitHub Actions Windows主机多行run命令忽略退出码问题问询
GitHub Actions Windows环境多行run命令正确配置方案
问题根因说明
- CMD shell多行执行异常:如果你的批处理脚本内使用了不带
/b参数的exit语句,执行完脚本会直接终止当前CMD会话,导致后续命令无法执行;且CMD默认不会主动根据上一条命令的退出码终止后续命令执行。 - PowerShell默认不捕获外部程序退出码:PowerShell中执行bat等外部程序时,非零退出码不会被识别为执行错误,仅会将退出码存入
$LASTEXITCODE内置变量,默认不会终止后续命令执行。
可行配置方案
方案1:使用CMD shell(适配原有批处理逻辑)
每执行一条命令后主动检查退出码,非零则直接终止当前步骤:
jobs: windows_build: runs-on: windows-latest steps: - uses: actions/checkout@v1 - name: Build in DEBUG and RELEASE mode shell: cmd run: | configure.bat if %errorlevel% neq 0 exit /b %errorlevel% make.bat DEBUG if %errorlevel% neq 0 exit /b %errorlevel% make.bat RELEASE
如果批处理脚本内没有无参数的exit语句,也可以简化为每行后加|| exit /b %errorlevel%:
run: | configure.bat || exit /b %errorlevel% make.bat DEBUG || exit /b %errorlevel% make.bat RELEASE || exit /b %errorlevel%
方案2:使用PowerShell shell
执行每条批处理后检查$LASTEXITCODE变量,非零则主动退出:
jobs: windows_build: runs-on: windows-latest steps: - uses: actions/checkout@v1 - name: Build in DEBUG and RELEASE mode shell: powershell run: | & .\configure.bat if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } & .\make.bat DEBUG if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } & .\make.bat RELEASE
更简洁的写法:
run: | & .\configure.bat || exit $LASTEXITCODE & .\make.bat DEBUG || exit $LASTEXITCODE & .\make.bat RELEASE || exit $LASTEXITCODE
两种方案都可以保证前序命令执行失败后,立刻终止后续命令执行,并且GitHub Actions会正确将整个步骤标记为失败状态。
内容的提问来源于stack exchange,提问作者knocte
相关产品推荐
相关产品推荐

