Architecture Decision Record

Active theme: Light

← Примеры записей решений

Монорепозиторий или мультирепозиторий

Содержание:

Резюме

Проблема

Наш проект включает разработку трёх основных категорий программного обеспечения:

  • Фронтенд-GUI
  • Сервисы промежуточного слоя
  • Бэкенд-серверы

Когда мы разрабатываем, наша система контроля версий (VCS) для управления исходным кодом (SCM) — git.

Нам нужно выбрать, как мы используем git для организации нашего кода.

Выбор верхнего уровня — организовать как «монорепозиторий», «полирепозиторий» или «гибрид»:

  • Монорепозиторий означает, что мы кладём все части в один большой репозиторий
  • Полирепозиторий означает, что мы кладём каждую часть в отдельный репозиторий
  • Гибрид означает некоторое сочетание монорепозитория и полирепозитория

Подробнее см. https://github.com/joelparkerhenderson/monorepo-vs-polyrepo

Решение

Монорепозиторий, когда организация/команда/проект относительно невелики, а быстрая итерация важнее поддержания стабильности.

Полирепозиторий, когда организация/команда/проект относительно велики, а поддержание стабильности важнее быстрой итерации.

Состояние

Решено. Готовы вернуться к вопросу, если/когда появятся новые инструменты для управления монорепозиториями и/или полирепозиториями.

Подробности

Допущения

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

Ограничения

Ограничения хорошо задокументированы на https://github.com/joelparkerhenderson/monorepo-vs-polyrepo

Позиции

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

Мы рассматривали полирепозитории в стиле типичных проектов с открытым исходным кодом на Git, таких как Google Android, Facebook React и т. д. Мы считаем, что они — лучший выбор для участия широкой публики (например, любой человек в мире может работать над кодом) и для автономной доступности (например, проект используется сам по себе, без каких-либо других частей).

Аргументация

Когда организация/команда/проект относительно невелики, мы выбираем монорепозиторий, потому что быстрая итерация существенно приоритетнее поддержания стабильности

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

Следствия

Если уже есть конвейер CI+CD, нам, возможно, придётся скорректировать его для тестирования нескольких проектов в одном репозитории.

CI+CD может занимать больше времени на полную сборку монорепозитория, потому что CI+CD может собирать все проекты в монорепозитории.

Если организация/команда/проект растёт, у монорепозитория возникнут проблемы масштабирования.

Проблемы масштабирования монорепозитория могут сделать переход на полирепозиторий всё более ценным.

Переход с монорепозитория на полирепозиторий — значительная devops-задача, которую нужно будет спланировать, организовать и запрограммировать.

Связанное

Связанные решения

Мы создадим решения для связанных инструментов управления монорепозиториями (например, Google Bazel) и полирепозиториями (например, Lyft Refactorator).

Связанные требования

Нам нужно разработать конвейер CI+CD так, чтобы он хорошо работал с git.

Связанные артефакты

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

Связанные принципы

Легко обратимо. Если монорепозиторий не работает на практике или не нужен руководству, легко перейти на полирепозиторий.

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

Мыслите масштабно. Google и Facebook — очень сильные сторонники монорепозиториев вместо полирепозиториев, потому что все основные продукты можно разрабатывать/тестировать/развёртывать согласованно.

Примечания

Добавьте любые примечания здесь.