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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:24:04