Это распространенный сценарий, когда кодовая база продукта, содержащегося в хранилище в некоторой системе VCS, развивается до такой степени, что эта кодовая база может рассматриваться как содержащая несколько продуктов. Распределение кодовой базы по нескольким репозиториям VCS, каждое из которых предназначено для одного продукта, может использовать несколько преимуществ (см. Ниже преимущества наличия продукта на репозиторий VCS по сравнению с моделью репозитория bloat ). С технической стороны разделение кодовой базы является довольно простым шагом, поскольку большинство VCS поддерживают эту операцию. Однако при таком разделении могут возникнуть технические проблемы, связанные с автоматическим тестированием, непрерывной доставкой, интеграцией услуг или мониторингом (см. Проблемы, возникшие в результате разделения..) Организации, планирующие выполнить такое разделение, поэтому должны знать, как выполнить этот переход как можно более плавно, то есть, не прерывая их доставку и мониторинг конвейера. Первый шаг этого, вероятно, состоит в том, чтобы лучше понять понятие проекта и как определить разделение в монолитной кодовой базе.
В ответах на эти вопросы я бы хотел увидеть:
Попытка дать рабочее определение того, что представляет собой продукт, который дает практические критерии для фактического определения продуктов в существующей кодовой базе.
Согласно этому рабочему определению, разработайте план, который фактически выполняет раскол. Мы можем сделать упрощенное предположение, что кодовая база обрабатывается полностью автоматизированным sdlc, реализующим непрерывную интеграцию и непрерывную доставку . То есть каждая ветвь проверяется автоматическим тестовым набором, реализованным в текущей кодовой базе, и каждое слияние с какой-то «волшебной» ветвью генерирует артефакты продукта , которые тестируются и развертываются. ( Артефактами продукта являются, например, исходные архивы, документация, двоичные пакеты программного обеспечения, образы Docker , AMI, unikernels.)
Такой план удовлетворителен, если он объясняет, как обойти
Проблемы, поднятые расколом
Как автоматизированные процедуры тестирования связаны с существующим монолитным хранилищем и разделенными хранилищами?
Как процедуры автоматического развертывания связаны с существующим монолитным хранилищем и разделенными хранилищами?
Где хранится код для самих процедур автоматического развертывания?
Где хранится инфраструктура , стратегии мониторинга и высокой доступности ?
Как обеспечить, чтобы разработчик нуждался только в одной кодовой базе за раз (но, возможно, использует артефакты из других кодовых баз).
Как может такой инструмент, как git-bisect
Заметка на полях: Преимущества наличия продукта в хранилище VCS по сравнению с моделью хранилища с раздуванием
Наличие нескольких небольших репозиториев, содержащих кодовую базу для конкретного продукта, имеет следующие преимущества по сравнению с подходом «раздутого репозитория»:
При использовании разветвленного репозитория трудно откатить релиз, когда продукт нестабилен, потому что история смешана с другой историей продукта.
В случае с репозиторием раздувания трудно просматривать историю проекта или операции, а в небольших репозиториях мы с большей вероятностью прочитаем эту информацию. (Это может быть характерно для VCS, таких как git, где, в отличие от svn, мы не можем извлекать поддеревья!)
С репозиторием раздувания, мы должны делать намного больше танца ветви, когда мы развиваемся. Если у нас есть N репозиториев, мы можем работать параллельно с N ветвями, если у нас есть только 1 репозиторий, мы можем работать только с одной ветвью или иметь множество рабочих копий, с которыми также приходится сталкиваться.
С несколькими небольшими репозиториями журналы дают тепловую карту проекта. Их даже можно использовать в качестве прокси для распространения знаний в команде разработчиков: если я не выполняю коммит в репо X в течение 3 месяцев, было бы хорошо назначить меня в команду, работающую над репо X, чтобы я всегда был в курсе событий в этом компоненте.
С небольшими репозиториями легче получить четкий обзор компонента. Если все идет в одном большом хранилище, то нет заметного артефакта, разграничивающего каждый компонент, и кодовая база может легко дрейфовать к большому шарику грязи .
Небольшие репозитории заставляют нас работать над интерфейсами между компонентами. Но так как мы хотим иметь хорошую капсуляцию, эту работу мы должны делать в любом случае, поэтому я считаю это преимуществом для небольших репозиториев.
С несколькими небольшими репозиториями легче иметь нескольких владельцев продуктов.
С несколькими небольшими репозиториями проще иметь простые стандарты кода, которые подходят для полного репозитория и которые могут быть автоматически проверены.