+44 203 858 0803 hello@hip.property

Дискуссия о mono vs micro repos яростна среди кругов разработчиков, и хотя это не так расходимо, как вкладки и пробелы, я провел некоторое время по обе стороны прохода.

На моей последней работе, которая была консультацией FinTech, мы широко использовали микрорепозиции. Это было невероятно выгодно для одного проекта, и все же по другому мы обнаружили, что это вызвало больше боли, чем пользы. Итак, когда я присоединился к HiP, я решил, что мы сначала построим с использованием моно-репо и переключимся, когда он сосать. Пока это не так.

Тем не менее, у нас есть несколько различных репозиториев - наша платформа, включая все библиотеки, микросервисы и код клиента / приложения, которые живут в одном monorepo. Однако некоторые из наших инструментов, которые являются частью нашей цепочки построения, - например, Tino и побег из тюрьмы жить в своих собственных РЕПО. Это похоже на прагматичный баланс.

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

На микро-РЕПО

Micro-repos (где у вас много независимых репозиториев, как правило, один за артефакт) хорошо сочетается с мышлением микросервисов. Мы закончили тем, что использовали myrepos как ключевая часть нашей инструментальной цепочки, поскольку это сделало проверку и опыт IDE действительно приятным.

Рассмотрите возможность использования микрорепозиции, если:

  • Услуги (или библиотеки) развиваются независимо друг от друга
  • Код обрабатывается отдельными командами и выпускается в собственном цикле
  • Вы рассматриваете каждую услугу как свою собственную. где отсутствует

Профессионалы

  • Короткие циклы сборки, приводят к быстрой обратной связи
  • Когда они правильно инкапсулированы, репозитории / проекты «чувствуют» более легкий
  • Поощряет более частые циклы выпуска. Это само по себе хорошо, но мы обнаружили, что, поскольку мы выпускаем часто, мы приняли другие хорошие практики, чтобы сделать цикл выпуска более плавным - чтобы сделать его более плавным, мы приняли другие хорошие практики, такие как Семантические списки и Семантический выпуск
  • Аналогичным образом, он обеспечивал хорошую гигиену при управлении версиями и освобождает API службы / проекта отдельно от самого модуля. Это трение на самом деле означало, что мы потратили больше времени, учитывая, что изменения были нарушены, прежде чем вводить их, что иногда приводит к более продуманным вариантам дизайна.
  • Позволяет выпускать (и обновлять) разные скорости. Это нормально в большом имуществе служб, если appA использует v2.3 библиотекиA, но appB использует v2.5. Этот тип независимой эволюции становится более естественным с использованием микрорепозиций.

Минусы

  • Это легко избавиться от контроля и обнаружить, что ваше время тратит значительное время на управление кросс-модульными зависимостями и циклами выпуска.
  • Сложно поддерживать обновления проектов после выпуска. Освобождение библиотеки часто подразумевало сбор и обновление сервисов B и frameworkC - иногда это также требовало дальнейших релизов. Вскоре мы были в длинных цепях релизов.
  • Когда у вас есть перекрестные репо (которые чаще возникают при использовании услуг или основных функций), тогда PR разделяются, и трудно просмотреть весь набор изменений в одном месте. Это приводит к тому, что рецензенты должны иметь больше знаний в памяти, и мы обнаружили, что это снизило общую целостность обратной связи по ПР

Антипаттерны

Microrepos может быть не для вас (или у вас могут быть неправильные границы разделения), если:

  • Вы заметили, что изменения часто распространяются на несколько репозиториев
  • Управление зависимостями усложняется

Обратите внимание - даже когда наши микро-РЕПО работали хорошо, мы сгруппировали репозиции по признаку, а не абстракции. Это означало, что наш веб-код для featureX жил в том же репо, что и код службы. Это было особенно полезно, и мы обнаружили, что он поощряет более полномасштабное развитие всей команды.

О моно-репозициях

Monorepos - это где весь код живет в одном большом хранилище. Они знаменито используются Google и Facebook - хотя оба из них вынуждены создавать знаковые обычные инструменты для поддержки этих подходов.

Рассмотрим использование моно-РЕПО, если:

  • Вы небольшая команда или команда, работающая над одним проектом / платформой, которая объединяется вместе
  • Вы новичок в проекте и еще не знаете, где находятся логические границы. Это тот же аргумент для Монолит первыйдизайн обслуживания.
  • Вся ваша платформа развивается и тестируется вместе. Даже если вы выходите на службу самостоятельно, если вы так поддерживаете остальные сервисы для обновления в режиме блокировки - это особенно хорошо работает в monorepo.

Профессионалы

  • В целом, я обнаружил, что мы тратим гораздо меньше времени на создание администратора, несмотря на то, что сами сборки занимают больше времени
  • Что касается вышеизложенного, но наши структуры модулей проще - не более ХОРОШЕЕ проектов или пререканий родительской помпы.

Минусы

  • По мере увеличения проекта увеличивается срок службы и увеличивается.
  • Инструментарий для инкрементной компиляции на конвейере CD не там, где он должен быть, особенно если вы создаете контейнеры как часть своего конвейера сборки. (Gradle хорош здесь, но спотыкается о последнем препятствии сборки докера)
  • Это требует гораздо более логичной логики сборки для ваших конвейеров, чтобы поддерживать «только выпустят то, что изменилось». Мы отложили эту работу на данный момент, поэтому каждый выпуск заканчивается развертыванием всего флота, а не новых сервисов.
  • В общем, легче кросс-модульные зависимости проникать внутрь, поэтому вам нужно быть дополнительным дополнением к гигиене зависимостей.
  • Мы менее склонны фактически выпускать или артефакты версии - в результате все в HiP сейчас 0.1.0-СНАПШОТ, В свою очередь, мы не видим выигрыша журналов семантической фиксации, описанных выше, что означает, что наши сообщения о фиксации имеют тенденцию к снижению качества.
  • Это может запутать, если услуги не все обновляются вместе. Ничто не мешает различным модулям в зависимости от более старых версий библиотек, но это сбивает с толку, когда, когда я просматриваю код, я перехожу к изучению класса, но только для того, чтобы найти используемый код, это не то, что находится в репо, а несколько старше версия снята с Maven.

Антипаттерны

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

Вывод

В общем, я нашел переключатель (или вернулся), monorepo был в значительной степени положительным. Тем не менее, нам нужно вкладывать больше времени, чтобы сделать наш строительный трубопровод более умным, который отличается от типа сложности, чем нам приходилось управлять с помощью микро-РЕПО.

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

Некоторые из плюсов и минусов, перечисленных выше, являются просто косвенными и не обязательно эксклюзивными для mono vs micro repos. Например, задумчивый подход к изменению API-интерфейсов так же доступен для monorepo, как и для micrororepo. Однако мы обнаружили, что более гранулированный цикл выпуска естественно подтолкнул нас к рассмотрению и выпуску этих вещей независимо.

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

СохранитьСохранить

СохранитьСохранить

Мы используем файлы cookie на нашем веб-сайте

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