Travis CI中Django测试失败:无法解析主机名'db'
解决Travis CI上Django测试无法解析PostgreSQL主机名'db'的问题
这问题我之前也碰到过,核心原因是Travis CI的PostgreSQL服务运行在虚拟机本地,而非Docker容器环境,所以你配置的主机名db无法被解析——这个主机名通常是Docker Compose中数据库服务的名称,本地用Docker的话能正常解析,但Travis里不适用。
具体解决方案:
1. 调整Travis CI的环境变量配置
在你的.travis.yml中添加env字段,明确指定PostgreSQL的连接参数,把POSTGRES_HOST设为localhost(Travis的PostgreSQL默认监听本地):
dist: bionic services: - postgresql addons: postgresql: '9.5' apt: packages: - postgresql-9.5 # 新增全局环境变量配置 env: global: - POSTGRES_DB=fecundity_test - POSTGRES_USER=postgres - POSTGRES_PASSWORD='' - POSTGRES_HOST=localhost - POSTGRES_TEST_DB=fecundity_test before_script: - psql -c 'create database fecundity_test;' -U postgres branches: only: - "master" language: python python: - "3.8" install: - if [ "$TRAVIS_BRANCH" = "master" ]; then pip install -r requirements/dev.txt; fi - if [ "$TRAVIS_BRANCH" = "master" ]; then pip install coveralls; fi script: - if [ "$TRAVIS_BRANCH" = "master" ]; then ./scripts/lib/run-ci; fi after_success: - if [ "$TRAVIS_BRANCH" = "master" ]; then coveralls; fi
2. 或者在Django的settings.py中针对Travis环境做适配
如果不想修改Travis配置,也可以在settings.py里判断是否处于Travis环境,自动调整数据库主机:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ['POSTGRES_DB'], 'USER': os.environ['POSTGRES_USER'], 'PASSWORD': os.environ['POSTGRES_PASSWORD'], 'HOST': os.environ['POSTGRES_HOST'], 'PORT': '', 'ATOMIC_REQUESTS': True, 'TEST': { 'NAME': os.environ['POSTGRES_TEST_DB'] } }, } # 针对Travis CI环境自动修正主机名 if 'TRAVIS' in os.environ: DATABASES['default']['HOST'] = 'localhost'
额外注意事项:
- 确保
POSTGRES_TEST_DB的值和你在before_script中创建的数据库名一致(这里都是fecundity_test),避免测试时找不到数据库。 - Travis的PostgreSQL默认不需要密码(用户
postgres的密码为空),所以POSTGRES_PASSWORD设为空字符串即可。
内容的提问来源于stack exchange,提问作者foragerDev
相关产品推荐
相关产品推荐

