← Назад к вопросам
Как встроить проверку типов в CI/CD?
2.0 Middle🔥 201 комментариев
#DevOps и инфраструктура#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Встроение проверки типов в CI/CD pipeline
Проверка типов - один из ключевых шагов в CI/CD, предотвращающий целый класс багов. Я встраивал различные инструменты в зависимости от требований проекта.
Инструменты для type checking
mypy - статический анализатор типов
pip install mypy
mypy src/ # базовый запуск
mypy --strict src/ # строгий режим
pyright от Microsoft
pip install pyright
pyright src/
pyre от Meta
pip install pyre-check
pyre check
Конфигурация mypy в pyproject.toml
[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
check_untyped_defs = true
no_implicit_optional = true
follow_imports = "normal"
GitHub Actions pipeline
name: Type Check
on: [push, pull_request]
jobs:
mypy:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.9', '3.10', '3.11']
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- run: pip install mypy -r requirements-dev.txt
- run: mypy src/ --strict
Примеры типизации
from typing import Dict, List, Optional
from dataclasses import dataclass
@dataclass
class User:
email: str
name: str
age: int
def process_users(users: List[User]) -> Dict[str, str]:
return {user.email: user.name for user in users}
async def fetch_user(user_id: int) -> Optional[User]:
return await db.get(User, user_id)
GitLab CI конфигурация
type-check:mypy:
stage: test
image: python:3.10
script:
- pip install mypy -r requirements-dev.txt
- mypy src/ --strict
allow_failure: false
Pre-commit hooks
repos:
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.0.1
hooks:
- id: mypy
args: [--strict]
additional_dependencies: ["types-all"]
Установка:
pip install pre-commit
pre-commit install
pre-commit run --all-files
Обработка ошибок типизации
Игнорирование строки
def legacy_function(x): # type: ignore
return x['field']
Игнорирование модуля
[mypy-migrations.*]
ignore_errors = True
[mypy-tests.*]
ignore_errors = True
Стратегия внедрения
Фаза 1: Мягкое введение (только report)
mypy src/ --ignore-missing-imports
Фаза 2: Усиление (требуем типы для новых модулей)
mypy src/ --strict
Фаза 3: Полная типизация всего кода
Скрипт отслеживания качества
import subprocess, json, sys
result = subprocess.run(
['mypy', 'src/', '--json'],
capture_output=True, text=True
)
errors = json.loads(result.stdout)
if len(errors) > 10:
print(f"FAIL: {len(errors)} ошибок типов")
sys.exit(1)
print(f"OK: {len(errors)} ошибок")
Выводы
- mypy - стандартный выбор для типизации Python
- Встроение в CI обязательно через GitHub Actions или GitLab CI
- Постепенное внедрение - не требуй 100% типизации сразу
- Pre-commit hooks экономят время разработчиков
- Игнорирование правил для legacy кода с планом миграции
- Мониторинг тренда - количество ошибок должно снижаться