Компания Wolfe с конца 1990-ых годов развивает несколько онлайн-проектов в сфере e-commerce. Большая часть из них связаны с продажей подарочных сертификатов и предоплаченных банковских карт. Gift Card Granny — один из проектов Wolfe, интернет-магазин, в котором пользователи могут искать, сравнивать, покупать и продавать подарочные и скидочные карты сотен различных брендов. Ежегодно его посещают больше 7,9 миллиона человек.
Gift Card Granny работает с 2009 года. Последнее крупное обновление фреймворка и кодовой базы было в 2014 году: команда клиента перенесла проект на фреймворк Symfony версии 2.0. В 2015 году был еще один апгрейд до версии 2.8.
Разработчики фреймворка Symfony перестали выпускать исправления багов и обновления безопасности для этой версии фреймворка в 2019, то есть она существенно устарела. Это привело к появлению двух проблем, которые не давали клиенту развивать Gift Card Granny:
Устаревший фреймворк не гарантирует безопасность: если злоумышленники найдут способ взломать старую версию Symfony, разработчики фреймворка не будут это исправлять. То есть, в Gift Card Granny появляются потенциальные дыры для мошенников. Проект связан с финансами, поэтому для клиента очень важно обеспечить пользователям надежную защиту их личных и банковских данных.
Компании сложно найти опытных сотрудников в команду, потому что квалифицированные разработчики не хотят разбираться с устаревшим фреймворком без современных возможностей и инструментов. Из-за недостатка разработчиков с нужным опытом внедрять новую функциональность становилось сложнее и дольше.
В 2022 году компания Wolfe обратилась к Resolventa за помощью в обновлении фреймворка.
Resolventa усилила внутреннюю команду клиента одним ведущим PHP-разработчиком. Квалифицированный специалист с сертификатом по работе с Symfony и опытом масштабного апгрейда фреймворка должен был:
Resolventa составила план обновления и взяла на себя большую часть технических работ по апгрейду фреймворка.
Настройка среды разработки. В первую очередь, команде клиента не хватало локальной среды разработки. Программисты работали с файлами проекта на своих компьютерах в IDE, а затем синхронизировали их с тестовым сервером с помощью rsync, а после тестирования — с продакшен-сервером. Современной инфраструктуры для разработки и доставки кода не было.
Такой способ работы подходил для небольших обновлений, однако при апгрейде фреймворка нужно одномоментно синхронизировать огромное число файлов. Более того, выполнять синхронизацию приходится многократно, потому что при обновлении часто возникают конфликты и ошибки в коде проекта. В подобной ситуации rsync становится слишком медленным и неудобным инструментом. Апгрейд по такой технологии шел бы очень долго и с большими трудозатратами.
Чтобы сделать обновление более удобным и современным, команда Resolventa внедрила Docker-контейнеры для локальной разработки. Внутри контейнера программисты использовали одинаковую, уже настроенную инфраструктуру разработки: PHP, mySQL, Nginx, очереди сообщений. Там же подключались mock — специальные заглушки, которые заменяют сервисы и внешние интеграции на время разработки и тестирования.
Изучение инфраструктуры проекта, составление конфигурации контейнеров, создание mock и настройка локальной среды разработки заняла около двух недель. Такой долгий срок был связан с большим объемом кодовой базы, сложностью инфраструктуры, а больше всего времени потребовала разработка mock-заглушек. Когда подготовительный этап завершился, Resolventa приступила к обновлению фреймворка.
Апгрейд Symfony. Работа по обновлению шла в несколько итераций, потому что огромный проект нельзя перенести сразу с версии 2.8 на актуальную в 2022 году 5.4. Разрыв между версиями очень большой, поэтому при обновлении одним скачком возникло бы огромное количество конфликтов и несовместимостей. Отследить и исправить их было бы очень сложно даже опытным специалистам.
Обновление разбили на шаги: поэтапно переносили проект на все ключевые версии фреймворка начиная с 2.8. На момент публикации кейса проект готовится к обновлению до версии 5.0.
На каждом шаге разработчики повторяли одну и ту же процедуру: проверяли проект с помощью специальных инструментов, обновляли или заменяли конфликтующие и устаревшие пакеты, по необходимости исправляли код.
Для проверки разработчики использовали два ключевых инструмента: Composer и Symfony Profiler.
Composer — пакетный менеджер PHP, он сообщает, что конкретный пакет несовместим с текущей версией фреймворка.
Symfony Profiler — встроенный дебаг-инструмент Symfony, он показывает все устаревшие функции, которые перестанут работать при обновлении фреймворка.
Также у Symfony есть подробная документация, в которой прописаны инструкции по обновлению и changelog — список различий и несовместимостей между версиями. Эти материалы также активно использовались при работе команды.
Переходы между версиями потребовали разного вложения времени и труда. Например, при обновлении на версию 3.0 практически не возникло конфликтов внешних зависимостей. А вот переход на версию 4.0 был относительно сложным и долгим: пришлось заменить большое число пакетов.
Обновление внешних зависимостей. Апгрейд настолько масштабного и сильно устаревшего проекта сложный процесс, потому что в коде используется около 60 внешних зависимостей. На каждом шаге нужно было контролировать, что все пакеты совместимы с новой версией фреймворка.
Так как последний апгрейд фреймворка в проекте произошел в 2014 году, то и большинство зависимостей сохранились с того же времени. При их обновлении возникали две ситуации:
У пакета есть версия, которая работает с новой Symfony. Тогда его можно просто обновить до актуального состояния.
Пакет устарел и не поддерживается. Тогда его следует заменить современным аналогом. Новый пакет нужно интегрировать с проектом: переписать все функции, которые использовали старый пакет.
Работа над бизнес-задачами клиента. Обновление Symfony до самой актуальной версии — важная, но не единственная задача Resolventa. Много внимания потребовали также различные бизнес-задачи и помощь в развитии проекта. Например, Resolventa внедрила новые функциональные возможности для покупателей подарочных карт в предпраздничный период, когда клиент готовился к большому наплыву пользователей.
Также команда занималась интеграцией системы IDology для качественной идентификации пользователей. Она повышает безопасность проекта и помогает избежать мошенничества, например, с использованием краденых кредитных карт.
Проект клиента прошел через сложное обновление: кодовую базу перенесли на значительно более современный фреймворк Symfony 4.4. Кроме того, команда начала использовать актуальные инструменты разработки: Docker-контейнеры, автотесты, миграции баз данных. Программисты получили современную инфраструктуру, в которой удобно работать и обновлять проект. Благодаря этому проект стал более безопасным, он работает стабильнее и его проще развивать.
Resolventa продолжает совместную работу с внутренней командой клиента, усиливает и направляет ее. Дальнейшее обновление уже в стадии подготовки и стартует, когда это будет необходимо.
PHP, Symfony, MySQL, Docker, React, Bitbucket Pipelines, AWS
Stripe, PayPal, Facebook Business, Google, Twilio, Cloudinary, Mandril, Mailchimp, Algolia, Zendesk, IDology