Что такое Trunk Based Development?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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
- Снижение merge conflicts - когда код быстро интегрируется, конфликтов почти нет
- Быстрый release cycle - любой момент из
mainможно развернуть - Лучшая CI/CD - автоматизированные проверки гарантируют качество
- Меньше dead code - незаконченные функции остаются за feature flags
- Командная синхронизация - все работают с актуальным кодом
Требования для успешного 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 работать с максимальной скоростью и качеством.