Git лабораторных тестов CI «насморк» с помощью SqlAlchemy. ОШИБКА: Ошибка: TypeError (невозможно применить этот __setattr__ к объекту DefaultMeta) - PullRequest
1 голос
/ 14 июля 2020

Я работаю над приложением Flask с базой данных Postgres. Когда я запускаю носовые тесты локально, все работает нормально, но когда я загружаю код в GitLab, это происходит в моем конвейере. Я использую gitlab-ci. Приветствуются любые предложения по решению этой проблемы.

$ nosetests --with-coverage --cover-package=app
EEEEE
======================================================================
ERROR: Failure: TypeError (can't apply this __setattr__ to DefaultMeta object)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/nose/failure.py", line 39, in runTest
    raise self.exc_val.with_traceback(self.tb)
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/nose/loader.py", line 417, in loadTestsFromName
    module = self.importer.importFromPath(
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/usr/local/lib/python3.8/imp.py", line 244, in load_module
    return load_package(name, filename)
  File "/usr/local/lib/python3.8/imp.py", line 216, in load_package
    return _load(spec)
  File "<frozen importlib._bootstrap>", line 702, in _load
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/builds/Mubangizi1/mobile_shop_backend/app/controllers/__init__.py", line 2, in <module>
    from .product import (ProductDetailView, ProductView)
  File "/builds/Mubangizi1/mobile_shop_backend/app/controllers/product.py", line 6, in <module>
    from app.models.product import Product
  File "/builds/Mubangizi1/mobile_shop_backend/app/models/__init__.py", line 3, in <module>
    db = SQLAlchemy()
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", line 715, in __init__
    self.Model = self.make_declarative_base(model_class, metadata)
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", line 797, in make_declarative_base
    model.query_class = self.Query
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/sqlalchemy/ext/declarative/api.py", line 79, in __setattr__
    _add_attribute(cls, key, value)
  File "/builds/Mubangizi1/mobile_shop_backend/venv/lib/python3.8/site-packages/sqlalchemy/ext/declarative/base.py", line 802, in _add_attribute
    type.__setattr__(cls, key, value)
TypeError: can't apply this __setattr__ to DefaultMeta object
======================================================================
ERROR: Failure: TypeError (can't apply this __setattr__ to DefaultMeta object)
----------------------------------------------------------------------
.
.
.
Ran 5 tests in 0.550s
FAILED (errors=5)
ERROR: Job failed: exit code 1

Это мой .gitlab-ci.yml файл, содержащий конфигурации конвейера.

image: python:latest
# # Change pip's cache directory to be inside the project directory since we can
# # only cache local items.
variables:
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
  
cache:
  paths:
    - .cache/pip
    - venv/

before_script:
  - python -V  # Print out python version for debugging
  - pip install virtualenv
  - virtualenv venv
  - source venv/bin/activate

stages:
  - test

test:
  stage: test
  services:
    - postgres:alpine
  variables:
    POSTGRES_DB: mobile_shop_test_db
    POSTGRES_USER: postgres
    POSTGRES_HOST: postgres
    POSTGRES_PORT: 5432
    POSTGRES_PASSWORD: password
  
  script:
    - export FLASK_APP=server.py
    - export FLASK_ENV=testing
    - export DATABASE_TEST_URI=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/mobile_shop_test_db
    - export FLASK_APP_SECRET=qY2i691SX2sEuZ7LUjY180RS98mw3qCeUiyV0i0vzmg
    - apt-get update -qy
    - apt-get install -y python-dev python-pip
    - pip install -r requirements.txt
    - nosetests --with-coverage --cover-package=app
    - codecov

1 Ответ

1 голос
/ 15 июля 2020

Похоже, проблема возникла в языке python.

Чтобы исправить это:

Вы можете вернуть версию python, с которой вы строите, или если вы используете docker, временно исправьте изображение python, используя python: 3.8.3-slim или эквивалентное изображение. Вы также можете дождаться выхода исправления.

Вы можете увидеть соответствующий запрос на вытягивание здесь: https://github.com/python/cpython/pull/21473

Здесь представлено: https://bugs.python.org/issue39960

Ошибка исправления здесь: https://bugs.python.org/issue41295

Другая проблема в несвязанном пакете, которая представляет собой ту же ошибку: flask_sqlalchemy: ошибка с `__setattr__` на DefaultMeta

Edit: более новая версия с исправлением отсутствует. Посмотрите любое изображение python: 3.8.5 +

...