GitHub Actions中Docker Compose执行pytest时触发exit code 137错误求助
嘿,我之前也碰到过一模一样的问题!exit code 137本质就是进程因为内存不足被系统强制杀死的信号——毕竟GitHub Actions托管的runner资源有限(默认的ubuntu-latest runner只有2核7GB内存),而你本地用act跑的时候用的是自己机器的资源,内存富余自然不会触发这个问题。下面给你几个亲测有效的解决思路:
优化测试用例的内存开销
先自查下你的测试用例:是不是有加载大量测试数据、创建了过多未释放的对象,或者一次性跑了太多大型测试?可以试着把大测试拆成多个小测试,或者用pytest的fixture在每个测试用例执行完后清理资源,比如关闭数据库连接、删除临时文件等。另外如果用了pytest-cov做覆盖率统计,临时加个--no-cov参数跑测试,排除覆盖率工具额外占用内存的可能。给Docker容器设置内存限制
你的testing.yaml里可以给api服务加上内存限制,避免它抢占runner的全部内存导致OOM(内存溢出):services: api: # 保留你原来的镜像、端口等配置 deploy: resources: limits: memory: 4G # 根据实际情况调整,别超过runner的总内存启动的时候记得加上
--compatibility参数让限制生效:docker compose --compatibility -f testing.yaml up -d调整GitHub Actions的执行方式,减少Docker开销
其实没必要在Docker容器里跑pytest,你可以把依赖服务(比如数据库、缓存)用docker compose启动,然后直接在GitHub Actions的runner环境里跑测试,这样能省掉一个容器的内存开销:- 先启动测试依赖的服务:
docker compose -f testing.yaml up -d db cache(替换成你实际的依赖服务名) - 在runner里进入api目录,创建虚拟环境、安装requirements.txt里的依赖包
- 设置好连接依赖服务的环境变量(比如数据库地址设为
localhost:5432),然后直接跑pytest
- 先启动测试依赖的服务:
升级runner规格(付费方案可选)
如果你的测试确实需要大量内存,而上面的优化都不管用,可以考虑使用GitHub的更大规格托管runner,比如ubuntu-latest-4core(这个需要开启GitHub付费计划),它有4核14GB内存,能扛住更吃内存的测试任务。
另外给你个排查小技巧:在workflow的测试步骤前后加个查看内存的命令,确认是不是真的内存耗尽了,比如:
free -h
把这个命令加到测试执行的前一步和后一步,就能看到内存使用的变化情况。
备注:内容来源于stack exchange,提问作者Dejvinczi

