[Даже при том, что мы тестируем много, прежде чем мы выпустим], Что мы делаем это:
Наш SVN похож на это:
/repo/trunk/
/repo/tags/1.1
/repo/tags/1.2
/repo/tags/1.3
Теперь каждый раз, когда мы выпускаем, мы создаем тег, который мы в конечном счете проверяем в производстве. Прежде чем мы сделаем производство, мы делаем подготовку, которая является [меньшим количеством серверов, но] в значительной степени то же как производство.
Причины создать "тег" включают это, некоторые настройки нашего приложения в производственном коде немного отличаются (например, никакие ошибки не посланы по электронной почте, но зарегистрированы) от "соединительной линии" так или иначе, таким образом, имеет смысл создавать тег и фиксировать те изменения. И затем контроль на производственном кластере.
Теперь каждый раз, когда нам нужна к текущим исправлениям проблема, мы фиксируем их в tags/x сначала и затем нас svn update
от тега и хороши. Иногда мы проходим подготовку с некоторыми проблемами (например, незначительные/тривиальные меры как написание), мы обходим подготовку.
Единственная вещь помнить состоит в том, чтобы применить все патчи от tags/x
кому: trunk
.
Если у Вас есть больше чем один сервер, Capistrano чрезвычайно полезен для выполнения всех тех операций.
Одна стратегия состоит в том, чтобы в большой степени использовать декларативный стиль внешние конфигурационные файлы для различных компонентов.
Примеры этого:
Таким образом можно часто сохранять ключевые компоненты разделенными на дискретные компоненты, текущие исправления, которые запущенное приложение без перекомпилировало и беспрепятственно использует управление исходным кодом (особенно по сравнению с хранимыми процедурами, которые обычно требуют ручного усилия к управлению исходным кодом).
Мы делим наш код на код платформы и бизнес-настройки. Бизнес-классы настройки загружаются с помощью отдельного classloader, и у нас есть инструмент для представления изменений в рабочем экземпляре производства. каждый раз, когда нам нужно изменение в любом классе, мы изменяем его и отправляем его рабочему экземпляру. рабочий экземпляр будет отклонять старый classloader и использовать новый classloader insance для загрузки классов снова. Это подобно горячему Jboss, развертываются EJBs.