mmmnetwork

Технические заметки небольшой команды

· 8 мин чтения

Полгода в монорепозитории: что получилось

Зимой у нас было восемь репозиториев: шесть сервисов и две библиотеки, которые они использовали. Любое изменение в библиотеке превращалось в цепочку из пяти пулреквестов, и где-то в середине цепочки обязательно кто-то уходил в отпуск.

Что стало проще

  • Атомарные изменения. Правка библиотеки и всех её потребителей — один пулреквест и одно ревью.
  • Общие инструменты. Один конфиг линтера, одна версия форматтера, один набор скриптов для локального запуска.
  • Поиск по коду. Ответ на вопрос «кто ещё вызывает эту функцию» больше не требует клонировать полкомпании.

Что стало сложнее

Первое, во что мы упёрлись, — CI. Пайплайн собирал и тестировал всё подряд на каждый коммит, и время ожидания выросло втрое. Помогло вычисление затронутых проектов: сборка смотрит на изменённые файлы и граф зависимостей и запускает только то, что могло сломаться.

changed=$(git diff --name-only origin/main...HEAD)
./tools/affected $changed | xargs -n1 make test -C

Второе — владение кодом. Когда всё в одном месте, легко поправить чужой сервис «заодно». Мы завели файл с владельцами каталогов, и ревью от владельца стало обязательным.

Что сделали бы иначе

Переезжали бы по одному сервису, а не всем скопом за выходные. И заранее договорились бы о структуре каталогов: перекладывать их потом оказалось дороже, чем сам переезд.