在GitLab CI中,Django测试总是使用PostgreSQL而不是SQLite,尽管APP_ENV已被覆盖
我在GitLab CI中运行Django测试,想在SQLite(用于本地/测试)和PostgreSQL(用于生产)之间切换。
我的设置结构如下:
settings/_init_.py:
import os
APP_ENV = os.getenv("APP_ENV", "local")
if APP_ENV == "local":
from .local import DATABASES
elif APP_ENV == "production":
from .production import DATABASES
else:
raise ValueError("Incorrect configuration")
production.py:
import os
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.getenv("POSTGRES_DB"),
"USER": os.getenv("POSTGRES_USER"),
"PASSWORD": os.getenv("POSTGRES_PASSWORD"),
"HOST": os.getenv("POSTGRES_HOST"),
"PORT": os.getenv("POSTGRES_PORT"),
}
}
local.py:
from .base import BASE_DIR
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
在GitLab CI (.gitlab-ci.yml) 中,我的测试任务长这样:
backend:test:
stage: test
image: python:3.13-slim
variables:
APP_ENV: local
services:
- name: postgres:15-alpine
alias: postgres
script: - uv run python manage.py test
我期望的结果
当 APP_ENV=local 时,测试应该使用SQLite。
实际发生了什么
测试总是使用PostgreSQL,并报错。
回溯信息:
django.db.utils.OperationalError: 连接到套接字 "/var/run/[MASKED]ql/.s.PGSQL.5432" 的服务器失败:没有这样的文件或目录
服务器是否正在本地运行并在该套接字上接受连接?
解决方案
我最终解决了这个问题。我查看了关于PostgreSQL的 GitLab文档(https://docs.gitlab.com/ci/services/postgres/)以及如何在流水线中运行它的实例。需要把PostgreSQL服务添加到默认配置中,而不是放在作业内部:
default:
interruptible: true
retry: 1
services:
- name: postgres
alias: db,postgres,pg
并添加全局变量,而不是把它们放在services中:
variables:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_HOST: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_HOST_AUTH_METHOD: trust
下面是backend:test作业:
backend:test:
stage: test
image: python:3.13-slim
before_script:
- apt-get update && apt-get install -y python3-dev gcc libpq-dev postgresql-client
- python -m pip install --upgrade pip
- pip install uv
- cd backend/api
- uv sync --frozen
script:
- uv run python manage.py check
- uv run python manage.py test
感谢你的回答和评论。希望这能帮助未来遇到同样问题的朋友。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。