Как подходить к релизам и доставке фич
Что проверяют
Понимаете ли вы, как код попадает из ветки к пользователю и как сделать релиз событием, которого никто не боится. Frontend-разработчику следом обычно задают вопросы про feature flags, откат и про то, что происходит с пользователями, у которых открыта старая версия приложения.
Как отвечать
- ветки: trunk-based с короткими ветками и частыми слияниями в
mainили GitFlow с релизными ветками. Первое удобнее для частых выкладок, второе для продуктов с версиями и долгой поддержкой; - CI на каждый PR: линтер, проверка типов (
tsc --noEmit), юнит-тесты, сборка, при возможности e2e на Playwright по ключевым сценариям. Превью-окружение на каждый PR (Vercel, Netlify или своё) даёт дизайнеру и тестировщику посмотреть фичу до слияния; - feature flags: код незаконченной фичи уезжает в прод выключенным, включается для сотрудников, потом для процента пользователей. Инструменты: Unleash, GrowthBook, LaunchDarkly или свой конфиг. Выкладка кода и запуск фичи становятся разными событиями;
- постепенная раскатка: canary или процентный rollout, наблюдение за ошибками в Sentry и за Web Vitals, затем раскатка на всех;
- откат: статика с хэшами в именах файлов позволяет вернуть предыдущую сборку за минуты, флаг выключается ещё быстрее;
- версионирование: для библиотек и дизайн-системы semver и changelog, например через Changesets. Для приложения обычно достаточно версии или хэша коммита в сборке, чтобы связать ошибку с релизом.
Дальше привяжите всё к своему опыту: как часто выкатывали, кто нажимал кнопку, был ли откат и что после него изменили.
Где спотыкаются
Забывают про пользователей со старой вкладкой. После деплоя их бандл запрашивает чанк, которого на сервере уже нет, и приложение падает на ошибке загрузки (ChunkLoadError в webpack, событие vite:preloadError в Vite). Нужно какое-то время держать старые ассеты или ловить эту ошибку и перезагружать страницу.
Выкатывают фронт и бэк одновременно, рассчитывая на синхронность. Фронтенд должен переживать и старую, и новую версию API хотя бы на время раскатки.
Не убирают флаги после запуска. Через год в коде десятки веток if, и никто не помнит, какие из них ещё живы.