Как настроить проверку типов mypy в CI/CD для Python-проекта

Ответ

Интеграция статической проверки типов с помощью mypy в CI/CD пайплайн позволяет автоматически выявлять ошибки типизации до слияния кода в основную ветку. Это повышает надежность и упрощает рефакторинг.

Процесс состоит из трех основных шагов:

  1. Установка mypy Добавьте mypy в зависимости для разработки (например, в requirements-dev.txt).

  2. Настройка CI-пайплайна Добавьте шаг для запуска mypy в конфигурационный файл вашего CI-сервиса. Ниже приведен пример для GitHub Actions:

    # .github/workflows/ci.yml
    name: Python CI
    
    on: [push, pull_request]
    
    jobs:
      lint-and-type-check:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - name: Set up Python
            uses: actions/setup-python@v4
            with:
              python-version: '3.10'
          - name: Install dependencies
            run: |
              pip install -r requirements.txt
              pip install mypy
          - name: Run mypy
            run: mypy .
  3. Конфигурация mypy (опционально) Для более строгого контроля создайте файл mypy.ini или pyproject.toml в корне проекта.

    # mypy.ini
    [mypy]
    python_version = 3.10
    warn_return_any = True
    disallow_untyped_defs = True # Запретить функции без аннотаций
    ignore_missing_imports = True # Игнорировать ошибки для библиотек без типов

Ключевые преимущества:

  • Раннее обнаружение ошибок: Ошибки типов блокируют сборку, не попадая в продакшн.
  • Автоматизация: Проверка выполняется автоматически при каждом коммите.
  • Настраиваемая строгость: Уровень проверок можно гибко настраивать под нужды проекта.

Ответ 18+ 🔞

Ну что за день сегодня, блядь! Сижу, кофе пью, и тут мне приходит в голову мысль — а ведь народ до сих пор в CI/CD пайплайнах статическую проверку типов не ставит! Ну это же пиздец, товарищи! Это как ехать на машине с завязанными глазами и надеяться, что в столб не влетишь.

Так вот, слушай сюда, пока я не обосрался от возмущения. Интеграция mypy — это не какая-то хуйня собачья, а реально полезная штука. Она как злой батальонный прапорщик, который стоит перед слиянием кода в main и орет: «А ну-ка, покажи сюда свои типы, говна кусок! Не сойдётся — нахуй пойдёшь переделывать!».

Делается всё проще пареной репы, на три шага.

Шаг первый, установочный. Засунул mypy в requirements-dev.txt или в pyproject.toml в раздел для разработки. Всё, приехали. Теперь у тебя есть инструмент, который будет ебать мозг всем, кто пишет код без аннотаций.

Шаг второй, главный — CI/CD. Тут нужно в конфиг вашего пайплайна (я для примера возьму GitHub Actions, ибо он везде) добавить один простой шаг. Смотри, как красота выглядит:

# .github/workflows/ci.yml
name: Python CI

on: [push, pull_request]

jobs:
  lint-and-type-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install mypy
      - name: Run mypy
        run: mypy .

Видишь эту строчку run: mypy .? Вот она и есть наш прапорщик. Он пройдётся по всему проекту и, если найдёт какую-то хуйню в типах, сборка упадёт. И пулл-реквест твой никто не смержит, пока ты не починишь. Красота, ёпта!

Шаг третий, для самых хитрых — конфигурация. Можно же не просто так mypy запустить, а настроить его под себя. Создаёшь файлик mypy.ini и пишешь туда свои хотелки. Например, вот так:

# mypy.ini
[mypy]
python_version = 3.10
warn_return_any = True
disallow_untyped_defs = True # Эта штука не даст тебе писать функции без аннотаций, как последнему распиздую!
ignore_missing_imports = True # А это чтобы не орал на библиотеки, у которых типов нет. Ибо нихуя не поделаешь.

И что мы, блядь, получаем в итоге? А получаем мы овердохуище пользы:

  • Ошибки ловятся раньше, чем ты успеешь сказать «ёперный театр».
  • Всё автоматом. Запушил код — и жди результат. Не надо вручную ничего гонять.
  • Строгость — на твой вкус. Хочешь — заставь всех писать типы везде. Не хочешь — можно и послабее. Но лучше жёстко, а то народ расслабляется, пидарасы.

В общем, если до сих пор не интегрировал — ты просто конченый мазохист, который любит искать баги в проде в три часа ночи. Делай как умные люди, блядь.