GitLab上Django项目CI/CD配置求助:测试数据库连接失败及部署问题
解决GitLab CI/CD中Django测试数据库连接问题及部署配置指南
一、修复测试环节的MySQL连接错误
你已经给CI配置加了MySQL服务,但测试还是报连接失败,核心问题出在数据库主机配置不匹配。GitLab CI里的mysql服务是作为独立容器运行的,和你的测试Job容器不在同一个localhost环境里,不能用127.0.0.1作为数据库主机,得用服务名mysql才行。
具体调整步骤:
同步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。确认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
相关产品推荐
相关产品推荐

