ХабрПостыНовостиМегапосты?

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

Монорепа — это удобно.
Пока тебе не нужно внести глобальные изменения.

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

В итоге все боялись глобальных изменений и каждое обновление Angular превращалось в приключение.

Я решил это исправить. Через синхронизацию с лидами и ключевыми фронтенд-разработчиками мы сделали единый, прозрачный и предсказуемый процесс внесения глобальных изменений — теперь через него проходит каждое важное вмешательство в монорепу.

Эта статья — про то, зачем он нужен, как он построен и какие проблемы решает.

Когда стало понятно, что без процесса — никак

Монорепа живёт по своим правилам. В отличие от отдельных репозиториев, здесь глобальное изменение может:

Когда процесса нет, происходит следующее:

Мы пришли к очевидному выводу: глобальные изменения должны идти по формальному, прозрачному и единому маршруту.

Что считается «глобальным» изменением

Процесс обязателен для изменений, которые:

Примеры:

Не требуют процесса:

Для них достаточно MR с тегом дежурных по монорепе.

Почему мы ввели обязательный RFC и строгий шаблон

Раньше это выглядело так:

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

Мы решили полностью прекратить такой хаос.

RFC — это не бюрократия, а инструмент, который обеспечивает:

Мы сделали строгий шаблон RFC, где есть:

  1. цель и проблема;

  2. план действий;

  3. затрагиваемые команды;

  4. риски;

  5. план отката;

  6. альтернативы;

  7. таймлайн;

  8. список согласовавших.

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

Полный процесс глобальных изменений

1. Инициатива

Статус задачи в Jira: To Do → Research / Tech Review

Задача: понять объём работ, риски и участников.

SLA: 3 рабочих дня на первичное ревью RFC.

2. Коммуникация с лид-командами и CTO

Статус задачи в Jira: In Progress

Отдельным постом сообщаем:

Каждая команда даёт ответ, когда сможет взять тестирование.

SLA:

3. Разработка

Статус задачи в Jira: In Progress

4. Код-ревью

Статус задачи в Jira: Code Review

SLA:

5. Тестирование

Статус задачи в Jira: Ready for test → In testing

Если что-то ломается:

После подтверждений всех команд задача переходит в «Ready for release».

6. Подготовка к релизу

Статус задачи в Jira: Ready for release

7. Релиз

Статус задачи в Jira: Release

Два сценария:

1) Изменение глобальное, но можно выкатывать по проектам

2) Изменение требует одновременной раскатки MFE (например, обновление мажорной версии Angular)

8. После релиза

Статус задачи в Jira: Release → Close

Почему этот процесс — это ускорение, а не бюрократия

Он работает, потому что:

Мы получили:

И главное — глобальные изменения перестали быть стрессом. Они стали обычной частью инженерного процесса.

Наш шаблон RFC

Немного упрощённый для статьи

# RFC: [Название инициативы]

Автор: [Имя, команда]  
Дата: [ДД.ММ.ГГГГ]  
Статус: Draft / In review / Approved  
Задача: Ссылка на задачу в Jira  
Тред: Ссылка на обсуждение RFC  

## 1. Цель и проблема
- Опиши, зачем нужны эти изменения.
- Укажи текущие проблемы или ограничения.
- Объясни, почему важно решать их именно сейчас. Например, устаревший Angular мешает использовать современные подходы разработки, возникают потенциальные трудности с наймом из-за legacy-фреймворка, риски безопасности и т.д.

## 2. План действий
- Опиши шаги внедрения изменений.  
- Укажи инструменты и скрипты, которые будут использоваться.  
- Укажи примерную продолжительность каждого этапа.  
- Назначь ответственных за выполнение.  
- Для крупных изменений (например, переход на nx buildable libs) разбей процесс на фазы, которые можно тестировать и внедрять поэтапно.

## 3. Затрагиваемые команды
- Перечисли команды, чьи зоны ответственности будут затронуты.  
- Укажи, как именно их код или процессы будут затронуты.  
- Отметь, нужно ли их участие в код-ревью и тестировании.

## 4. Риски
- Опиши возможные риски:  
  - технические (например, несовместимость версий виджетов на проде);  
  - организационные (например, команды не успеют протестировать изменения в срок);  
  - продуктовые (например, возможный downtime для пользователей).  
- Укажи вероятность (низкая/средняя/высокая) и возможный эффект. Это поможет оценить, насколько риски можно смягчить.

## 5. План отката
- Опиши условия, при которых будет выполнен откат (роллбек) и/или реверт.  
- Если возможно, укажи план по хотфиксам для быстрого исправления проблем.

## 6. Рассмотренные альтернативы (при необходимости)
- Перечисли варианты решений, которые были рассмотрены.  
- Для каждого варианта укажи плюсы и минусы.  
- Объясни, почему выбран текущий подход.

## 7. Примерный таймлайн (опционально)
- Дата начала работ.  
- Ключевые этапы и дедлайны.  
- Примерная дата завершения.

## 8. Согласовано
- Укажи всех участников согласования.
- При аппрувке можно оставить комментарий.  

Так же здесь указывается список разработчиков, которые аппрувнули RFC.

Итог

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

И самое важное — разработчикам стало проще инициировать изменения, потому что больше не нужно пробивать стену из неопределённости.

Если вы тоже живёте в монорепе — надеюсь, наш опыт окажется полезным.

@misha98857
15.11.2025 23:49 UTC
Первоисточник