За последние четыре года команда Runtime Heroku Runtime перешла из случайных, ручных развертываний к непрерывным автоматическим развертыванию. Изменения теперь выкатываются в глобальном масштабе в течение нескольких часов после слияния любых изменений — без какого-либо вмешательства человека. Это был подавляюще положительный опыт для нас. Этот документ описывает, почему мы решили внести изменения, как мы это сделали, и то, что мы узнали по пути.
Где мы начали
Команда Runtime Heroku строит и управляет частным пространством Heroku (однорантаторное) и общие платформы Runtime (Multiantan), от оркестрации контейнеров до маршрутизации и регистрации. Когда я присоединился к команде в 2016 году, процесс развертывания изменений в компоненте выглядел что-то подобное:
- Если это пятница, подождите до следующей недели
- Если у вас меньше 3 часов, чтобы отслеживать или отвечать на проблемы, дождитесь развертывания
- Присоединяйтесь к операционному каналу в Slack
- Поделитесь своими планами в канале и получите подпись от члена команды, который является основным по-вызове на этой неделе
- Откройте панель тестирования интеграции платформы
- Откройте любые соответствующие мониторинговые панели мониторинга для обслуживания
- На самом деле развернуть изменение
- Мониторинг приборных панелей для аномалий
- Монинтируйте канал операций для уведомлений и предупреждений
- Подожди немного…
- … а затем повторить для следующего региона или услуги по мере необходимости
Процесс был ручной, повторяющейся и необходимой координацией и дополнительными разрешениями. Это было трудностей. Однако он также давно служил команде в течение длительного времени! В частности, в то время команда была небольшими, владелами мало услуг и имела только две производственные среды (США и ЕС).
Обратите внимание, что этот процесс уже опирается на некоторые важные свойства системы и инженерной среды внутри Heroku:
- Изменения были освобождены так часто, как команда была удобной и успела реагировать на возникающие проблемы.
- Изменения были выведены как трубопровод в среду в порядке взрыва.
- Heroku имеет службу тестирования интеграции платформы (под названием Direwolf), который непрерывно управляет набором тестов на платформе во всех регионах и состояния отчетов.
- Были метрики Dashboards и оповещения, чтобы понять проблемы со здоровьем и отладки.
- Эти свойства помогут нам перейти от этого цегруппового процесса к тому, которое было автоматизировано и непрерывным.
Зачем автоматизировать непрерывную доставку?
Мы поняли, что были возможности для улучшения процесса развертывания, но он работал достаточно хорошо в большинстве случаев, когда это не было большого приоритета. Это было тяжело, но это было управляется. Однако, что проходит для управляемых изменений в качестве систем, и два конкретных веща изменились, что заставило нас переоценить, как нам удалось развертываться:
- Команда быстро выросла из горстки инженеров до более чем 30.
- Мы предприняли длинноспособность проекта по рефтеру об общей среде Runtime Refactor, которые оба ощупят нашу производственную среду и начнут разлагать наше монолитное приложение в несколько услуг.
Между этими двумя изменениями мы знали, что это не будет устойчивым, чтобы просто внести дополнительные изменения в существующий рабочий процесс; Нам пришлось укусить пулю и перейти к полностью Автоматизированная и непрерывная модель развертывания.
Увеличение сложности развертывания
Основная система управления для общего времени выполнения представляла собой монолитное приложение Ruby, которое изменилось нечасто (<1 изменение в неделю) и работало в двух производственных средах.
Проект Sharding у нас активно работал (несколько изменений в день) на нескольких службах, работающих в 12 средах (2 постановки, 10 производства). Стоимость каждого ручного шага была усилена. Вытягивая правые панели мошенничков для среды, используемой для стоимости несколько минут в неделю, но теперь может быть часы . Ожидание 3 часа между развертыванием и глядя на графики, чтобы заметить аномалии? Совершенно несостоятельно.
Более высокая координация затрат
Оригинальный процесс состоял в том, чтобы объединить изменения, а затем выпустить их … в какой-то момент позже. Было распространено что-то слить, а затем вернуться на следующий день, чтобы освободить его. Эти изменения могут потребовать некоторых ручных операций, прежде чем они были в безопасности, чтобы освободить, но мы смогли управлять этим, бросив сообщение в команду «Эй, пожалуйста, не развертываем, пока у меня не будет возможности запустить миграцию базы данных. «Поскольку мы привезли больше людей к команде и повышенную активность, однако, это стало главной боли. Изменения будут накапливаться от других, и никто не знал, если бы было безопасно выпустить их все вместе.
Мы также представили набор общих пакетов для поддержки разработки наших новых микросервисов. Это представило новую проблему: один набор изменений может повлиять на многие услуги. Если вы работаете над одним сервисом, и внесите некоторые изменения в общую библиотеку, чтобы поддержать то, что вы хотите сделать, вы развернуте одну услугу и двигайтесь. Мы регулярно накапливаем недели, стоимость недейтивных изменений на услуги, которые были наверное не связан, но представлял большой риск.
Нам нужно было перейти к модели, где изменения всегда были выпущены ко всем нашим услугам.
Как мы это сделали
Чтобы построить нашу новую систему выпуска, мы использовали существующие примитивы Heroku. Каждый сервис является частью Трубопровод Отказ Самые простые сервисы могут быть развернуты только к постановке и производственным средам, но наши Sharded Services имеют до 10 сред, смоделированные в качестве приложений Heroku, используя тот же код, но в разных регионах.
Трубопроводы сконфигурированы для автоматического развертывания в первом приложении в постановке, когда изменение объединено в Master, и Ci прошел. Это означает, что для любого сервиса изменений работают в постановке в течение нескольких минут слияния. Обратите внимание, что это не является чем-то настраиваемым, который мы создали, это функция, доступная для любых пользователей трубопроводов Heroku.
Здесь мы раньше начнут проверять панели мониторинга и просмотр каналов OPS, прежде чем вручную выполнять продвижение трубопровода из приложения для постановки в следующее приложение в трубопроводе.
Автоматизация для спасения
Мы построили инструмент под названием Cedar-Service-Deployer для управления остальными акциями автоматизированного трубопровода. Это написано в Go и использует Клиентский пакет Heroku интегрироваться с API.
Развертователь периодически сканирует трубопроводы, которое ему удается для различий между этапами. Если он обнаружит разницу, он запускает ряд проверок, чтобы увидеть, следует ли оно способствовать изменениям.
Набор чеков на каждую услугу:
- Возраст Отказ Возрастные ворота будут открыты только через 30 минут, чтобы дать время для интеграции тестов для прогона и любых потенциальных предупреждений.
- Разрешить Отказ Не удается, если акции приостановлены по всему миру (например, во время мечты или другие крупные события с обращенными клиентами) или для конкретного обслуживания.
- Github Отказ Развертователь будет продвигать только изменения, которые присутствуют на главной ветке.
- Инцидент Отказ Этот чек не удается, если есть соответствующий инцидент, открытый на Государственный сайт Heroku .
- Либрато Отказ Каждый сервис настроен со списком оповещений Librato для мониторинга, а продвижение приостановлено, пока любые активно стреляют.
- URL Отказ Это общий чек, который проходит до тех пор, пока настроенные URL-адреса возвращают код состояния HTTP 200 OK. Мы используем это, в частности, проверять состояние наших тестов интеграции платформы.
Если какие-либо чеки не удаются, это ничего не делает и ждет следующего галочка, чтобы снова проверить. После того, как все проверки проходят, он выполняет продвижение трубопровода, чтобы подтолкнуть изменения на следующий этап, а затем повторять.
Сам развертыватель без гражданства; Каждый раз, когда он работает, проверяет состояние с API Heroku. Это также не имеет строгой концепции «освобождения». Вместо этого он всегда пытается примирить различия между этапами в трубопроводе. Это означает, что могут быть одновременные выпуски со временем, например, здесь, где 813A04
Офис был выведен из QA01 до VA05 в то же время 4cc067
это одна сцена от завершения его развертывания.
Назначение ключей
В частности, есть несколько вещей, которые сделали проект успешным:
- Начать маленький Отказ Мы проверили первую версию развертывателя на службе, которая все еще была в разработке, а не в производстве. Мы смогли узнать, как это изменило наш процесс и создаст уверенность, прежде чем он был критическим.
- Сделать в борту легким Отказ Добавление нового сервиса в развертыватель требует только настройки трубопровода и списка оповещений для мониторинга. Как только меньшие эксперименты показали успех, люди начали движущиеся услуги самостоятельно, потому что потребовалось меньше времени, чтобы настроить автоматическое развертывание, чем для выполнения одного руководства.
- Создать существующие идеи и инструменты Отказ Наши автоматизированные развертывания не совсем не отличаются от ранее развертываемых развертываний. Инженеры не нужно было узнать что-нибудь новое, чтобы понять это — или захватить и управлять некоторыми изменениями.
Мы также изучили несколько неожиданных вещей по пути!
- Изолировать стадии досрочного трубопровода Отказ Возможно, вы заметили, что постановка имела два приложения «QA01» и «ST01». У нас изначально была только одна обстановка. Но постановка является общим ресурсом в Heroku! Каждый этап в трубопроводе строит больше уверенности в выпуске, и мы обнаружили, что нам нужна была среда, которая повлияла только на нашей собственной команде, а не в каких-либо других командах Героку.
- Инженеры применили много контекста, что компьютеры должны быть преподаваться Отказ Со временем мы добавили дополнительные проверки акции, которые были очевидны для инженеров, но не так очевидно для нашего развертывателя! Вы бы развернули услугу, пока был открытый инцидент? Наверное, нет, но наш разверток сделал! Теперь он проверяет сайт статуса Heroku для открытых инцидентов, чтобы ограничить изменения в систему, пока мы отвечаем. Мы также разрешаем инженерам тестировать изменения в постановке, прежде чем они будут объединены. Вы сразу же продвигаете эти изменения в производстве? Вероятно, нет, но наш разверток сделал (упс). Он теперь проверяет, что изменения существуют в мастере, поэтому мы не развернули изменения, которые не готовы.
- Мастер должен быть развертываемым развертываемым . У нас была политика, которую «Мастер всегда должен быть развертываемым», но существует большая разница между Должен и Должен Отказ С автоматизированной системой непрерывного развертывания нет места для случайной ручной работы, синхронизированной с выпуском. Сегодня мы достигаем гораздо чаще для внутренних функций, чтобы отделить развертывание изменений от включения функции. Нам также пришлось изменить, как мы обрабатываем миграцию базы данных, разделяя изменения, которые добавляют миграцию из кода, который зависит от него.
- Уверенность от освещения Отказ Раньше он был общим для «няня» в развертывании и выполнении ручного плана теста, когда он выкатился. Сегодня мы полностью зависим от наших аварийных сигналов и тестов на интеграцию платформы, чтобы сигнализировать, что изменения безопасны, чтобы развернуться или если развертывание необходимо остановить. Это делает его важным, чем когда-либо, чтобы спросить о каждом изменении, «Как мы узнаем, если бы это перерывы?»
Заключение
Прошло около 2 лет с тех пор, как мы включили автоматические развертывания для нашего первого сервиса. Теперь он управляет 23 услугами. Вместо часов проверки приборных панелей и координации, чтобы развернуть изменения, Инженеры Runtime теперь просто поражают «объединение» и предполагают, что их изменения будут выпущены глобально Пока все полезно.
Оригинал: «https://dev.to/heroku/automated-continuous-deployment-at-heroku-l1h»