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

GitHub Action中Python非零退出码仍显示执行成功如何解决

问题根因

GitHub Actions 所用的 Ubuntu 运行器遵循 POSIX 规范,进程退出码是 8 位无符号整数,仅支持 0-255 范围内的取值,超出范围的数值会被截断取模后作为最终生效的退出码。
你代码里写的error_code = 256,经过系统截断后实际返回的退出码是256 % 256 = 0,这是标准的执行成功退出码,所以不管用os._exit()还是sys.exit(),Action 都会判定步骤执行成功。

注意:os._exit()会直接绕过Python解释器的所有清理逻辑,包括标准输出缓冲区刷新、finally块执行、文件句柄回收等,除非是fork后的子进程退出场景,否则不要用,常规脚本退出优先用sys.exit()。

修复方案

1. 修正Python脚本的退出码取值

把退出码改成1-255之间的非零合法值即可正常触发失败判定,修正后的参考代码:

import sys
# 非零退出码取值范围固定为1~255,通用错误场景直接用1即可,也可以按错误类型匹配业界约定的退出码
error_code = 1
print(f'error_code: {error_code}')
sys.exit(error_code)

本地验证方法:在Linux/macOS环境下跑完脚本后立刻执行echo $?,如果输出值为非0,说明退出码设置正确,推送到仓库后Action就能正常识别失败状态。

2. (可选)开启工作流步骤严格错误检查

GitHub Actions 默认的run步骤已经会在命令返回非0退出码时标记失败,不需要额外改配置。如果脚本里用到管道、多命令串联的写法,可以显式指定bash开启严格错误检查,避免漏判错误,配置示例:

- name: test
      shell: bash -euo pipefail {0}
      run: python3 ./test_error_exit.py

开启该配置后的生效规则:

  • 步骤内任意命令返回非0退出码时,直接终止执行并标记失败
  • 引用未定义的变量时直接终止执行
  • 管道串联的命令中任意环节报错,直接判定整个管道执行失败

内容的提问来源于stack exchange,提问作者Scott Driscoll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:48:21