Какие нефункциональные проверки можно интегрировать в CI/CD пайплайн?

Ответ

Интеграция нефункциональных проверок в CI/CD позволяет выявлять проблемы с качеством на ранних этапах. Ключевые проверки:

  • Производительность:
    • Нагрузочное тестирование (с помощью JMeter, k6, Gatling) для проверки времени отклика и стабильности под нагрузкой.
    • Профилирование и бенчмарки для выявления регрессий производительности в критических участках кода.
  • Безопасность:
    • Статический анализ кода (SAST) – поиск уязвимостей в исходном коде (SonarQube, Checkmarx).
    • Анализ зависимостей (SCA) – сканирование библиотек на известные уязвимости (OWASP Dependency-Check, Snyk).
    • Динамический анализ (DAST) – тестирование работающего приложения (ZAP, Burp Suite).
  • Надежность:
    • Тесты на отказоустойчивость (Chaos Engineering) – проверка реакции системы на сбои сетей, дисков, сервисов.
    • Мониторинг и алертинг – интеграция с системами мониторинга (Prometheus, Grafana) для отслеживания метрик после деплоя.
  • Совместимость: Кросс-браузерное и кроссплатформенное тестирование (например, с использованием Selenium Grid или облачных сервисов).
  • Качество кода: Проверка стиля кодирования, сложности кода, покрытия тестами и наличия технического долга.

Пример шага проверки безопасности в GitHub Actions:

- name: Scan for vulnerable dependencies
  uses: dependency-check/Dependency-Check-Action@main
  with:
    project: 'my-application'
    path: '**/*.jar' # Сканируем Java-архивы
    format: 'HTML'   # Формат отчета
    args: >
      --failOnCVSS 7 # Падаем, если найдена уязвимость с критичностью >= 7.0

Почему это важно: Автоматизация NFR-проверок в CI/CD снижает риски выпуска в продакшен медленного, уязвимого или нестабильного ПО.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня про «нефункциональные требования» — это ж не просто так, чтобы тимлид мог умный вид сделать. Это, блядь, чтоб в пятницу вечером, когда уже все наливаешь, не прилетело: «ой, а у нас на 10 пользователях всё легло, пиздец». Так что давай по-простому, без этих ваших «NFR».

Вот смотри, ты пишешь код, он вроде работает. Но это нихуя не значит, что его можно в прод. Надо проверить, не развалится ли он, как карточный домик, если на него посмотреть криво. Вот для этого и встраиваем проверки прямо в конвейер, чтобы на каждом углу система сама материлась на твой кривой код.

Производительность, ёпта! Твой сервис должен не просто «работать», а работать так, чтобы пользователь не успел кофе налить, пока страница грузится.

  • Нагрузка: Кидаем на него виртуальных юзеров, как тараканов. JMeter, k6, Gatling — неважно чем, главное, чтобы под сотней-другой запросов в секунду он не начал отвечать через 30 секунд словом «пошёл нахуй». Надо замерять время отклика и смотреть, не ползёт ли оно в ад при увеличении нагрузки.
  • Профилирование: А тут уже точечно, как хирург. Где память жрёт? Где процессор уходит в 100%? Пишем бенчмарки на самые важные куски кода (например, на этот твой «гениальный» алгоритм поиска) и следим, чтобы с каждым коммитом они не начинали тормозить в два раза сильнее.

Безопасность, мать её! Это не про «ой, у нас же маленький стартап, кому мы сдались». Это про то, что одна уязвимая либа или кривой SQL-запрос — и тебя уже на форумах обсуждают, как лоха, которого взломали через форму обратной связи.

  • SAST (Статика): Пропускаем весь код через сонар или что-то подобное. Пусть ищет, где ты забыл экранировать входные данные или пароль в конфиг в открытом виде засунул.
  • SCA (Зависимости): Это вообще must have, блядь. Ты используешь 500 библиотек, и в одной из них три года назад нашли дыру, которую уже все давно пофиксили, а ты тащишь себе старую версию. Запускаем OWASP Dependency-Check или Snyk — пусть сканирует pom.xml, package.json и прочее говно, и орёт, если нашёл известную уязвимость.
  • DAST (Динамика): Запускаем приложение и тыкаем в него палкой, как в спящего медведя. ZAP или Burp Suite автоматически попробуют сделать SQL-инъекцию, XSS и прочие весёлые вещи. Если приложение отреагирует — значит, ты долбоёб и надо фиксить.

Надёжность, ёбана! А что будет, если отвалится база? Или сеть между микросервисами? Или диск? Система должна не просто упасть с ошибкой «ошибочка вышла», а как-то пережить это.

  • Chaos Engineering: Это когда мы нарочно, в контролируемой среде, начинаем всё ломать. Убиваем поды, роутим трафик в никуда, симулируем лаги в сети. Смотрим, как система держится. Если всё падает — значит, архитектура говно и нужно добавлять ретраи, циркуит-брейкеры и прочую резильентную хуйню.
  • Мониторинг: После каждого деплоя надо не просто «ура, запустилось», а смотреть на графики. Память не утекает? Количество ошибок 5xx не подскочило? CPU не орёт? Интегрируемся с Prometheus и Grafana, чтобы сразу видеть, не накосячили ли мы.

А ещё есть...

  • Совместимость: Твой фронтенд может в Хроме выглядеть огонь, а в Сафари — как пизда. Надо автоматически гонять тесты в разных браузерах и на разных разрешениях.
  • Качество кода: Ну это само собой. Чтоб не было говнокода, который потом только переписывать. Проверяем стиль, сложность, покрытие тестами (хотя последнее — спорная тема, но пусть будет).

Вот, смотри, как это в деле выглядит, например, для безопасности в GitHub Actions:

- name: Scan for vulnerable dependencies
  uses: dependency-check/Dependency-Check-Action@main
  with:
    project: 'my-application'
    path: '**/*.jar' # Чешем все jar-ники, вдруг там говно завалялось
    format: 'HTML'   # Чтоб потом красивый отчёт посмотреть
    args: >
      --failOnCVSS 7 # И чтобы пайплайн ВАЛИЛСЯ нахуй, если найдена дыра с критичностью 7 и выше. Жёстко, но справедливо.

Итог, блядь: Если этого всего не делать, то ты каждый релиз играешь в русскую рулетку. Автоматизируешь эти проверки в CI/CD — и спишь спокойнее. Потому что система сама найдёт твой косяк и не даст ему уйти в прод, пока ты не пофиксишь. А это, поверь, в тысячу раз дешевле, чем тушить пожар на боевом сервере в три ночи.