← Назад к вопросам

Что такое Trunk Based Development?

1.2 Junior🔥 151 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Trunk Based Development

Trunk Based Development (TBD) - это подход к управлению версиями кода, при котором все разработчики ведут работу непосредственно в основной ветке репозитория (обычно main или master), а не в длительных feature branches. Это одна из лучших практик современной разработки, особенно в контексте Continuous Integration/Continuous Deployment (CI/CD).

Основные принципы

Единая главная ветка: все изменения сразу попадают в main, а не в отдельные branches. Это минимизирует конфликты слияния и упростить интеграцию кода.

Частые коммиты: разработчики совершают коммиты несколько раз в день прямо в main. Каждый коммит должен быть малым, логичным и не ломать сборку.

Автоматизированное тестирование: каждый коммит триггерит полный набор тестов (unit, integration, end-to-end) через CI/CD pipeline. Это гарантирует, что сломанный код не попадёт в production.

Feature flags: новые функции скрывают за feature toggles (флагами конфигурации), благодаря чему незаконченный код может быть в main, но отключён для пользователей.

Примеры использования Feature Flags в Java

Предположим, вы разрабатываете новую платёжную систему:

public class PaymentService {
    private final FeatureFlagManager featureFlagManager;

    public PaymentService(FeatureFlagManager featureFlagManager) {
        this.featureFlagManager = featureFlagManager;
    }

    public PaymentResult processPayment(PaymentRequest request) {
        // Проверяем, включена ли новая платёжная система
        if (featureFlagManager.isEnabled("new_payment_system")) {
            return processPaymentV2(request);
        } else {
            return processPaymentV1(request);
        }
    }

    private PaymentResult processPaymentV1(PaymentRequest request) {
        // Старая реализация
        return legacyPaymentGateway.pay(request);
    }

    private PaymentResult processPaymentV2(PaymentRequest request) {
        // Новая реализация
        return modernPaymentGateway.pay(request);
    }
}

Пример Git workflow в TBD

# 1. Клонируем репозиторий
git clone https://github.com/company/project.git

# 2. Создаём локальную ветку для работы (optional)
git checkout -b feature/new-payment-system

# 3. Работаем над функцией
# ... редактируем файлы ...

# 4. Пишем тесты
# ... создаём PaymentServiceTest.java ...

# 5. Коммитим малыми, логичными куском
git add src/main/java/com/company/payment/PaymentService.java
git commit -m "feat: add new payment system (behind feature flag)"

# 6. Пушим в main (или создаём PR для code review)
git push origin main

# 7. CI/CD автоматически:
#    - Запускает все тесты
#    - Собирает приложение
#    - Развёртывает на staging
#    - Если всё ок - готово к production

TBD vs Feature Branch Development

Feature Branch Development (плохо для TBD):

  • Долгоживущие branches (недели/месяцы)
  • Конфликты слияния
  • Интеграция только в конце
  • Медленный feedback

Trunk Based Development (хорошо):

  • Коммиты прямо в main несколько раз в день
  • Минимальные конфликты
  • Непрерывная интеграция
  • Быстрый feedback от CI/CD

Преимущества TBD

  1. Снижение merge conflicts - когда код быстро интегрируется, конфликтов почти нет
  2. Быстрый release cycle - любой момент из main можно развернуть
  3. Лучшая CI/CD - автоматизированные проверки гарантируют качество
  4. Меньше dead code - незаконченные функции остаются за feature flags
  5. Командная синхронизация - все работают с актуальным кодом

Требования для успешного TBD

  • Отличное тестовое покрытие (90%+)
  • Быстрая CI/CD pipeline (минуты, не часы)
  • Зрелая team culture - все коммиты в main требуют ответственности
  • Feature flags для скрытия незаконченного функционала
  • Хороший monitoring - быстро выявить проблемы в production

Пример типичного дня разработчика на TBD

// Утро: беру задачу "Улучшить пагинацию в списке заказов"
// Пишу тест сначала (TDD)
public class OrderListPaginationTest {
    @Test
    public void shouldReturnPagedResults() {
        OrderRepository repo = new OrderRepository();
        PagedResult result = repo.findOrders(pageNumber, pageSize);
        assertEquals(pageSize, result.items().size());
    }
}

// Потом реализацию
public class OrderRepository {
    public PagedResult findOrders(int pageNumber, int pageSize) {
        // Реализация с limit и offset
        return executeQuery(pageNumber, pageSize);
    }
}

// Коммит в main
git commit -m "feat: implement efficient pagination for order list"

// День: фиксу bug в payment processing
// Создаю тест, который показывает проблему
public class PaymentBugFixTest {
    @Test
    public void shouldHandleDecimalPrecisionCorrectly() {
        // Баг был в том, что BigDecimal не использовался
        Payment payment = new Payment(BigDecimal.valueOf(99.99));
        assertEquals("99.99", payment.format());
    }
}

// Коммит в main
git commit -m "fix: correct decimal precision in payment calculation"

Trunk Based Development - это не просто техника управления Git, это философия, которая требует высокого качества кода, отличного тестирования и хорошей автоматизации. Когда всё это на месте, TBD позволяет team работать с максимальной скоростью и качеством.