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

GitLab上Django项目CI/CD配置求助:测试数据库连接失败及部署问题

解决GitLab CI/CD中Django测试数据库连接问题及部署配置指南

一、修复测试环节的MySQL连接错误

你已经给CI配置加了MySQL服务,但测试还是报连接失败,核心问题出在数据库主机配置不匹配。GitLab CI里的mysql服务是作为独立容器运行的,和你的测试Job容器不在同一个localhost环境里,不能用127.0.0.1作为数据库主机,得用服务名mysql才行。

具体调整步骤:

  1. 同步CI变量与Django数据库配置
    在gitlab-ci.yml里,把MySQL服务的参数和Django的环境变量对应上,同时覆盖Django的DB_HOST值:

    stages:
      - test
      - deploy
    
    services:
      - mysql:8.0  # 指定MySQL版本,避免兼容性问题
    
    variables:
      MYSQL_DATABASE: db_name  # 和你.env里的DB_NAME保持一致
      MYSQL_ROOT_PASSWORD: dbpass  # 和你.env里的DB_PASSWORD一致
      MYSQL_USER: username  # 和你.env里的DB_USER一致
      MYSQL_PASSWORD: dbpass
      # 覆盖Django的环境变量,指向CI中的MySQL服务容器
      DB_HOST: mysql
    
    test:
      stage: test
      script:
        - apt update -qy
        - apt install python3 python3-pip virtualenvwrapper default-libmysqlclient-dev -qy  # 新增MySQL依赖库,防止安装mysqlclient失败
        - virtualenv --python=python3 venv/
        - source venv/bin/activate
        - pip install -r requirements.txt
        - python manage.py test
      only:
        - develop
    

    注意:要确保requirements.txt里包含mysqlclient(或pymysql,如果用后者需要在settings.py里做初始化配置),否则Django无法连接MySQL。

  2. 确认Django的数据库配置逻辑
    你的settings.py里的数据库配置必须是读取环境变量的,类似这样:

    import os
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.getenv('DB_NAME'),
            'USER': os.getenv('DB_USER'),
            'PASSWORD': os.getenv('DB_PASSWORD'),
            'HOST': os.getenv('DB_HOST', '127.0.0.1'),
            'PORT': os.getenv('DB_PORT', '3306'),
        }
    }
    

    这样CI中设置的DB_HOST=mysql会覆盖.env里的127.0.0.1,让Django正确连接到CI的MySQL服务容器。

二、部署环节配置示例(SSH部署到私有服务器)

假设你要部署到Linux服务器,这里提供基于SSH的部署方案,需要先在GitLab项目的Settings > CI/CD > Variables中添加三个变量:

  • SSH_PRIVATE_KEY:服务器的SSH私钥(用于免密登录)
  • SERVER_HOST:服务器IP或域名
  • SERVER_USER:服务器登录用户名

完整的gitlab-ci.yml部署部分:

deploy:
  stage: deploy
  script:
    # 安装SSH客户端并配置密钥
    - apt update -qy && apt install openssh-client -qy
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan $SERVER_HOST >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts

    # 连接服务器执行部署操作
    - ssh $SERVER_USER@$SERVER_HOST "cd /path/to/your/project && git pull origin develop"
    - ssh $SERVER_USER@$SERVER_HOST "cd /path/to/your/project && source venv/bin/activate && pip install -r requirements.txt"
    - ssh $SERVER_USER@$SERVER_HOST "cd /path/to/your/project && source venv/bin/activate && python manage.py migrate --noinput"
    # 根据你的服务管理器调整,比如用systemd重启gunicorn服务
    - ssh $SERVER_USER@$SERVER_HOST "sudo systemctl restart gunicorn.service"
  only:
    - develop
  # 确保测试通过后才触发部署
  needs: ["test"]

部署注意事项:

  • 服务器上需要提前完成项目初始化:克隆代码、创建虚拟环境、配置生产版的.env(记得把DEBUG设为False)
  • 如果用Nginx做反向代理,可在最后添加ssh $SERVER_USER@$SERVER_HOST "sudo systemctl restart nginx.service"重启Nginx
  • 生产环境建议用Systemd、Supervisor等进程管理器来托管Django服务,避免进程意外终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:09:06