如何让uWSGI随失败子进程的退出码返回对应状态?
解决uWSGI Master进程不转发Worker退出码的问题
我来帮你搞定这个问题!你遇到的情况是uWSGI master进程的默认行为导致的——它不管worker子进程跑测试成功还是失败,自己退出时都返回0,完全不搭理子进程的退出码。下面给你两种可行的解决办法:
方法一:用钩子让Master继承Worker的退出码
直接修改你的uWSGI启动命令,添加一个hook-post-app钩子,让master进程在worker跑完测试后,用worker的退出码来终止自己:
uwsgi --set master=true --chdir /srv --pyrun /usr/local/bin/pytest --hook-post-app 'shell: exit $UWSGI_WORKER_1_EXIT_CODE'
这里的逻辑很简单:
--hook-post-app会在worker执行完pytest之后触发一个操作$UWSGI_WORKER_1_EXIT_CODE是uWSGI内置的环境变量,存着第一个worker进程的退出码- 最后通过
exit命令让master进程用这个退出码结束,这样CI服务器就能拿到正确的失败信号了
方法二:强制Master随Worker退出并继承退出码
如果你的uWSGI版本比较老,不支持上面的环境变量,还可以用这两个参数组合:
uwsgi --set master=true --chdir /srv --pyrun /usr/local/bin/pytest --die-on-worker-exit --wait-for-workers
--die-on-worker-exit:让master进程在worker退出时也跟着退出--wait-for-workers:让master等所有worker都跑完再退出,确保拿到正确的退出码
这个方案适合单worker的场景(就像你跑pytest这样),多个worker的话可能只会取第一个退出的worker的码。
验证一下
用修改后的命令重新跑测试,你会发现测试失败时,echo $?会返回1,完全符合CI服务器的要求;测试通过时则返回0,完美契合你的需求。
内容的提问来源于stack exchange,提问作者Gerrat
相关产品推荐
相关产品推荐

