Обновление превращается в проект
Пропущено пять мажорных версий фреймворка: теперь нельзя поднять одну библиотеку, не переписав половину интеграций. Работа растягивается на месяцы.
Выберите тему — соберём контекст
Ведём учёт зависимостей, отслеживаем уязвимости и обновляем продукт небольшими шагами. Каждое обновление проходит проверку на стенде, а неудачная выкатка откатывается к предыдущей версии за минуты.
Или сразу: +7 (962) 368-39-51 Telegram
Пока обновления делаются регулярно, это рутина на пару часов. Когда их откладывают год, это уже отдельный проект с непредсказуемым результатом.
Пропущено пять мажорных версий фреймворка: теперь нельзя поднять одну библиотеку, не переписав половину интеграций. Работа растягивается на месяцы.
Патч для опубликованной уязвимости вышел неделю назад, а в вашем окружении остаётся старая версия. Автоматические сканеры находят такие цели в первые дни.
После обновления библиотеки перестаёт работать выгрузка в бухгалтерию: этот сценарий проверяли руками раз в квартал и покрытия в тестах у него нет.
Старая версия PHP больше не поддерживается вендором и не получает исправлений безопасности, а нужные библиотеки требуют более новую.
Тестировать приходится сразу на продакшене, потому что тестовый контур разошёлся с боевым на год и воспроизводит другие данные и настройки.
Конфигурации правились руками на сервере, часть параметров отличается между стендом и продом, и восстановить исходное состояние уже невозможно.
Обновления мы рассматриваем как регулярную операцию с предсказуемым риском, а не как разовую кампанию.
Мы знаем полный состав зависимостей продукта — включая транзитивные, о которых обычно никто не помнит.
Обновляемся небольшими порциями: так проще найти причину, если что-то пошло не так.
Каждое обновление сначала проверяется на контуре, повторяющем боевую конфигурацию.
Обновление должно быть обратимым: если что-то ломается, мы возвращаемся к рабочей версии, а не чиним в спешке.
Логика одинакова и для одного патча, и для мажорного обновления фреймворка — меняется только масштаб.
Собираем полный список пакетов и версий, отмечаем устаревшие и содержащие известные уязвимости, оцениваем объём работы.
Обновляем на тестовом контуре, прогоняем автотесты и ручные сценарии, проверяем миграции и производительность.
Выкладываем в согласованное окно, следим за метриками и журналами, проверяем критичные сценарии и держим готовый откат.
Возвращаемся к плановым патчам раз в две недели и не даём долгу накопиться снова. Раз в квартал — сводка по составу зависимостей.
Есть несколько однозначных признаков. Первый — версия фреймворка или языка больше не поддерживается вендором и не получает исправлений безопасности. Второй — аудит зависимостей показывает пакеты с известными уязвимостями, для которых уже есть исправленные версии. Третий — новая функциональность требует библиотеки, несовместимой с текущими версиями, и разработка начинает обходить ограничения вместо решения задачи.
Отдельный сигнал — страх. Если команда боится обновлять пакеты, потому что «после прошлого раза два дня ловили ошибки», значит отсутствует не смелость, а стенд, автотесты и процедура отката. С них и нужно начинать, а не с самого обновления.
Соблазн закрыть только тот пакет, по которому пришло уведомление об уязвимости, понятен, но опасен. Пакеты связаны между собой требованиями к версиям: обновление одной библиотеки может потребовать более новую версию фреймворка, а та — новую версию языка. Попытка точечного вмешательства приводит к состоянию, когда менеджер зависимостей не может собрать рабочую комбинацию.
Правильный подход — обновлять согласованными наборами и проверять результат целиком на стенде. Так же решается и проблема транзитивных зависимостей: уязвимость может находиться не в том пакете, который вы указали напрямую, а в его внутренней зависимости.
Отсутствие покрытия — не повод откладывать обновления, но повод изменить порядок работ. Сначала мы описываем критичные сценарии в виде чек-листа: вход, оформление заказа, оплата, выгрузка документов, обмен с внешними системами. Затем эти сценарии проходятся вручную на стенде при каждом обновлении, а по мере возможности заменяются автоматическими тестами.
Параллельно мы фиксируем дефекты, найденные в ходе таких проверок, и постепенно превращаем самые дорогие сценарии в набор тестов. Через несколько циклов обновление перестаёт быть событием с ручным контролем и становится технической операцией.
Патчи безопасности и минорные версии — раз в две недели, критичные уязвимости закрываем вне очереди, в течение одного-двух рабочих дней после выхода исправления. Мажорные обновления фреймворка и версии языка планируем отдельным проектом раз в год. Такой ритм не даёт техническому долгу накопиться до состояния, когда обновление становится опасным.
Мы держим предыдущий релиз готовым к возврату, поэтому откат приложения занимает около пятнадцати минут. Если обновление затрагивало схему базы данных, план отката согласуется заранее: миграции пишутся так, чтобы новая схема была совместима с предыдущей версией кода. Каждый такой случай разбирается, и сценарий, который не был покрыт проверкой, добавляется в чек-лист.
Для регулярных обновлений — да, иначе проверка превращается в риск для боевой системы. Стенд не обязан быть копией продакшена по мощности, но должен повторять версии окружения, состав сервисов и структуру данных. Если поднять полноценный стенд невозможно, мы используем временный контур на копии базы, который создаётся на время проверки и удаляется после выкатки.
Да, сборка фронтенда — такая же часть продукта, и устаревшие библиотеки в ней дают те же проблемы: известные уязвимости, несовместимость с новыми браузерами, рост размера бандла. Мы обновляем зависимости сборки вместе с остальными, проверяя после этого критичные страницы и сценарии на реальных устройствах, поскольку именно клиентская часть чаще всего ломается незаметно для автотестов.
Смежные задачи, которые обычно решаются в одном проекте с этой.
Пришлите файл зависимостей и версию окружения — оценим объём обновления и риски, назовём сроки.
Cookie и аналитика
Мы используем необходимые cookie для работы сайта и форм. Аналитические cookie (Яндекс.Метрика, включая запись сессий) подключаем только с вашего согласия — от него можно отказаться. Подробнее: Политика использования cookie и обработка персональных данных.