12 лет в IT, последние 10 лет занимаюсь развитием digital продакшена для ecom.
Пишу в tg | Сетка | Tenchat | vc | habr.

История систем релизов: от FTP и SVN до CI/CD, GitOps и Progressive Delivery

Одна большая боль нашего милого IT-рынка — релизы. Выкатываем новые фичи, а где-то в другом месте что-то отваливается.

Сегодня я не буду обсуждать мониторинг, тестирование или организацию процессов. Хочу сделать исторический экскурс — как за последние двадцать лет менялись системы релизов, и почему каждая новая итерация рождалась из боли.

1990-е – начало 2000-х. FTP и SSH

На заре всё было просто: есть сервер, есть доступ по FTP или SSH, и есть код, который надо «просто закинуть». Мы так делали. И вы так делали. Ошибки? Они уже на продакшене.

Откатиться можно было только через бэкап (и то, если вчера кто-то вспомнил его сделать). Иногда бэкап был месячной давности, и откат означал потерю данных и криков в чате от бухгалтерии.

Особенности времени: никаких веток кода, никаких тестовых окружений, всё «боевое». Код в проде менялся в реальном времени, и правка одной строки в файле могла как починить баг, так и положить весь проект.

2000-е. CVS, SVN и «релизы по кнопке»

Когда команды подросли, стало понятно: хаос с FTP убивает проект. Пришли системы контроля версий. Сначала CVS, потом Subversion (SVN).

Это позволило хотя бы видеть, кто и что менял. Появились staging-серверы, где можно было протестировать сборку перед выкладкой. Но процесс оставался ручным: разработчик собирал билд на своей машине, проверял его, а затем «по кнопке» или скриптом отправлял на прод.

Проблемы? Конфликты кода при слиянии веток, разъехавшиеся окружения «у меня работает — на сервере нет» и ночные выкладки с кофе и пиццей.

2005–2010. Git и первые шаги CI/CD

Git родился в 2005 году, но в массовое использование в компаниях пришёл только к началу 2010-х, когда GitHub и GitLab сделали его доступным. Вместе с ним пришла мода на CI/CD — автоматическую сборку и деплой после коммита.

Казалось, это должно было убить все баги: разработчик пушит код, CI собирает, тесты прогоняются, и всё летит на сервер. Проблема в том, что тесты писали не всегда, а иногда тесты сами были кривыми. И да — баги по-прежнему попадали на прод. Но скорость выкладок выросла в разы, а человеческий фактор в сборке — снизился.

2010-е. Blue-green deployment

Следующая ступень — сине-зелёные деплои. Суть: есть два окружения. Одно — активное, второе — резервное. Новая версия заливается в резервное, проверяется, и при готовности трафик переключается туда. Если что-то пошло не так — можно быстро вернуться назад.

Плюсы: минимальные простои, безопасный откат. Минусы: нужна двойная инфраструктура, а значит, удвоенные расходы. Для стартапа — дорого, для крупной компании — must have.

Середина 2010-х. Канареечные релизы и feature flags

Канареечный релиз — когда новая фича выкатывается сначала на 1–5% пользователей. Если всё ок — увеличиваем процент, пока не получат все. Если нет — тихо откатываем, и никто, кроме «канареек», не заметил.

Вместе с этим в моду вошли feature flags — фичи выкатываются заранее, но выключены конфигом до нужного момента. Это позволяло тестировать код в продакшене без полного релиза и быстро включать/выключать функционал.

Сейчас. Progressive delivery, GitOps и «релизы без страха»

Сегодняшний стек релизных практик выглядит как конструктор: каждая команда собирает свой набор подходов под конкретный продукт, бюджет и скорость обновлений.

Progressive delivery — логичное развитие канарейки. Здесь идея в том, что релиз — это не момент, а процесс. Выкатываем обновление сначала на минимальную аудиторию, мониторим метрики (ошибки, время отклика, конверсии), и только после зелёных сигналов расширяем охват. Иногда это делается волнами: сначала внутренняя команда, потом 1%, потом 10%, 50% и только после этого 100%. Такой подход особенно ценен для продуктов с большой базой пользователей, где ошибка на продакшене стоит дорого — как в деньгах, так и в репутации.

Feature flags в 2020-е стали обязательным инструментом в арсенале. Они позволяют выкатывать код заранее, но держать фичу выключенной до нужного момента. Это удобно, если нужно «открыть» функционал к определённой дате, тестировать разные варианты интерфейса на живой аудитории или быстро реагировать на сбои — просто выключив флаг вместо отката целого релиза.

GitOps закрыл старую проблему «инфраструктура живёт отдельно от кода». Теперь и код, и конфигурация серверов, и пайплайны сборки лежат в одном репозитории. Любое изменение — через pull-реквест, с автоматической проверкой и прозрачной историей. Это упростило повторяемость окружений и сделало релизы более предсказуемыми. А в связке с Kubernetes, Terraform и ArgoCD всё стало максимально автоматизировано: пушишь изменения в репозиторий, и система сама раскатывает их на нужные окружения.

Релизы без страха — идеал, к которому все идут. Но правда в том, что даже с progressive delivery и GitOps проблемы всё равно бывают. Просто теперь они реже, их проще локализовать и быстрее откатывать. И да, ночных выкладок «все в офисе, пока не починим» стало заметно меньше. А значит, можно не только быстрее выкатывать продукт, но и жить в чуть более человеческом ритме.

Итог

Любой из этих методов может работать. Где-то старые схемы дешевле и проще, где-то без канареек и blue-green нельзя.

Мы для своих проектов остановились на Git с CI/CD — это наш компромисс между скоростью, безопасностью и экономикой. Он не решает все проблемы, но заметно снижает их количество и позволяет спать ночью, а не ждать три часа у консоли, пока выкатывается новая версия.