首页 > 解决方案 > Travic CI 失败:名称解析暂时失败

问题描述

我尝试为 django 应用程序添加测试用例,但测试在本地成功通过,但在 Travis CI 上失败。

M.travis.yml文件如下所示:

    dist: bionic

    services:
     - postgresql
 
    addons:
     postgresql: '9.5'
     apt:
       packages:
         - postgresql-9.5

    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

我的settings.py样子是这样的:

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 上运行它时,会得到这个错误日志:

$ if [ "$TRAVIS_BRANCH" = "master" ]; then ./scripts/lib/run-ci; fi

Using existing test database for alias 'default' ('fecundity_test')...

/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/postgresql

/base.py:294: RuntimeWarning: Normally Django will use a connection to the 'postgres' database
 
to avoid running initialization queries against the production database when it's not needed
 
(for example, when running tests). Django was unable to create a connection to the 'postgres'
 
database and will use the first PostgreSQL database instead.

  warnings.warn(

Traceback (most recent call last):

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection

    self.connect()

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner

    return func(*args, **kwargs)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 197, in connect

    self.connection = self.get_new_connection(conn_params)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner

    return func(*args, **kwargs)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 185, in get_new_connection

    connection = Database.connect(**conn_params)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect

    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

psycopg2.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "./manage.py", line 21, in <module>

    main()

  File "./manage.py", line 17, in main

    execute_from_command_line(sys.argv)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line

    utility.execute()

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute

    self.fetch_command(subcommand).run_from_argv(self.argv)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/core/management/commands/test.py", line 23, in run_from_argv

    super().run_from_argv(argv)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv

    self.execute(*args, **cmd_options)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute

    output = self.handle(*args, **options)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/core/management/commands/test.py", line 53, in handle

    failures = test_runner.run_tests(test_labels)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/test/runner.py", line 684, in run_tests

    old_config = self.setup_databases(aliases=databases)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/test/runner.py", line 604, in setup_databases

    return _setup_databases(

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/test/utils.py", line 169, in setup_databases

    connection.creation.create_test_db(

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/creation.py", line 58, in create_test_db

    self._create_test_db(verbosity, autoclobber, keepdb)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/creation.py", line 168, in _create_test_db

    with self._nodb_connection.cursor() as cursor:

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner

    return func(*args, **kwargs)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 260, in cursor

    return self._cursor()

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 236, in _cursor

    self.ensure_connection()

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner

    return func(*args, **kwargs)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection

    self.connect()

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__

    raise dj_exc_value.with_traceback(traceback) from exc_value

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection

    self.connect()

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner

    return func(*args, **kwargs)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/base/base.py", line 197, in connect

    self.connection = self.get_new_connection(conn_params)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner

    return func(*args, **kwargs)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 185, in get_new_connection

    connection = Database.connect(**conn_params)

  File "/home/travis/virtualenv/python3.8.1/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect

    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution

The command "if [ "$TRAVIS_BRANCH" = "master" ]; then ./scripts/lib/run-ci; fi" exited with 1.

我不知道什么在起作用,我试图在互联网上搜索,但找不到任何帮助。进一步的 CI 无需测试即可通过。提前致谢。

标签: pythondjangopostgresqltravis-ci

解决方案


经过这么多努力,我发现失败的原因是,我没有在 Travis CI 中添加 EVN 变量。如果您遇到相同的错误,请在 TravisCI 的 ENV 设置中添加变量。


推荐阅读