如何在GitHub Actions中让服务器后台运行以执行测试?
解决GitHub Actions中FastAPI服务后台运行并执行测试的问题
你遇到的核心问题是启动服务的进程占据了当前终端会话,导致后续测试步骤无法执行。nohup没生效大概率是因为没把进程彻底放到后台,或者缺少输出重定向,另外还需要确保服务完全启动后再跑测试。下面给你几个可行的方案:
方案一:完善后台启动命令+等待服务就绪
直接修改Actions里的启动步骤,把进程放到后台并处理输出,然后添加等待服务启动的逻辑:
- name: Start Fastapi service run: | nohup make serve > /dev/null 2>&1 & - name: Wait for service to be ready run: | until curl -s http://localhost:8000/health; do sleep 1 done
这里假设你的FastAPI有/health健康检查接口,如果没有,也可以用curl -s http://localhost:8000或者根据你的服务端口调整。如果curl没装,也可以用wget --spider http://localhost:8000替代。
方案二:直接在命令行后台启动服务(跳过Makefile)
有时候Makefile的目标会影响后台进程的处理,你可以绕过Makefile,直接在Actions里启动服务:
- name: Start Fastapi service run: | nohup python app.py > /dev/null 2>&1 & - name: Wait for service to be ready run: | sleep 5 # 简单粗暴的等待,适合测试环境,或者用上面的轮询方式
这种方式减少了Makefile的中间层,更直接可控。
方案三:使用screen创建后台会话
如果上面的方法还是不行,可以用终端复用工具把服务放到独立会话里:
- name: Install screen run: sudo apt-get install -y screen - name: Start Fastapi service in screen run: | screen -dmS fastapi_service make serve - name: Wait for service to be ready run: | until curl -s http://localhost:8000; do sleep 1 done
screen -dmS会创建一个后台会话并执行命令,不会阻塞当前步骤。
关键注意事项
- 不管用哪种方法,必须添加等待服务就绪的步骤,否则测试启动时服务可能还没完全初始化,导致测试失败。
- 输出重定向
> /dev/null 2>&1很重要,它会把nohup的输出扔到黑洞,避免占用终端输出缓冲区导致进程挂起。
内容的提问来源于stack exchange,提问作者MAckenzie
相关产品推荐
相关产品推荐

