В идеале у вас должна быть отдельная машина для каждой среды (production, uat, test, dev & ci). Если у вас нет ресурсов для реальных физических машин, то для непроизводственных сред используется виртуализация.
Это также означает, что вы можете правильно протестировать эффекты различных зависимостей и библиотек, которые вы используете.
РЕДАКТИРОВАТЬ: О ветвлении ...
То, что мы делаем здесь, и в нескольких местах, где я работал раньше, - это ветка интеграции вне магистрали. Разработчики, разрабатывающие новые функции, разветвляются за веткой интеграции и реинтегрируются в ветку интеграции. CI сделан и на интеграции и на транке. Неформальное тестирование может быть выполнено при интеграции, но более формальное тестирование (выпуски UAT) происходит из магистрали. Периодически мы интегрируем вниз из ветви интеграции в транк. Это имеет дополнительное преимущество защиты ствола.
т.е.
trunk
integration
feature1
feature2