如何在GitHub Actions后台启动Django 避免阻塞后续任务执行
GitHub Actions启动Django不阻塞后续步骤的解决方案
核心问题排查
你当前的配置存在两个核心问题:
- 你的
backend.sh脚本中执行的是python3 manage.py test(后端测试命令),并不是启动Django开发服务器的命令,运行后不会有服务监听8000端口 - 即使换成启动命令,默认前台运行会阻塞当前步骤,且直接后台运行可能出现服务还没启动完成就执行前端测试的情况,导致前端请求失败
修改方案
1. 调整backend.sh启动脚本
将脚本内的测试命令替换为Django开发服务器启动命令,添加--noreload参数禁用热重载,避免启动多余进程:
# Backend 启动脚本 cd backend/ && \ sudo service postgresql start && \ source .venv/bin/activate && \ # 绑定本地地址,禁用热重载启动开发服务器 python3 manage.py runserver 127.0.0.1:8000 --noreload
2. 修改GitHub Actions配置,后台启动Django
使用nohup命令将Django进程放到后台运行,避免阻塞当前步骤,同时保存输出日志方便后续排查问题:
- name: Starting backend run: | # 后台启动Django,日志输出到django.log nohup ./backend.sh > django.log 2>&1 & # 保存进程PID,后续可用于停止服务 echo $! > django.pid shell: bash
3. 新增服务等待步骤(必加)
在启动后端和测试前端之间新增等待步骤,确保Django完全启动后再执行前端测试:
- name: 等待Django服务启动 run: | # 循环检查端口是否可访问,最多等待30秒 for i in {1..30}; do if curl -s http://127.0.0.1:8000 > /dev/null; then echo "Django服务启动成功" exit 0 fi echo "等待Django启动中,第$i秒..." sleep 1 done echo "Django服务启动超时" exit 1 shell: bash
4. 可选:添加日志排查和服务停止步骤
如果需要定位启动失败问题,或者需要主动停止服务,可以添加以下步骤:
# 启动失败时打印Django日志 - name: 打印Django运行日志 if: failure() run: cat django.log shell: bash # 测试完成后停止Django服务(非必须,Action运行结束后虚拟机会自动销毁) - name: 停止Django服务 if: always() run: kill $(cat django.pid) shell: bash
原理说明
nohup命令可以让进程忽略终端会话结束时发送的SIGHUP信号,保证后台进程不会随着当前步骤的shell会话结束被杀死- 末尾的
&符号会将进程切换到后台运行,不会阻塞当前步骤的执行 - 加
--noreload参数是因为Django默认的热重载功能会启动父子两个进程,只保存父进程PID无法彻底关闭服务,且CI环境不需要热重载能力 - 等待步骤可以避免前端测试执行时Django还没完成初始化,导致接口请求失败
内容的提问来源于stack exchange,提问作者MatiasLGonzalez
相关产品推荐
相关产品推荐

