Сервис Моей Мечты
Требования разделены по необходимости и этапам SDLC DevOps.
Минимальные Требования
План
- Есть человек, ответственный за разработку, техническое развитие и работоспособность сервиса
- Сервис использует технологический стек, поддерживаемый компанией
- У сервиса есть техническая документация в README.md, как минимум несколько страниц, описывающих ключевые моменты
- Документация сервиса актуальна или есть задача по ее обновлению
- Если у сервиса есть API, есть сохраненная спецификация в формате OpenAPI
- Сервис использует одно из решений, принятых компанией для хранения данных
Код
- Управление зависимостями осуществляется с помощью менеджеров, принятых для языка: composer, go module, yarn, npm и другие
Сборка
- Артефакт сборки представляет собой автономный docker-образ
- Сервис собирается автоматически, в рамках общего процесса CI/CD
- CI/CD выполняется в системе, принятой компанией (GitHub, GitLab, Jenkins, Bitbucket Pipeline и т.д.)
- Dockerfile и CI/CD создаются и поддерживаются командой сервиса
Тестирование
- Все тесты и проверки выполняются в рамках CI/CD. Если тесты не проходят, сборка не считается успешной и не может быть развернута в любой среде
Развертывание
- У сервиса есть несколько сред, в зависимости от того, что принято в компании
- Сервис управляется оркестратором (nomad, kubernetes). Исключения для сервисов с высокой нагрузкой на CPU, память и I/O.
- Сервис использует terraform для описания своей инфраструктуры, helm для описания ресурсов kubernetes, nomad job в terraform для описания ресурсов nomad
- Сервис использует DBaaS, если это не чрезмерно дорого
- Вспомогательные приложения устанавливаются в k8s с использованием зависимостей helm chart
- Сервис работает как минимум в 2 экземплярах на стадии и 3 в продакшене
Эксплуатация
- Сервис пишет логи в stdout
- При запуске пишет свою конфигурацию (маскируя или скрывая конфиденциальные данные)
- В режиме отладки логирует все сырые (до обработки для входящих и после обработки для исходящих) входящие и исходящие запросы и ответы
- Сервис логирует сырые данные для всех исходящих запросов, завершившихся ошибкой или недействительным ответом
- Сервис настраивается с помощью переменных окружения или файлов во время выполнения (не во время сборки)
- Сервис отвечает 200 на /liveness, если не требует перезапуска
- Сервис отвечает 200 на /readiness, если может принимать трафик
- Сервис не падает, если базы данных или другие сервисы, от которых он зависит, недоступны
- Все HTTP-запросы к другим сервисам и базам данных имеют таймауты. И сумма всех таймаутов меньше общего таймаута всего сервиса
Мониторинг
- Сервис предоставляет метрики prometheus Golden Signals с /metrics или
- Команда сервиса отвечает за поддержание CI/CD, правил оповещений и дашбордов в grafana
Дополнительные Требования
План
- В компании есть несколько человек, способных поддерживать сервис
Код
- Сложные и наиболее важные части бизнес-логики покрыты модульными тестами для ускорения разработки
- Сообщения коммитов соответствуют https://www.conventionalcommits.org/en/v1.0.0/
- Идентификаторы версий релизов сервиса соответствуют https://semver.org/
- Используется vendoring (хранение зависимостей в репозитории) для тех сред выполнения, где это возможно
Тестирование
- В CI/CD настроены обязательные автоматические проверки стиля кода. Примеры утилит: Golang - golangci, PHP - PHP_CodeSniffer, TypeScript/JavaScript - ESLint.
- В CI/CD настроены обязательные статические проверки кода. Примеры утилит: PHP - Psalm/Phan, Golang - golangci, TypeScript/JavaScript - ESLint.
- В CI/CD настроены обязательные автоматические проверки уязвимостей зависимостей. Примеры утилит: Golang - govulncheck, PHP - composer audit, TypeScript/JavaScript - npm audit, yarn audit, general - trivy, OWASP dep-check, Snyk.
- В CI/CD настроены обязательные автоматические проверки исходного кода на наличие сохраненных учетных данных (сканер учетных данных).
- Если приложение имеет API, оно покрыто дымовыми тестами, которые запускаются автоматически в CI/CD.
- Бонусное задание: если приложение имеет API, оно покрыто регрессионными тестами, которые запускаются автоматически в CI/CD.
Развертывание
- Релизы сервиса происходят не реже одного раза в 2 недели
- Бонусное задание: среды создаются динамически по веткам
- Бонусное задание: у сервиса есть канареечная среда с реальным трафиком или его копией
Эксплуатация
- Сервис пишет логи в stdout в формате: <время (в формате ISO8601 в UTC, с микросекундами)> <уровень> <сообщение>. Например: 2022-10-25T10:44:15.123456Z INFO Некоторая информация
- Сервис корректно завершает работу по сигналу SIGTERM
- Сервис осмысленно использует повторные запросы (с экспоненциально увеличивающейся паузой между запросами: 1 секунда, 2, 4, …), circuit breaker, backpressure при работе с другими сервисами и базами данных
- Сервис готов к изменению IP-адреса используемого сервиса и следует TTL в DNS-записях
- /liveness, /readiness и /metrics обслуживаются на отдельном порту
- Сервис предоставляет бизнес-метрики в формате prometheus по запросу на /metrics
- Бонусное задание: сервис полностью совместим с OpenTelemetry