Стратегии слияния, чтобы сохранить строительство в больших монорепо.

Авиатор спонсировал этот пост.

Как тяжело может быть слияние? Есть большая зеленая кнопка, которую вы нажимаете, и ваши изменения объединены. Это верно для небольших инженерных команд или тех, кто работает в настройках Polyrepo. Но в крупном монорепо, разделенном десятками или сотнями инженеров, слияние становится одним из самых больших узких мест в трубопроводе доставки программного обеспечения.

Не углубляясь в дебаты Monorepo против Polyrepo, давайте просто скажем, что Monorepos имеют как преимущества, так и проблемы. Что касается преимуществ, уязвимости легко идентифицируются и фиксируются повсюду, более легкий рефакторинг, особенно перекрестный проект, стандартизация инструментов и обмен одни и те же библиотеки в разных проектах.

Что касается проблем, есть:

  • Уверяющие зависимости: запросы на вытягивание (PRS) на основе более старых основных филиалов
  • Неявные конфликты из -за разработчиков, работающих над аналогичной кодовой базой
  • Проблемы с инфраструктурой (тайм -ауты и т. Д.)
  • Внутренние и сторонние зависимости.
  • Флокированные тесты: общее состояние и непоследовательное испытательное поведение

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

Очереди слияния на помощь

Инструменты автоматизации слияния, такие как очереди слияния GitHub, Gitlab Merge Trains и очередь слияния авиатора, изменяют игру, представляя ворота автоматизации, прежде чем слияние в Mainline.

Как они работают:

  • Разработчик отмечает пиар как готов.
  • Система переигрывает этот пиар на последнюю основную линию.
  • CI работает в этом обновленном контексте.
  • Если CI проходит, система объединяет ее.
  • Если новые PRS прибывают во время работы CI, они ждут своей очереди.

Сколько времени это займет?

Поскольку у нас нет 50 часов в день, давайте рассмотрим способы оптимизации этого процесса.

Окраска PRS

Вместо того, чтобы объединять по одному пиарсу за раз, некоторые из них оставляются в пакете, прежде чем запустить процесс непрерывной интеграции (CI). Эта стратегия партии уменьшает количество пробежек CI и сокращает время ожидания для слияний.

Если процесс CI для партии достигает успеха, все запросы на притяжение в партии объединяются одновременно, предполагая, что каждый в конечном итоге проходит сборку. В случае сбоя, неудача партии пополам, чтобы определить, какой PR вызывает сбой, а остальные объединяются.

Этот метод вводит некоторые задержки. Чтобы проиллюстрировать, в идеальных условиях без сбоев и размера партии четыре, общее время слияния резко уменьшается: с приблизительно 50 часов до 12,5 часов.

В практических сценариях происходят неудачи. Например, с уровнем 10% отказа, общее время слияния может значительно увеличиться, потенциально продлевая до 24 часов для слияния всех запросов на притяжение. Кроме того, общее количество прогонов CI увеличивается из -за повторной обработки, необходимой для разрешения сбоев.

Можем ли мы оптимизировать процесс дальше?

Оптимистичные очереди

Вместо того, чтобы думать о слияниях, происходящих в серийном мире, давайте думаем о них как о параллельных вселенных. Мы не рассматриваем магистрали как линейный путь, но как несколько потенциальных будущих будущих, которые он может представлять.

Вместо того, чтобы ждать начального процесса CI, система может оптимистично предположить, что первое запрос на вытягивание пройдет. Основываясь на этом предположении, создается альтернативная основная ветвь, чтобы немедленно начать процесс CI для второго запроса на вытяжение. Как только CI для первого запроса на притяжение успешно завершится, он объединен в основной филиал. Точно так же, когда CI для второго запроса на вытягивание проходит, он также объединяется.

Если CI для первого выходит из строя, система отклонит эту альтернативную основную линию и создаст новую альтернативную основную линию без первого PR, запустите валидацию и выполните те же шаги.

Давайте посмотрим на цифры с оптимистичными очередями:

Можем ли мы еще лучше?

Оптимистичное партия

Мы объединяем стратегию оптимистичных очередей с пакетированием, запускаем CI для партий PR, и по мере их прохождения они объединяются. Если они терпят неудачу, они разделены, чтобы определить, что вызвало неудачу.

Прогнозное моделирование

Что если бы мы могли предсказать, какие PR, вероятно, потерпит неудачу?

Вместо того, чтобы запускать CI по всем возможным комбинациям и сценариям для всех PRS, мы используем прогнозное моделирование. Рассчитая оценку — на основе строк кода и PR, типы файлов, которые модифицируются, тесты добавляются или удаляются в конкретном PR или ряде зависимостей, — мы определяем, какие пути стоит продолжить. Это снижает стоимость CI, но гарантирует, что изменения могут быть быстро объединены.

Многопрочные и затронутые цели

Вместо того, чтобы думать о процессе как о одной очереди, мы можем рассматривать его как множество независимых путей или непересекающихся очередей, которые работают параллельно. Эта идея основана на концепции затронутых целей.

Современные инструменты сборки Monorepo, такие как Bazel, NX или TurborePo, могут определить, какие части сборки влияют конкретные изменения. Используя эту информацию, мы можем группировать запросы на подтягивание в отдельные очереди, позволяя разрабатывать, которые не влияют друг на друга для работы одновременно.

Представьте себе систему, которая производит четыре различных типа сборки — A, B, C и D — и запросы на вытягивание приходят последовательно. Каждый PR может включать только некоторые из этих типов сборки, поэтому вместо того, чтобы ждать одной очереди, мы создаем отдельные очереди для A, B, C и D и запускаем их независимо. Таким образом, неродственные сборки не блокируют друг друга, ускоряя общий процесс.

Больше стратегий оптимизации рабочих процессов слияния

Переупорядочить изменения

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

Потерпеть неудачу быстро

Повторное выполнение теста приоритет испытаниям, наиболее вероятно, не выполняют первым, чтобы сбои могли быть обнаружены на ранних этапах процесса. Это гарантирует, что проблематичные изменения выявляются и решаются быстро, уменьшая количество возможных сбоев.

Разделение выполнения теста

Запуск набора быстрых критических тестов перед слиянием помогает уловить общие проблемы на раннем этапе. Более обширные или более медленные тесты, такие как тесты на дым или интеграцию, проводятся после слияния. Ожидается, что эти тесты после получения меры будут терпеть неудачу очень редко, и в таких случаях автоматический механизм отката может смягчить риск.

В конечном счете, цель состоит в том, чтобы сбалансировать надежность со скоростью, что позволяет командам быстрее отправляться без ущерба для качества. автоматизация слияния не просто экономит циклы CI, она экономит время разработчика, скорость выпуска и инженерное здравомыслие.

В Aviator мы заботимся о опыте разработчиков и производительности разработчиков. Но мы придерживаемся антиметрического подхода к производительности. Вместо того, чтобы создавать блестящие панели мониторинга, мы строим автоматизированные рабочие процессы по всему жизненному циклу разработки программного обеспечения: разработка, обзоры кода, сборки, тесты и развертывания.

Aviator-это разработчик с низким содержанием конфигурации, работающий с AI, который автоматизирует владение, обзоры кода, слияния и развертывание. Он создает организационный график знаний для упрощения назначения билетов, резюме проекта и поддержки внутренней разработчиков. Узнайте больше последних из Aviator Trending Stories YouTube.com/thenewstack Tech Moving быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Ankit Jain является соучредителем и генеральным директором Aviator, разработчика с низким конфигурацией, который автоматизирует владение, который автоматизирует владение, обзоры кода, объединяет и развертывает. Он также возглавляет ангар, сообщество старших DevOps и старших инженеров -программистов, сосредоточенных на опыте разработчиков, … Подробнее от Ankit Jain

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *