Полгода в монорепозитории: что получилось
Зимой у нас было восемь репозиториев: шесть сервисов и две библиотеки, которые они использовали. Любое изменение в библиотеке превращалось в цепочку из пяти пулреквестов, и где-то в середине цепочки обязательно кто-то уходил в отпуск.
Что стало проще
- Атомарные изменения. Правка библиотеки и всех её потребителей — один пулреквест и одно ревью.
- Общие инструменты. Один конфиг линтера, одна версия форматтера, один набор скриптов для локального запуска.
- Поиск по коду. Ответ на вопрос «кто ещё вызывает эту функцию» больше не требует клонировать полкомпании.
Что стало сложнее
Первое, во что мы упёрлись, — CI. Пайплайн собирал и тестировал всё подряд на каждый коммит, и время ожидания выросло втрое. Помогло вычисление затронутых проектов: сборка смотрит на изменённые файлы и граф зависимостей и запускает только то, что могло сломаться.
changed=$(git diff --name-only origin/main...HEAD)
./tools/affected $changed | xargs -n1 make test -C
Второе — владение кодом. Когда всё в одном месте, легко поправить чужой сервис «заодно». Мы завели файл с владельцами каталогов, и ревью от владельца стало обязательным.
Что сделали бы иначе
Переезжали бы по одному сервису, а не всем скопом за выходные. И заранее договорились бы о структуре каталогов: перекладывать их потом оказалось дороже, чем сам переезд.