
能自动测试并发布Django项目,但必须在CI里显式跑 python manage.py check --deploy 和 python manage.py migrate --check,否则测试通过 ≠ 能上线。
为什么 pytest 通过了,部署时还报 AppRegistryNotReady?
Django 的单元测试默认用内存数据库、mock 掉中间件和信号,pytest 绿了不代表真实环境能启动。常见漏掉的检查点:
-
manage.py check --deploy检查是否禁用了DEBUG=True、ALLOWED_HOSTS是否为空、密钥是否硬编码 -
manage.py migrate --check验证迁移文件是否可执行(避免migrate在生产环境卡住或失败) - 没加载
settings.production就直接跑测试,导致数据库连接参数错配
GitLab CI 中怎么让 Django 测试真正贴近生产?
关键不是换镜像,而是复用生产配置启动测试环境。推荐做法:
- 在
.gitlab-ci.yml的testjob 里,用python manage.py runserver --noreload --settings=myproject.settings.production &启一个后台服务,再用curl -f http://127.0.0.1:8000/health/做端到端健康检查 - 数据库用
postgres:15容器,而不是 SQLite —— 否则JSONField、ArrayField或事务行为会掩盖问题 - 把
DJANGO_SETTINGS_MODULE设为myproject.settings.production,并在该文件中用os.getenv('DB_URL')动态读取数据库地址,CI 中用variables:注入
发布前怎么防止 wheel 包漏依赖或版本冲突?
本地 pip install -e . 成功 ≠ CI 构建出的 wheel 可安装。容易踩的坑:
立即学习“Python免费学习笔记(深入)”;
-
pyproject.toml里只写requires = ["setuptools>=45", "wheel"],但没声明build-backend = "setuptools.build_meta",导致python -m build忽略install_requires - 用
setup.py时没加include_package_data=True,静态文件或模板目录被排除在 wheel 外 - CI 中构建 wheel 后,必须立刻用
pip install dist/*.whl+python -c "import myproject; myproject.check()"做安装后验证
GitHub Actions 发布到 PyPI 时怎么避免凭据泄露?
别把 ~/.pypirc 或明文 token 提交进仓库。安全做法只有两种:
- 用 GitHub Secrets 存
PYPI_API_TOKEN,在publishstep 中传给twine upload:TWINE_PASSWORD=${{ secrets.PYPI_API_TOKEN }} python -m twine upload dist/* - 如果走私有仓库(如 Nexus 或 Artifactory),改用
--repository-url+--username/--password,密码同样从 Secrets 注入 - 绝对不要在
publishjob 里执行pip install -r requirements.txt—— 这会污染环境,可能装错版本覆盖掉刚构建的包
真正难的不是写流水线,而是让每一步都模拟真实部署路径:从配置加载、迁移校验、包安装到服务启动,缺一不可。漏掉任意一环,自动化就只是“看起来很美”的假动作。


















