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

«Какие Quality Gates (контрольные точки качества) вы используете в Node.js-проектах?» — вопрос из категории DevOps, который задают на 26% собеседований 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 и должны пройти успешно, чтобы код попал в стадию сборки или деплоя.