Какие Quality Gates (контрольные точки качества) вы используете в Node.js-проектах?

Ответ

В CI/CD пайплайне Node.js-проектов я настраиваю следующие обязательные Quality Gates:

  1. Статический анализ кода:

    • ESLint с конфигурацией eslint-config-airbnb-base или standard. Критически важные правила: complexity (максимальная цикломатическая сложность 10-15) и max-lines-per-function.
    • TypeScript (если используется) с strict-режимом.
    • SonarQube/SonarCloud для метрик: поддержания долга, дублирования кода (>3% — fail), надежности и безопасности.
  2. Тестирование:

    • Покрытие кода (Code Coverage): Минимум 80% для unit-тестов (Jest). Бранчи (branches) — самый важный критерий.
      // package.json
      "scripts": {
      "test:coverage": "jest --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80,"statements":80}}'"
      }
    • Обязательный прогон unit, интеграционных (с тестовой БД) и API-тестов (с использованием Supertest).
  3. Анализ зависимостей:

    • npm audit / yarn audit — блокировка пайплайна при обнаружении критических уязвимостей (CVSS >= 9).
    • Renovate или Dependabot для автоматического обновления зависимостей с созданием MR.
  4. Code Review: Обязательный процесс Pull Request с 2 апрувами, проверкой на соответствие принципам SOLID/DRY и читаемости кода.

  5. Безопасность:

    • Сканирование секретов в коде (например, с помощью truffleHog или GitGuardian).
    • Проверка Docker-образов на уязвимости (Trivy, Grype).
  6. Производительность и размер (для приложений):

    • Для сервисов — проверка на утечки памяти с помощью нагрузочного тестирования (Artillery, k6).
    • Для пакетов (npm-библиотек) — лимит на размер бандла (например, с помощью size-limit).

Эти гейты интегрируются в пайплайн GitHub Actions/GitLab CI и должны пройти успешно, чтобы код попал в стадию сборки или деплоя.

Ответ 18+ 🔞

А, ну это же классика! Сидишь такой, настраиваешь очередной пайплайн, а в голове одна мысль: "Чтоб ничего не проскочило, а то потом овердохуища проблем будет". Давай по пунктам, как я это обычно делаю, чтобы потом не охуеть от последствий.

Первое дело — статический анализ. Это как зубной врач для кода: неприятно, но необходимо. Ставлю ESLint с airbnb-base, чтобы код не выглядел, как будто его пьяный мартышлюшка набирал. Особенно гоняю по двум правилам: сложность функций (complexity) и количество строк в них. Если функция на три экрана — это уже не функция, а манда с ушами, её надо резать. Плюс TypeScript в строгом режиме — без него чувствуешь себя голым, доверия к коду — ноль ебать. И конечно, SonarQube сверху, чтобы следить за долгом и дублями. Если дублирования больше 3% — это уже не код, а копипаста какая-то, сразу фейл.

Дальше — тестирование. Тут без компромиссов. Покрытие — минимум 80%, и особенно смотрю на покрытие веток (branches). Если if или switch не покрыты — это как ходить по охуенно тонкому льду, рано или поздно провалишься. В package.json прописываю пороги жёстко, чтобы jest сразу ругался.

"scripts": {
  "test:coverage": "jest --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80,"statements":80}}'"
}

И гоняю всё: unit-тесты, интеграционные (с отдельной тестовой базой, чтобы не засирать прод), и API-тесты через Supertest. Если что-то падает — всё, приехали, дальше не пускаю.

Третий пункт — зависимости. npm audit — наш страж. Находит какую-нибудь уязвимость с CVSS 9.5, и я такой: "Ни хуя себе, мы же с этой либой в проде живём!". Критические уязвимости — стоп-кран для пайплайна. А чтобы не отставать, ставлю Renovate или Dependabot. Пусть сами обновления присылают, только мерж-реквесты апрувь.

Ревью кода — это святое. Два апрува минимум. И смотрю не только "работает/не работает", а чтобы код был читаемый, без нарушений SOLID и DRY. Если вижу функцию на 200 строк, которая делает всё — от запроса в базу до отправки письма, — это пизда рулю. Отправляю на переделку. Распиздяйство не прокатит.

Безопасность. Тут вообще расслабляться нельзя. Обязательно сканирую репу на предмет случайно закоммиченных секретов (типа паролей или API-ключей). Один раз чувак токен от AWS в конфиг засунул и залил — ебать колотить, хорошо, что сканер отловил. И все Docker-образы прогоняю через Trivy — искать дыры.

Ну и напоследок, производительность. Для веб-сервисов — нагрузочное тестирование, чтобы проверить, не начнёт ли он память жрать как не в себя под нагрузкой. А если это npm-библиотека — лимит на размер бандла. Чтобы пользователь не качал ради одной функции библиотеку на 50 мегабайт, это же пидарас шерстяной.

Всё это дело встраиваю в GitHub Actions или GitLab CI. И пока все эти гейты не станут зелёными — ни о какой сборке или, тем более, деплое речи быть не может. Сурово, зато потом спать спокойно можно.