Каковы некоторые хорошие стратегии, позволяющие устанавливать исправленные приложения?

В идеальном мире наши процессы разработки были бы идеальными, в результате регулярные выпуски, которые были настолько тщательно протестированы, что никогда не было бы необходимости "исправлять" запущенное приложение.

Но, к сожалению, мы живем в реальном мире, и иногда ошибки проскальзывают мимо нас и не поднимают их уродливые головы, пока мы не будем заняты кодированием в следующем выпуске. И ошибка должна быть исправлена ​​ Теперь. Не как часть следующего запланированного выпуска. Не сегодня, когда движение падает. Теперь.

Как вы справляетесь с этой необходимостью? Это действительно может противоречить хорошим методам проектирования, таким как рефакторинг вашего кода в приятные, дискретные библиотеки классов.

Ручная редактирование разметки и хранимых процедур на производственном сервере может быть рецептом катастрофы, но также может предотвратить катастрофу.

Каковы некоторые хорошие стратегии для разработки приложений и методов развертывания, чтобы найти баланс между потребностями в обслуживании и хорошими методами кодирования?

Ответ 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.