Каковы некоторые хорошие стратегии, позволяющие устанавливать исправленные приложения?
В идеальном мире наши процессы разработки были бы идеальными, в результате регулярные выпуски, которые были настолько тщательно протестированы, что никогда не было бы необходимости "исправлять" запущенное приложение.
Но, к сожалению, мы живем в реальном мире, и иногда ошибки проскальзывают мимо нас и не поднимают их уродливые головы, пока мы не будем заняты кодированием в следующем выпуске. И ошибка должна быть исправлена Теперь. Не как часть следующего запланированного выпуска. Не сегодня, когда движение падает. Теперь.
Как вы справляетесь с этой необходимостью? Это действительно может противоречить хорошим методам проектирования, таким как рефакторинг вашего кода в приятные, дискретные библиотеки классов.
Ручная редактирование разметки и хранимых процедур на производственном сервере может быть рецептом катастрофы, но также может предотвратить катастрофу.
Каковы некоторые хорошие стратегии для разработки приложений и методов развертывания, чтобы найти баланс между потребностями в обслуживании и хорошими методами кодирования?
Ответы
Ответ 1
[Несмотря на то, что мы много тестируем перед выпуском,] Мы делаем следующее:
Наш SVN выглядит следующим образом:
/repo/trunk/
/repo/tags/1.1
/repo/tags/1.2
/repo/tags/1.3
Теперь, когда мы выпускаем, мы создаем тег, который мы в конце концов проверяем в процессе производства. Прежде чем мы начнем производство, мы делаем постановку, которая [меньше серверов, но] почти такая же, как и производство.
Причины создания "тега" включают в себя то, что некоторые из параметров нашего приложения в производственном коде немного отличаются (например, сообщения об ошибках не отправляются по электронной почте и не регистрируются) из "trunk", поэтому имеет смысл создать тег и совершить эти изменения. А затем checkout на производственном кластере.
Теперь, когда нам нужно исправить проблему, мы исправляем ее в тегах /x сначала, а затем мы svn update
из тега и хороши. Иногда мы проходим стадию, с некоторыми проблемами (например, мелкие/тривиальные исправления, такие как орфография), мы обходим стадию.
Единственное, что нужно запомнить, - это применить все исправления от tags/x
до trunk
.
Если у вас несколько серверов, Capistrano чрезвычайно полезно для запуска всех этих операций.
Ответ 2
Одна из стратегий заключается в том, чтобы активно использовать внешние конфигурационные файлы декларативного стиля для разных компонентов.
Примеры этого:
- Доступ к базам данных/объектно-реляционное сопоставление с помощью такого инструмента, как IBatis/IBatis.NET
- Запись через инструмент, например JLog/NLog
- Включение зависимостей с помощью такого инструмента, как Spring/Spring.NET
Таким образом, вы можете часто разделять ключевые компоненты на отдельные части, исправлять работающее приложение без повторной компиляции и беспрепятственно использовать контроль источника (особенно по сравнению с хранимыми процедурами, обычно требующими ручного усилия для управления исходным кодом).
Ответ 3
Мы делим наш код на код структуры и бизнес-настройки. Классы настройки бизнеса загружаются с помощью отдельного загрузчика классов, и у нас есть инструмент для внесения изменений в исполняемый экземпляр производства. всякий раз, когда нам нужно изменение в любом классе, мы меняем его и отправляем в исполняемый экземпляр. исполняемый экземпляр будет отклонять старый загрузчик классов и использовать новую загрузку класса loader для повторного загрузки классов. Это похоже на горячее развертывание EJB Jboss.