Как автоматизировать проверку качества кода в CI/CD?

Ответ

Автоматизация проверки качества кода является критически важной частью современного процесса разработки, обеспечивая консистентность, надежность и поддерживаемость кодовой базы. Это достигается интеграцией различных инструментов в рабочий процесс разработчика и в конвейеры CI/CD.

Основные инструменты и их назначение:

  1. Линтеры (Linters):

    • Flake8: Объединяет проверку стиля кода (PEP8), сложности кода (McCabe) и базовые ошибки. Почему: Обеспечивает соответствие стандартам кодирования, улучшает читаемость и предотвращает распространенные ошибки.
    • Pylint: Более строгий и всеобъемлющий статический анализатор кода, выявляющий широкий спектр проблем, от ошибок до нарушений стиля и потенциальных "запахов" кода. Почему: Глубокий анализ помогает находить скрытые проблемы и улучшать архитектуру.
  2. Форматтеры кода (Code Formatters):

    • Black: Автоматический, бескомпромиссный форматтер кода Python. Почему: Устраняет споры о стиле, обеспечивает единообразное форматирование по всему проекту, снижает когнитивную нагрузку.
  3. Статические анализаторы типов (Static Type Checkers):

    • Mypy: Проверяет аннотации типов в Python-коде. Почему: Помогает выявлять ошибки, связанные с типами, на ранних стадиях разработки, улучшает документацию и предсказуемость кода.

Интеграция в рабочий процесс:

  • Pre-commit Hooks: Используются для автоматического запуска проверок перед каждым коммитом. Это обеспечивает немедленную обратную связь разработчику и предотвращает попадание некачественного кода в систему контроля версий.

    • Почему: Экономит время, так как ошибки обнаруживаются до отправки кода на удаленный репозиторий, и поддерживает чистоту истории коммитов.

    Пример настройки .pre-commit-config.yaml:

    # .pre-commit-config.yaml
    repos:
    - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v4.4.0
      hooks:
        - id: trailing-whitespace # Удаляет пробелы в конце строк
        - id: end-of-file-fixer   # Гарантирует пустую строку в конце файла
        - id: check-yaml          # Проверяет синтаксис YAML файлов
        - id: check-json          # Проверяет синтаксис JSON файлов
    - repo: https://github.com/psf/black
      rev: 23.3.0
      hooks:
        - id: black               # Автоматическое форматирование Python кода
    - repo: https://github.com/PyCQA/flake8
      rev: 6.0.0
      hooks:
        - id: flake8              # Проверка стиля и ошибок Python кода
    - repo: https://github.com/pre-commit/mirrors-mypy
      rev: v1.2.0
      hooks:
        - id: mypy                # Статическая проверка типов
  • CI/CD Конвейеры (GitHub Actions, GitLab CI, Jenkins и т.д.): Интеграция этих проверок в CI/CD конвейер является последним рубежом обороны. Код не может быть объединен в основную ветку, пока не пройдет все автоматические проверки.

    • Почему: Гарантирует, что вся кодовая база соответствует установленным стандартам качества, предотвращает регрессии и обеспечивает стабильность проекта на протяжении всего жизненного цикла разработки.

Ответ 18+ 🔞

Слушай, а ведь эта вся автоматизация проверки кода — это просто пиздец какой-то спасательный круг, а не процесс! Раньше же было: написал код, он вроде работает, и хуй с ним, что там отступы кривые, а переменные a, b и c. Потом через полгода открываешь этот файл — и волосы дыбом, блядь. Ты сам не понимаешь, что нагородил, а другой разработчик смотрит на это и тихо матерится, представляя твою родословную в виде ёлки.

Так вот, чтобы не было вот этого вот пиздеца, умные люди придумали целый арсенал. Это как набор хирургических инструментов, только для твоего говнокода.

Инструменты, которые тебя спасут (или выебут мозг):

  1. Линтеры — они же дотошные зануды:

    • Flake8: Это как строгий, но справедливый дед. Он тебе тычет палкой: «Сынок, тут у тебя пробел лишний, а здесь по PEP8 надо два отступа, а эта функция такая запутанная, что я, блядь, аж всплакнул». Зачем? Чтобы код выглядел не как помойка, а чтобы его можно было читать без желания выколоть себе глаза.
    • Pylint: А это уже не дед, а майор КГБ в отставке. Он не просто на пробелы смотрит. Он проникнет в самую суть, найдет твои потаённые костыли, глобальные переменные, где их не ждали, и крикнет: «А ну-ка, дружок, что это у тебя здесь за архитектурный пиздец? Переделывай!». Зачем? Чтобы выявить дерьмо, которое ещё не протухло, но уже смердит.
  2. Форматтеры — они же диктаторы:

    • Black: Его философия проста: «Я — Black. Я всё отформатирую. Спорить бесполезно». Ты можешь хоть танцевать с бубном вокруг кода, но после Black он будет выглядеть так, как решит Black. И знаешь что? Это охуенно. Зачем? Чтобы не тратить 15 минут каждого код-ревью на споры, ставить пробел до или после скобки. Всем похуй. Black всё решил.
  3. Проверяльщики типов — они же параноики:

    • Mypy: Ты написал, что функция принимает int, а потом суёшь в неё строку? Mypy тебя нахуй пошлёт ещё до того, как ты запустишь код и получишь TypeError прямо в лоб. Зачем? Чтобы поймать ошибки, когда они ещё даже не думали возникать. Это как предсказание ебли в жопу.

Куда это всё впихнуть, чтобы жизнь мёдом не казалась?

  • Pre-commit хуки: Это гениальная, блядь, штука. Настраиваешь один раз, и теперь перед каждым коммитом у тебя в терминале начинается цирк. Ты такой: git commit -m "Пофиксил баг", а тебе в ответ: «Стой, мудак! У тебя тут запятая лишняя, тут Black переформатировал три файла, а mypy нашёл, что ты врёшь про тип возвращаемого значения! Фиксить, пока не отпущу!». И это правильно. Потому что лучше получить пизды сразу, на своей машине, чем потом, когда твой кривой коммит уже всем сломал сборку.

    Вот как выглядит этот магический файлик .pre-commit-config.yaml:

    # .pre-commit-config.yaml
    repos:
    - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v4.4.0
      hooks:
        - id: trailing-whitespace # Выкусит все хвостовые пробелы, будто их и не было
        - id: end-of-file-fixer   # Жёстко требует пустую строку в конце. Без обсуждений.
        - id: check-yaml          # Проверит YAML, а то опять где-то табуляцию вставишь
        - id: check-json          # И JSON тоже, мало ли
    - repo: https://github.com/psf/black
      rev: 23.3.0
      hooks:
        - id: black               # Главный парикмахер твоего кода. Стрижёт под одну гребёнку.
    - repo: https://github.com/PyCQA/flake8
      rev: 6.0.0
      hooks:
        - id: flake8              # Тот самый дед с палкой. Будет ворчать на каждую мелочь.
    - repo: https://github.com/pre-commit/mirrors-mypy
      rev: v1.2.0
      hooks:
        - id: mypy                # Параноик-теоретик. Уверен, что ты везде хочешь его обмануть.
  • CI/CD (GitHub Actions, GitLab CI и прочая нечисть): А это уже последний рубеж обороны, бронедверь. Даже если ты как-то проскочил со своим кривым коммитом мимо pre-commit, то здесь тебя ждёт холодная механическая месть. Сервер посмотрит на твой пул-реквест и скажет: «Не, брателло, я это в основную ветку не пущу. У тебя проверки не прошли. Иди, почини свой сарай». Зачем? Чтобы в проекте была хоть какая-то стабильность, а не дикий запад, где каждый коммит — это лотерея: «запустится или ебанёт?». Это гарантия того, что вся кодовая база, хоть и может быть ебейшей по сложности, но хотя бы не кривая и не слепая.

Короче, не бойся этого. Сначала будет бесить, что тебе не дают просто написать код. А потом ты поймёшь, что эти ребята — твои лучшие друзья, которые не дают тебе насажать в свой же собственный суп.