У меня возникли проблемы с запуском модульных тестов в моем приложении django, когда оно работает через Jenkins.
У меня есть конвейер CI/CD, который работает python manage.py test и в настоящее время дает сбой с ошибкой:
django.db.utils.ProgrammingError: relation "auth_user" does not exist.
Локальный запуск тестов работает нормально, тестовая база данных обычно создается, и тесты выполняются нормально.
Я подключился по SSH к серверу, на котором настроен Дженкинс, чтобы попытаться запустить тесты вручную, но получаю те же результаты, поэтому я бы не сказал, что это что-то специфическое для Дженкинса.
Пользователь postgres имеет все привилегии и CREATEDB в базе данных, поэтому со стороны postgres все в порядке.
Это полное исключение:
Traceback (most recent call last):
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "auth_user" does not exist
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/agent/jenkins/workspace/INP-Backend/manage.py", line 22, in <module>
main()
File "/home/agent/jenkins/workspace/INP-Backend/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/test.py", line 24, in run_from_argv
super().run_from_argv(argv)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 402, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 448, in execute
output = self.handle(*args, **options)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/test.py", line 68, in handle
failures = test_runner.run_tests(test_labels)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/test/runner.py", line 1045, in run_tests
old_config = self.setup_databases(
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/test/runner.py", line 941, in setup_databases
return _setup_databases(
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/test/utils.py", line 220, in setup_databases
connection.creation.create_test_db(
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/base/creation.py", line 78, in create_test_db
call_command(
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 198, in call_command
return command.execute(*args, **defaults)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 448, in execute
output = self.handle(*args, **options)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 96, in wrapped
res = handle_func(*args, **kwargs)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 314, in handle
self.sync_apps(connection, executor.loader.unmigrated_apps)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 480, in sync_apps
self.stdout.write(" Running deferred SQL...")
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 164, in __exit__
self.execute(sql)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 199, in execute
cursor.execute(sql, params)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 103, in execute
return super().execute(sql, params)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/utils.py", line 91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "auth_user" does not exist
РЕДАКТИРОВАТЬ
Я не считаю, что этот вопрос следует пометить как дубликат. У меня возникла очень специфическая проблема: миграция не была полностью выполнена из-за отсутствия каталога миграции/файла __init__.py. Это было особенно сложно отладить, поскольку таблицы взяты из установленного стороннего пакета.
Да, миграции – это нормально. Проверяя обычную базу данных, я вижу, что все таблицы, включая «auth_user», находятся там. Однако я не думаю, что это актуально, поскольку django создает новую тестовую базу данных и автоматически переносит ее.
Это правда. Я подумал, что это может дать некоторые подсказки.
Что касается подсказок, все файлы миграции примерно для 30 приложений созданы правильно, и миграция создает все таблицы без каких-либо ошибок.
У вас в настройках одна конфигурация БД или несколько?
и есть ли у вас модели без миграций, например. определено в ваших тестах?
В настройках только одна конфигурация БД. Ни одна модель не обходится без миграций, я вручную зашел на свой промежуточный сервер, где находится еще один экземпляр того же приложения. Вытащил последнюю версию, без проблем запустил новые миграции и без проблем провел тесты. Кажется, все это указывает на некоторую проблему с созданием тестовой базы данных в среде jenkins. Однако я понятия не имею, с чего начать отладку, поскольку это выглядит как обычная ошибка отсутствия миграции.
Давайте продолжим обсуждение в чате.
Обратная трассировка предполагает, что Django еще даже не запускал тесты, произошла ошибка при выполнении миграции для тестовой базы данных. Можете ли вы выполнить миграцию для новой базы данных или произойдет аналогичная ошибка?
некоторые связанные вопросы: stackoverflow.com/q/56355516 , stackoverflow.com/q/50544714 , stackoverflow.com/q/69495933
@AbdulAzizBarkat ИМХО, вопрос должен оставаться открытым, поскольку предоставленные ссылки не отвечают на этот конкретный вопрос: текущая проблема возникает только при запуске тестов, и ОП явно упоминает, что миграция прошла успешно.
@djvg миграция на 100% завершится неудачно для новой базы данных в случае с ОП, а также это сработало только для них, потому что у них уже была существующая база данных. Проблема в принципе та же. Двойное закрытие не означает, что вопрос плохой, кстати, это может остаться указателем для этого вопроса :) (ИМО, ответы на этот вопрос гораздо более ясны, чем тот, который опубликован здесь)
@djvg, чтобы уточнить, ошибка здесь тоже только в миграции. Одним из этапов настройки тестовой базы данных является запуск в ней миграции.
Ниже я опубликовал ответ о том, что решило мою проблему. Однако я до сих пор не совсем понимаю, почему это решило проблему. Когда Django создает тестовую базу данных для модульного тестирования, он должен выполнить автоматическую миграцию этой базы данных. Если бы мне не хватало таблиц для модели, которая не используется в модульных тестах, почему бы это вызвало исключение?
@AbdulAzizBarkat Я выполнил новую миграцию в новой базе данных. Чтобы уточнить, без предыдущих файлов миграции и в пустой базе данных. Все миграции прошли успешно. Таблицы из стороннего приложения не были созданы, но миграция не выдавала ошибку, как и все остальные части приложения. По сути все работает, за исключением стороннего приложения, которое является инструментом разработки.
«без предыдущих файлов миграции и в пустой базе данных» отличается от «без ранее примененных миграций». Создание новых файлов миграции (вам не следует делать это в рабочей среде!) на самом деле не является эффективным сравнением (миграции похожи на дерево зависимостей), если вы работаете с теми же файлами миграции (те же установленные приложения и т. д.), что и вы. смогу воспроизвести ошибку. Опять же, ошибка на самом деле не связана с тестами, запуск тестов предполагает выполнение миграции в тестовую базу данных, что и является причиной ошибки.





Я решил проблему. После того, как @djvg упомянул модели без миграции, я углубился в тему. Оказывается, приложение не переносилось автоматически, и для него необходимо было выполнить миграцию вручную.
Я до сих пор понятия не имею, почему это полностью остановило тесты, поскольку это приложение не зависит от других приложений и не используется в тестовых случаях, но миграция этого приложения конкретно решила мою проблему.
О, так приложение, в котором использовалась ваша пользовательская модель, не имело каталога migration или в каталоге отсутствовал файл __init__.py?
Правильно. На самом деле это был установленный сторонний пакет, в котором отсутствовал файл __init__.py, поэтому он не переносит его автоматически.
Если это стороннее приложение, вам следует избегать создания для него миграции. Если дело в том, что файл __init__.py просто отсутствовал, и вы на самом деле не создавали для него никаких миграций, все должно быть в порядке. В любом случае вам следует сообщить об этом разработчику приложения. См.: stackoverflow.com/a/38277776
ты пробовал бежать
python manage.py migrate?