ПашМиш
@dphil простите, что возвращаюсь к старой теме, но все выходные думал и не мог заснуть. Можете рассказать как у вас в монорепе усроен CI? Он собирает все компоненты монорепы при каждом коммите? Работает ли версионирование при помощи тегов? Если нужно выпустить релиз одного из компонентов, то все остальные тоже получают новую версию?
У меня в последних проектах общая специфика - относительно редкие релизы (два-три раза в неделю, а иногда и реже).
Сборка - большой gradle-скрипт, которые собирает все компоненты из бранча и прогоняет тесты (выкладывая на тестовый стенд, понятное дело). Это происходит на каждый коммит (и еще и у разработчика на машине).
Версии у всех модулей свои, поднимаются при разработке в бранче руками (иногда разработчики забывали, но редко).
Для ускорения сборки те модули, что в бранче не изменились - подтягиваются из репозитария.
Релиз всей системы помечается тегом, список версий модулей строится автоматом, но к релизу пишутся ручные инструкции по выкладке (если там что-то более сложное, нежели обновить сервисы по стандартной схеме).
Релиз - у всей системы (тег общий), но можно сделать релиз, в котором поменялся только один компонент.
Это - далеко не идеальная схема для относительно небольшой команды (до 20 человек) без особых ресурсов на devops активности.
Можно сделать гораздо лучше, но зависит от требований и имеющихся ресурсов.