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

如何在GitHub Action实例中优雅停止Django开发服务器以获取测试覆盖率

解决方案

方法1:正确获取并优雅终止Django进程

首先要解决PID获取和跨步骤传递的问题,GitHub Action的每个run步骤是独立shell,环境变量不共享,所以需要把PID写入文件留存:

- name: 启动后端服务器
  run: |
    poetry run coverage run ./manage.py runserver --no-reload &
    # 将进程PID写入文件
    echo $! > django_server.pid

停止服务器时读取PID文件,发送Django能识别的SIGINT信号(runserver默认对该信号响应优雅退出,确保coverage数据写入):

# 发送终止信号
kill -SIGINT $(cat django_server.pid)
# 等待进程完全退出,避免后续步骤提前执行
wait $(cat django_server.pid)

方法2:改用Django test命令结合coverage(更推荐)

无需手动启动runserver测试API,Django内置的test命令可以直接处理API测试,且自动管理服务器生命周期,更适配CI环境:

- name: 运行API测试并收集覆盖率
  run: poetry run coverage run ./manage.py test your_api_app --keepdb

测试完成后直接生成覆盖率结果:

# 生成文本报告
poetry run coverage report
# 或生成HTML可视化报告
poetry run coverage html

这种方式完全避免手动管理进程的麻烦,coverage会自动收集所有测试相关的代码覆盖数据。

方法3:精准匹配进程终止

如果坚持使用runserver启动方式,调整pkill的匹配规则,确保精准命中目标进程:

# 匹配包含完整命令的进程并发送SIGINT
pkill -f "coverage run ./manage.py runserver"
# 或者先确认进程存在再终止
pgrep -f "coverage run ./manage.py runserver" | xargs kill -SIGINT

排查你之前命令的问题

  • kill -SIGTERM $DJANGO_PI是变量名笔误,应为$DJANGO_PID
  • Django的runserver对SIGTERM信号响应不如SIGINT敏感,优先用SIGINT触发优雅退出
  • 跨步骤时环境变量不共享,直接用$DJANGO_PID会导致变量为空,必须用文件存储PID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:40:59