← Назад к вопросам

Как встроить проверку типов в 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)} ошибок")

Выводы

  1. mypy - стандартный выбор для типизации Python
  2. Встроение в CI обязательно через GitHub Actions или GitLab CI
  3. Постепенное внедрение - не требуй 100% типизации сразу
  4. Pre-commit hooks экономят время разработчиков
  5. Игнорирование правил для legacy кода с планом миграции
  6. Мониторинг тренда - количество ошибок должно снижаться
Как встроить проверку типов в CI/CD? | PrepBro