Выкладка сайта российского интернет-магазина товаров для кемпинга и походов раньше шла по FTP на боевой сервер, а теперь идёт автоматически: Евгений Росляков настроил автодеплой, где код проверяется сам и уходит в продакшен по кнопке. Сайты и серверы он делает с 2016 года. Самозанятый, работает по договору, организациям выдаёт закрывающие документы. Сам он в Москве, с клиентами из других городов работает удалённо.
В магазине два разработчика на аутсорсе и маркетолог. Правки разработчики заливали по FTP прямо на боевой сервер. После релизов то и дело ломалась корзина, заказы терялись, пока кто-нибудь не замечал. Откатить было нечем: предыдущую версию нигде не хранили. Тестовая копия давно отличалась от боевой, и что работало на ней, на боевом вело себя иначе.
Больше всех страдал маркетолог. Перед акциями он не знал, можно ли просить разработчиков о правках, ведь каждая заливка была риском.
Разработчики сидят в разных городах и не всегда пересекаются по времени. Кто что залил и в каком виде сейчас боевой код, выясняли перепиской. Один раз правки двух человек перезаписали друг друга, и пропал целый блок сайта.
Задача: сделать выкладку скучной. Разработчик отправляет изменение, коллега смотрит, автоматика проверяет, версия уезжает на сервер. Если что-то пошло не так, прежнюю возвращают за минуты.
Начал с Git. Завёл репозиторий и договорился о ветках: основная для боевого кода, рабочая для разработки, на каждую задачу своя. В основную изменения попадают только через merge request, и его всегда смотрит коллега.
Систему выбрал GitLab и поставил её на сервер клиента. Это открытая редакция GitLab CE, платная лицензия не нужна, а код магазина остаётся у владельца. Для российской компании это спокойнее, чем держать репозиторий в стороннем сервисе.
Потом собрал CI/CD. На каждый merge request запускаются проверка кода и автотесты. После слияния сборка делает образ Docker и кладёт его в реестр GitLab. На тестовый сервер образ уходит сам, на боевой — кнопкой, когда на тестовом всё посмотрели.
Окружения описал в Docker Compose: сайт, база, кеш и очередь заданий. Основной файл общий, различаются только переменные. Поэтому разработка, тест и боевой сервер собираются одинаково, и фраза «у меня работало» потеряла смысл.
Миграции базы выполняются в пайплайне перед запуском новой версии. Откат — запуск предыдущего образа, это минуты. Пароли и ключи лежат в защищённых переменных GitLab, не в коде и не в почте разработчиков. Выкладку на боевой сервер разрешил только в рабочее время, чтобы вечером никто не чинил корзину в одиночку.
Для разработчиков написал инструкцию на одну страницу: как создать ветку, открыть merge request и откатить релиз.
Релиз стал короткой процедурой. Разработчик открывает merge request, коллега смотрит, проверки идут сами, а на боевой сервер версию отправляет кнопка. Доступ по FTP закрыт совсем.
Тестовая копия теперь повторяет боевой сайт, поэтому ошибки в корзине ловятся до покупателей. Если что-то проскочило, прежний образ возвращают быстро, и заказы не лежат часами. Двое разработчиков больше не перезаписывают друг друга, потому что каждый работает в своей ветке. Маркетолог планирует акции спокойнее: просьба о правке перестала быть риском.
Честное ограничение: автотесты ловят только то, что в них описано. Корзину и оформление заказа я покрыл, остальные части сайта защитятся по мере того, как разработчики добавляют тесты. Это работа на несколько месяцев, в инструкции я записал, с каких мест начинать. Откат образа не отменяет изменений в базе, поэтому миграции нужно писать аккуратно, чтобы их можно было пережить без возврата.
Следующим шагом клиент хочет добавить автоматическую проверку скорости страниц и отдельное окружение под каждую крупную задачу.
Если ваш сайт до сих пор обновляется заливкой файлов и каждый релиз похож на лотерею, пишите на freelance.ru. Расскажите, на чём он сделан и сколько людей его правит, а я предложу схему выкладки под вашу работу.