Почему ваш стейджинг требует собственных шлюзов развертывания
Разработчик пушит изменение в основную ветку. Сборка проходит, юнит-тесты зеленые, и пайплайн автоматически разворачивает код на стейджинге. QA-тестировщик начинает проверку новой функциональности, но на полпути стейджинг ломается, потому что предыдущее развертывание от другой команды внесло конфликтующее изменение. Теперь QA не может тестировать, график релиза срывается, и никто не знает, какое развертывание вызвало проблему.
Такая ситуация встречается чаще, чем ожидают большинство команд. Инстинктивно стейджинг воспринимается как неформальная среда, где можно все. Но если стейджинг — это место валидации, то его поломка блокирует весь процесс доставки. Возникает вопрос: нужно ли относиться ко всем окружениям одинаково?
Проблема единых правил развертывания
Когда для всех окружений используются одни и те же правила пайплайна, происходит одно из двух. Либо правила слишком мягкие для продакшена, либо слишком строгие для разработки. Ни то, ни другое не хорошо.
Если применить продовские контроли к разработке, разработчики будут ждать утверждений и сканирований, которые не добавляют ценности на этом этапе. Если применить правила разработки к продакшену, вы рискуете выкатить изменения, которые не прошли должную валидацию.
Настоящая проблема в том, что у окружений разные цели. Разработка — для экспериментов. Стейджинг — для валидации. Продакшен — для реальных пользователей. Каждая цель несет свой уровень риска, и пайплайн должен это отражать.
Что значит защищенное окружение
Защищенное окружение — это окружение, на которое нельзя развернуть код без прохождения определенных шлюзов. Эти шлюзы могут быть автоматическими проверками, ручными утверждениями или и тем, и другим. Ключевой момент: защита привязана к окружению, а не к стадии пайплайна.
Продакшен — очевидный кандидат на защиту. Но стейджинг тоже часто заслуживает защиты, особенно когда его используют несколько команд или когда QA полагается на него для валидации релиза. Сломанный стейджинг может задержать релизы так же эффективно, как и сломанный продакшен.
Защита не бинарна. Вы не просто помечаете окружение как защищенное или незащищенное. Вместо этого вы определяете, какие шлюзы применяются к каждому окружению. Здесь и вступают в игру шлюзы, специфичные для окружения.
Шлюзы, специфичные для окружения, на практике
Шлюз, специфичный для окружения, — это проверка или утверждение, которое применяется только к конкретному окружению. Один и тот же пайплайн может иметь разные шлюзы для разных окружений.
Вот типичный пример:
- Разработка: сборка успешна, юнит-тесты пройдены. Ручное утверждение не требуется.
- Стейждинг: интеграционные тесты пройдены, сканирование безопасности завершено, одно утверждение от коллеги.
- Продакшен: регрессионные тесты пройдены, сканирование безопасности завершено, два утверждения от старших инженеров, проверка соответствия требованиям.
Конфигурация пайплайна определяет эти шлюзы для каждого окружения. Когда изменение переходит из одного окружения в другое, пайплайн проверяет шлюзы целевого окружения перед продолжением.
Такой подход сохраняет быструю обратную связь для нижних окружений, обеспечивая безопасность для верхних. Разработчики не ждут ненужных утверждений во время раннего тестирования. Но изменения в продакшен не могут проскользнуть без должной валидации.
Как работает продвижение между окружениями
Продвижение — это перемещение изменения из одного окружения в другое. Например, продвижение со стейджинга в продакшен. Когда оба окружения защищены, продвижение требует прохождения шлюзов целевого окружения.
Диаграмма ниже иллюстрирует, как изменение перемещается между окружениями с разными шлюзами на каждой границе.
Но шлюзы для продвижения на стейджинг обычно легче, чем шлюзы для продвижения в продакшен. Это намеренно. Вы хотите, чтобы изменения быстро попадали на стейджинг, чтобы валидация могла начаться раньше. Вы хотите, чтобы изменения попадали в продакшен только после тщательной валидации.
Распространенный паттерн — запускать все автоматические шлюзы на ранних этапах пайплайна, а затем приостанавливаться для ручного утверждения только перед продакшеном. Стейждинг получает автоматические шлюзы, но пропускает ручное ожидание. Это балансирует скорость и безопасность.
Кто может утверждать, зависит от окружения
Не все утверждения равны. Утверждение разработчиком изменения в разработке — разумно. Но то же изменение, идущее в продакшен, может потребовать утверждения от техлида или инженерного менеджера.
Для изменений в базе данных утверждение может потребоваться от DBA. Для изменений в инфраструктуре — от платформенной команды. Пайплайн должен знать, кто авторизован для каждого окружения, и записывать каждое утверждение как доказательство.
Это не бюрократия. Это гарантия того, что нужные люди осведомлены об изменениях, затрагивающих их зону ответственности. DBA не нужно утверждать каждое изменение кода, но они должны знать, когда миграция базы данных направляется в продакшен.
Практический чеклист для настройки шлюзов, специфичных для окружения
Если вы внедряете это для своей команды, вот краткий чеклист для руководства:
- Перечислите все окружения, которые использует ваша команда (разработка, стейджинг, продакшен и т.д.)
- Для каждого окружения оцените риск неудачного развертывания
- Определите минимальные шлюзы, необходимые для снижения этого риска
- Решите, кто может утверждать изменения для каждого окружения
- Настройте пайплайн для применения этих шлюзов к каждому окружению
- Протестируйте шлюзы, смоделировав развертывание в каждое окружение
- Периодически пересматривайте шлюзы по мере развития команды и приложения
Этот чеклист не исчерпывающий, но он дает отправную точку. Цель — применить пропорциональный контроль, а не добавлять шлюзы ради шлюзов.
Вывод
Защищенные окружения и шлюзы, специфичные для окружения, позволяют применять правильный уровень контроля к каждому этапу вашего пайплайна доставки. Стейждинг получает достаточно защиты, чтобы оставаться надежным. Продакшен получает многоуровневую защиту, чтобы выявлять проблемы до того, как они достигнут пользователей. Разработка остается быстрой, потому что не несет того же бремени.
Ключ в том, чтобы не копировать одни и те же правила повсюду. Нужно понимать, что нужно каждому окружению, и строить пайплайн вокруг этого. Когда вы сделаете это правильно, ваша команда будет двигаться быстрее там, где важна скорость, и замедляться там, где важна безопасность.