Как сократить time-to-market: DevOps-трансформация без переписывания продукта
Из чего складывается время вывода изменений, четыре метрики DORA, практики CI/CD, безопасная выкладка, инфраструктура как код и наблюдаемость, порядок внедрения в семь этапов и пример: релиз с двух недель до трёх дней.
Бизнес редко формулирует проблему словом «DevOps». Он говорит иначе: «доработка, которую обещали к акции, приехала через месяц после акции», «каждый релиз — это ночь, когда все боятся», «после обновления упал сайт, а откатить не смогли до утра», «разработчиков стало вдвое больше, а быстрее не стало». За всеми этими жалобами стоит одна измеримая величина — время от решения что-то изменить до момента, когда изменение работает у пользователей. Эта статья о том, как сократить это время, не переписывая продукт с нуля. Здесь не будет пошаговой настройки конкретных инструментов — о контейнерах и оркестрации есть отдельный материал . Речь о том, из чего складывается задержка, как её измерить, какие практики её убирают и в каком порядке их внедрять. Из чего складывается время вывода изменений Возьмите любую недавнюю доработку и восстановите её путь: когда появилась задача, когда разработчик закончил код, когда код прошёл проверку, когда попал на тестовый стенд, когда был протестирован, когда оказался в промышленной среде. Почти всегда выясняется, что собственно написание кода — меньшая часть срока. Остальное — ожидание. Ожидание проверки кода. Изменение готово, но ревьюер занят. Ожидание стенда. Тестовая среда одна, и на ней сейчас проверяют другую задачу. Ручное тестирование. Регрессионный прогон вручную занимает дни, и его делают перед релизом для всего накопленного объёма сразу. Ожидание релизного окна. Выкладка раз в две недели по расписанию, и готовое изменение ждёт своей очереди. Ручная выкладка. Инструкция на несколько страниц, которую знают два человека, и которая выполняется ночью. Исправление последствий. После крупного релиза неделя уходит на исправление того, что сломалось. Каждое ожидание по отдельности кажется разумным. Вместе они превращают двухдневную задачу в двухнедельную. Поэтому ускорение начинается не с покупки инструментов, а с понимания, где именно стоит очередь. Как измерить скорость и стабильность Исследовательская программа DORA много лет изучает, чем команды с высокой скоростью поставки отличаются от остальных, и выделила четыре ключевые метрики. Они полезны тем, что измеряют одновременно скорость и стабильность — и показывают, что эти цели не противоречат друг другу. Частота развёртываний Как часто изменения попадают в промышленную среду. Раз в квартал, раз в две недели, несколько раз в день. Низкая частота означает большие релизы, а большие релизы рискованнее: в них больше изменений, которые могут сломаться, и труднее понять, какое именно сломалось. Время выполнения изменения Сколько проходит от фиксации кода до его работы в промышленной среде. Показывает, насколько эффективен конвейер от разработчика до пользователя. Доля неудачных изменений Какая часть развёртываний приводит к сбою, требующему исправления или отката. Показывает качество проверок до выкладки. Время восстановления Сколько времени проходит от сбоя до восстановления нормальной работы. Показывает, насколько быстро команда замечает проблему, находит причину и возвращает систему в рабочее состояние. Главный вывод исследований: команды, которые выкладывают изменения часто и небольшими порциями, в среднем реже ломают систему и быстрее её восстанавливают. Интуиция «чем реже выкладываем, тем стабильнее» оказывается неверной — редкие релизы копят риск. Прежде чем что-то менять, стоит зафиксировать текущие значения этих метрик хотя бы приблизительно. Без исходной точки через полгода будет невозможно показать, что изменения дали результат. Практики, которые сокращают время вывода Непрерывная интеграция Каждое изменение кода автоматически собирается и проверяется: компиляция, статический анализ, автоматические тесты. Разработчик узнаёт о проблеме через минуты, а не через неделю на ручном тестировании. Ключевые условия: сборка и проверки запускаются на каждое изменение, а не по расписанию; проверки выполняются быстро — если конвейер идёт час, разработчики начинают его обходить; сломанная основная ветка чинится немедленно и имеет приоритет над новыми задачами. Короткоживущие ветки Изменение, которое неделями живёт в отдельной ветке, при слиянии конфликтует со всем, что сделали за это время другие. Практика небольших изменений, которые попадают в основную ветку за день-два, снимает болезненные слияния и делает каждое изменение простым для проверки. Незаконченная функциональность при этом скрывается за флагами функций, а не держится в отдельной ветке. Автоматизированное тестирование Без автоматических тестов частые выкладки невозможны: ручной регрессионный прогон перед каждым релизом просто не успевает. При этом цель — не стопроцентное покрытие, а уверенность в критичных сценариях. Разумная структура: много быстрых модульных тестов на бизнес-логику, меньше интеграционных, небольшое число сквозных сценариев для самого важного — оформление заказа, оплата, вход. Подробнее — в материале о тестировании ПО . Непрерывная поставка Выкладка превращается из ручной процедуры в автоматический процесс, запускаемый одной командой или автоматически после прохождения проверок. Одинаковый процесс для всех сред: то, что выложилось на тестовый стенд, выложится и в промышленную среду тем же способом. Ручная инструкция из тридцати шагов, выполняемая ночью, исчезает. Безопасные способы выкладки Автоматический откат. Если после выкладки растёт число ошибок или падают ключевые показатели, предыдущая версия возвращается автоматически. Постепенная выкладка. Новая версия сначала получает небольшую долю трафика. Если показатели в норме, доля увеличивается. Флаги функций. Код новой функции уже в промышленной среде, но включается отдельно — для сотрудников, для части пользователей, для всех. Выкладка кода и запуск функции становятся разными событиями. Обратно совместимые изменения базы данных. Изменения схемы делаются так, чтобы старая и новая версии приложения могли работать одновременно. Это условие для отката без потери данных. Одинаковые среды и инфраструктура как код «У меня работает, а на сервере нет» — классическая причина задержек. Контейнеризация делает среду выполнения одинаковой на машине разработчика, тестовом стенде и в промышленной среде. Описание инфраструктуры в коде — серверы, сети, базы, настройки — позволяет создать новую среду за минуты, воспроизвести проблему, отследить, кто и когда изменил конфигурацию. Временные стенды под отдельную задачу снимают очередь за единственным тестовым сервером. Наблюдаемость Быстро восстановиться можно только после того, как проблему заметили. Метрики, журналы и трассировка запросов с оповещениями по симптомам, которые чувствует пользователь, — рост ошибок, замедление ответа, падение конверсии, — а не только по загрузке процессора. Цель: команда узнаёт о сбое раньше, чем пользователи начнут писать в поддержку. Подробно — в статье о мониторинге и observability . Разбор инцидентов без поиска виноватых После каждого значимого сбоя команда разбирает, что произошло, почему проверки его не поймали и что изменить, чтобы такой сбой не повторился или обнаруживался быстрее. Если разбор превращается в поиск виноватого, люди начинают скрывать ошибки, и система перестаёт учиться. Пример из практики: трансформация маркетингового IT-контура Мы проводили DevOps-трансформацию IT-контура маркетинговых систем крупной российской розничной сети. До проекта релиз занимал до двух недель, выкладка и управление окружениями выполнялись вручную, сбои случались часто, а восстановление было долгим. В проекте были автоматизированы конвейеры сборки, тестирования и выкладки с автоматическим откатом, приложения переведены в контейнеры с оркестрацией, инфраструктура описана кодом, внедрены мониторинг и оповещения. Результаты из опубликованного кейса : время вывода новых функций сократилось с двух недель до трёх дней — на 78%; частота релизов выросла с двух в месяц до сорока и более; доступность сервисов выросла с 98,5% до 99,9%; время восстановления после сбоя сократилось с четырёх часов до двадцати минут; критических инцидентов в промышленной среде стало на 75% меньше; затраты на инфраструктуру и поддержку снизились на 80%; процесс выкладки автоматизирован полностью. Обратите внимание: частота релизов выросла в двадцать раз, а инцидентов стало меньше. Это ровно то, что показывают исследования DORA, — небольшие частые изменения безопаснее редких крупных. Разница между 98,5% и 99,9% доступности тоже заметнее, чем кажется: в пересчёте на год это разница между более чем пятью сутками простоя и менее чем девятью часами. В каком порядке внедрять Попытка внедрить всё одновременно обычно заканчивается тем, что команда полгода строит платформу, а релизы идут как раньше. Работает последовательность, в которой каждый шаг даёт измеримый эффект. Этап 1. Измерить и найти главную очередь Восстановить путь нескольких недавних изменений, посчитать текущие метрики, определить, где изменения ждут дольше всего. Результат — понимание, какая одна проблема сейчас сильнее всего тормозит поставку. Этап 2. Автоматизировать сборку и выкладку Даже без автоматических тестов перевод выкладки из ручной процедуры в автоматический повторяемый процесс снимает ночные релизы и ошибки ручных шагов. Это часто самый быстрый способ получить заметный эффект. Этап 3. Добавить наблюдаемость и откат Прежде чем выкладывать чаще, нужно быстро узнавать о проблемах и уметь быстро возвращать предыдущую версию. Иначе рост частоты релизов приведёт к росту числа заметных сбоев. Этап 4. Выстроить автоматические проверки Начать с тестов на самые критичные сценарии и на места, которые ломались чаще всего. Постепенно наращивать покрытие, требуя тестов для каждого нового изменения. Этап 5. Уменьшить размер изменений Короткоживущие ветки, флаги функций, отказ от фиксированных релизных окон. На этом этапе частота выкладок растёт сама, потому что больше нет причин копить изменения. Этап 6. Одинаковые среды и инфраструктура как код Контейнеризация, описание инфраструктуры кодом, временные стенды. Этот этап можно начинать и раньше, если главная очередь — ожидание тестовой среды или расхождения между средами. Этап 7. Постоянное улучшение Регулярный пересмотр метрик, разборы инцидентов, устранение следующего узкого места. DevOps — не проект с датой завершения, а способ работы. Типичные ошибки Купить инструменты и считать задачу решённой Система непрерывной интеграции настроена, оркестрация развёрнута, а релизы по-прежнему раз в две недели, потому что процесс согласования, ручное тестирование и релизные окна остались прежними. Инструменты убирают технические ожидания, но не организационные. Создать «отдел DevOps» как новую стену Раньше разработка перебрасывала код эксплуатации, теперь перебрасывает его «девопсам». Очередь просто сменила название. Цель — чтобы команда разработки могла сама безопасно выводить изменения, опираясь на платформу и практики, а не на отдельных людей. Ускориться без страховки Выкладки участились, а мониторинга, автоматического отката и тестов нет. Через месяц происходит крупный сбой, и компания возвращается к редким релизам с ещё большим числом согласований. Переписать всё под микросервисы Иногда медленная поставка действительно связана с архитектурой: огромный монолит, в котором любое изменение требует пересборки и тестирования всего. Но переписывание — многомесячный проект с собственными рисками. Чаще практики поставки удаётся существенно улучшить на существующей архитектуре, а разделение системы делать постепенно там, где оно даёт эффект. Об этом выборе — в статье о микросервисах и монолите . Измерять активность вместо результата Число выполненных задач, строк кода, коммитов. Эти показатели легко увеличить без пользы для бизнеса. Метрики поставки и стабильности измеряют результат: как быстро и надёжно изменения доходят до пользователей. Безопасность внутри конвейера Ускорение поставки часто вызывает у службы информационной безопасности обоснованное беспокойство: если изменения выходят несколько раз в неделю, ручная проверка каждого релиза становится невозможной. Решение не в том, чтобы замедлиться обратно, а в том, чтобы встроить проверки безопасн