Как лучше всего управлять выпуском программного обеспечения с несколькими версиями?

Моя компания создает веб-приложение для агентств недвижимости, изначально написанное на классическом ASP с постепенным переходом на .NET. По сути, это веб-сайт с серверной БД, смешанной с пользовательскими службами / DLL Windows. Довольно стандартно для приложений .NET.

В моих прошлых компаниях жизненный цикл разработки программного обеспечения был традиционным. Мы создали выпуски наших продуктов, и когда мы выпускали их, ВСЕ клиенты получали один и тот же код. Требования к продукту были отфильтрованы нашей командой инженеров, отправлены в отдел контроля качества для тестирования в локальных промежуточных средах, а затем отправлены в производство.

У этой компании есть несколько версий нашего продукта для множества клиентов. По сути, клиент A может быть в версии 1.5, клиент B - в версии 1.6, а клиент C - в версии 2.0. Мы делаем это, потому что учреждения, которые используют наше приложение, предъявляют строгие требования ко всему, что изменяется, что влияет на их пользователей. Если клиент доволен версией 1.5, он остается там, даже если в версии 2.0 есть все последние навороты. Клиенты фактически отказываются от обновления, потому что новые «функции» на самом деле ВРЕДА их пользовательской базе, вызывая путаницу.

Поддержка этого типа жизненного цикла прекрасна, когда вы маленький, но по мере того, как вы набираете десятки или сотни клиентов, это создает нагрузку на наших разработчиков, администраторов баз данных, QA, не говоря уже о нашей группе поддержки. Теперь мы находимся в ситуации, когда мы можем запланировать только 6-8 сайтов в неделю, которые могут обновляться по мере поступления требований. Это заставляет нас заставлять другие сайты ждать 2-4 месяца, чтобы получить хотя бы незначительные обновления на своих сайтах. Любая производственная проблема или ошибка, требующие немедленного внимания, еще больше усугубляют ситуацию, потому что для сайта, на который уже запланировано получение обновления, нужно отменить приоритет, чтобы выделить время.

Извините, это так долго, но ЛЮБАЯ помощь приветствуется. Чем раньше мы внесем некоторые изменения, чтобы добиться лучшего графика выпуска, тем лучше. Спасибо!


person tresstylez    schedule 17.11.2010    source источник
comment
Какую систему контроля версий и автоматизированную сборку вы используете сейчас? Если я правильно понимаю, поскольку вы получаете так много версий одного и того же веб-сайта / приложения для обслуживания, вы не можете посещать их достаточное количество одновременно, отсюда и задержка. Это правильно?   -  person jdecuyper    schedule 17.11.2010
comment
Мы используем комбинацию вещей. Мы используем продукт под названием Vault для контроля версий, а также плагин под названием CC.NET (CruiseControl.Net), который представляет собой сервер непрерывной интеграции / сборки, который отслеживает наши репозитории и генерирует сборки.   -  person tresstylez    schedule 17.11.2010


Ответы (3)


Оказывается, я работаю точно в той же среде. Вот как мы настроили нашу систему:

  1. У каждого клиента своя база данных. Фактически вы обсуждаете мультитенантное решение. Несмотря на то, что использование одной базы данных для управления всеми ими имеет свои преимущества, это становится проблематичным, когда вы хотите переместить клиентов, или когда клиенты хотят разместить свои собственные системы, или когда у вас есть различия в схемах между версиями (что является обычным явлением). Единственный другой подход к этой проблеме - использовать одну базу данных, но сегментировать по имени схемы (например, ClientA.Table1, ClientB.Table1 ...).

  2. Мы используем единую кодовую базу. Мы используем виртуальные каталоги, чтобы указать версию кода, которую использует клиент. Все клиенты в одной сборке указывают на одни и те же биты. Однако у нас может быть несколько версий в дикой природе. Таким образом, один клиент может указывать на 1.0.0.0, а другой - на 1.0.1.1.

  3. Когда мы хотим кого-то обновить, мы указываем его виртуальный каталог на запрошенную выпущенную версию. Физические папки названы в соответствии с их полным названием версии (например, 1.0.3.4). Приложение предназначено для обнаружения несоответствия между ожидаемой версией базы данных и имеющейся у нее версией. Если есть разница, он перенаправляет на страницу, где администратор может обновить схему базы данных. Все изменения в базе данных оформляются сценариями и предназначены для выполнения в надлежащей последовательности. Мы используем третий октет номера версии, чтобы указать версию базы данных. Итак, 1.0.1.1 означает, что схема базы данных изменилась с 1.0.0.0.

  4. Может возникнуть вопрос: «Зачем использовать виртуальные каталоги?» Это входит в основное правило разработки: код приложения не может включать какие-либо данные или настройки, специфичные для клиента. В частности, ничто из корня папки приложения не может быть специфичным для клиента. Итак, что насчет строк подключения? Вот почему мы используем виртуальные каталоги. Наша виртуальная установка выглядит примерно так:

clientsite (or vdir)
    /appname_vdir

Корневая папка клиентского сайта содержит файл web.config с любыми настройками клиента, не связанными с базой данных, такими как строки подключения. Когда мы указываем /appname_vdir на папку с новой версией, нам не нужно беспокоиться об обновлении строк подключения или любых других данных, специфичных для клиента. Что делает это сложным, так это то, что каждое изменение оценивается в свете того, будет ли каждый клиент желать этого изменения одинаково или нет. Если нет, то должны быть средства для отключения (или отмены установки) этого изменения.

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

В какой-то момент мы планируем создать механизм, позволяющий уведомлять администратора о доступности новой версии. Если они находятся в нашей размещенной среде, обновление потребует изменения соответствующего пути виртуального каталога. Если они размещают свои собственные, это предоставит средства для загрузки битов, а затем изменения пути. Эту часть мы еще не успели построить. Кроме того, также можно создать инструмент управления, позволяющий сотрудникам службы поддержки обновлять людей и определять, какую версию они используют.

person Thomas    schedule 17.11.2010
comment
Вау, это звучит почти так же, как наша среда. Итак, я думаю, что мой вопрос к вам связан с тем, как вы на самом деле размещаете различные версии. Я считаю, что мы генерируем сборку - делаем разницу между текущей версией их сайта - и PUSH (перезаписываем) их текущий сайт новыми файлами. В связи с этим мы запускаем соответствующие сценарии базы данных для обновления базы данных. Как только эти шаги будут выполнены, они будут в «текущем» выпуске. В вашем решении вместо этого используются виртуальные каталоги. Как вы думаете, я могу включить это в нашу установку? - person tresstylez; 17.11.2010
comment
@tresstylez - мы размещаем несколько версий, имея несколько папок (названных с полным номером версии). Два разных клиента могут иметь свой vdir приложения, указывающий на разные папки версий. Если два клиента используют одну и ту же сборку, их виртуальные каталоги приложений указывают на одну и ту же папку версии. - person Thomas; 18.11.2010
comment
@tresstylez - Кстати, это не обязательно должны быть vdirs; вы можете просто изменить корневую папку сайта, когда будете кого-то обновлять. Однако это проливает свет на еще один важный аспект нашей настройки, касающийся настроек для конкретных клиентов. Я исправлю свой ответ, чтобы добавить больше. - person Thomas; 18.11.2010
comment
@Thomas - Итак, после дополнительных исследований - одна из основных причин, по которой они выпускают отдельные выпуски, заключается в том, что каждый сайт использует настроенный файл web.config, содержащий в основном строки подключения к их БД. Кроме того, поскольку у нас есть 3 разных среды (QA, DEV, Production ...), даже эти строки необходимо обновлять вручную. Кроме того, у каждого сайта есть собственный файл конфигурации, который включает переменные, которые включают / выключают функции на их сайте. Как вы думаете, можно ли решить эти проблемы с помощью решения Virtual Dir? - person tresstylez; 19.11.2010
comment
@Thomas - Кроме того, еще одна кривая, возможно, мы запускаем приложение .NET - это включает библиотеки DLL в нашем каталоге / bin и файлы .aspx .. Могут ли файлы dll, .aspx и web.config жить в этом мире виртуальных каталогов ? - person tresstylez; 19.11.2010
comment
@tresstylez - Мы также используем .NET. Фактически, мы полагаемся на то, что .NET объединит файлы web.config из дочерних и родительских папок. Вот как мы можем поместить настройки, специфичные для клиента, в корневой файл web.config и сохранить все специфичные для клиента настройки вне папки приложения. Очевидно, это меняет путь. Например, вместо /default.aspx у вас будет /appname/default.aspx. Однако, если вы используете ~ для всех своих путей, он будет работать нормально. - person Thomas; 19.11.2010
comment
@tresstylez - Учитывая то, что вы писали несколько ранее, настройка аналогичной структуры папок, в которой вы можете хранить строки подключения за пределами папки приложения, значительно упростит работу для DEV, QA и нескольких выпусков. В нашей среде каждый разработчик имеет свой собственный набор строк подключения, которые в любой момент времени могут указывать на разные копии базы данных (например, для отладки, тестирования разработчиков и т. Д.). - person Thomas; 19.11.2010
comment
@tresstylez - Что касается настроек, зависящих от клиента, у вас есть два варианта: корневой файл клиента web.config или таблица базы данных (при условии, что у каждого клиента есть собственная база данных). Помещение их в базу данных упрощает управление ими и упрощает создание для них экрана обслуживания. Если они находятся в клиентском файле web.config, вам придется вручную перейти на сервер, чтобы изменить чьи-то настройки. Некоторыми настройками, такими как строки подключения, гораздо труднее управлять вне файла конфигурации, и поэтому их легче сохранить там. - person Thomas; 19.11.2010
comment
@ Thomas- Привет, Томас, как бы вы решили эту проблему для общедоступного веб-сайта, на котором вы хотели бы предоставить новые функции только подгруппе пользователей - мой вопрос - stackoverflow.com/questions/8129840/ - person ram; 29.11.2011
comment
@ram - это другой тип управления версиями. В ситуации, о которой я упоминал выше, у вас есть несколько установок, указывающих на разные базы данных. В этом сценарии вы можете сегментировать версии на основе клиента / клиента / клиента (клиент 1,2 и 3 получает версию 1.0, клиент 4 получает версию 1.1), потому что существует высокая степень разделения между базами данных клиентов. Однако в предоставленной вами ссылке желательно сегментировать по функциям в рамках одной и той же кодовой базы и установки, что намного сложнее. - person Thomas; 29.11.2011
comment
@ram - Я подумаю о том, как можно изменить версию системы в заданном вами вопросе о вознаграждении. Я скажу, что этот вопрос больше касается управления версиями схемы, а не управления версиями SP как такового. - person Thomas; 29.11.2011
comment
@ Thomas- fyi- награда заканчивается завтра :) - person ram; 29.11.2011

На мой взгляд, у вас есть два варианта:

  • размещать все версии самостоятельно и разумно различать, какую версию должен использовать клиент
  • заставить клиентов размещать приложение самостоятельно

Хостинг самостоятельно

Думаю, вы могли бы сделать это так:

  • установить все разные версии, которые используются в настоящее время
  • есть один домен, каждый клиент получает его поддомен. Клиент ABC входит в abc.mydomain.com и т. Д.
  • используйте механизм перенаправления или перезаписи URL, чтобы незаметно перенаправить их на соответствующую версию вашего продукта.
  • когда клиент хочет выполнить обновление, перенести свои данные на более поздний экземпляр продукта и изменить правило перезаписи для своего поддомена

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

Клиентский хостинг

Это может быть относительно просто. Вы можете упаковать часть приложения ASP.NET в установщик MSI, создание виртуальных каталогов и пулов приложений и т. Д. Может быть выполнено из MSI. Затем вы можете использовать инструмент обновления базы данных, такой как DBGhost, для упаковки вашей базы данных - он берет вашу шаблонную (исходную) базу данных, сравнивает ее с целевой, а затем генерирует DDL, необходимый для приведения цели в соответствие с источником. Я понимаю, что для этого также есть инструмент, включенный в одну из версий VS2010, но я не использовал его и не могу его комментировать.


Вы, разработчики, можете облегчить многие проблемы с обновлением, предоставляя обновления в службу поддержки в удобной для них форме. По возможности используйте пакеты MSI. По возможности используйте инструменты создания / создания базы данных промышленной прочности. Если по какой-то причине вы не можете использовать инструмент обновления базы данных, убедитесь, что обновления базы данных написаны правильно (например, если объект существует, то измените else create). При необходимости укажите путь обновления, которому необходимо следовать - если клиент хочет перейти с 1.6 на 2.0, то сначала он должен пройти через 1.8 - это делает обновления более детализированными, предсказуемыми и простыми в управлении (вы поддерживаете сценарий обновления для 1.6. -> 1.8 и 1.8-> 2.0, вам не обязательно иметь его для 1.6-> 2.0).

Я надеюсь, что это дает вам достаточно, чтобы подумать - если у вас есть больше деталей, отредактируйте свой пост и добавьте их.

person slugster    schedule 17.11.2010
comment
Спасибо за ответ. К сожалению, мы ДОЛЖНЫ размещать наши сайты и базы данных, поскольку эта информация является конфиденциальной. Что вы имеете в виду «установить все используемые в настоящее время версии»? Означает ли это, что вы устанавливаете каждую версию в отдельный виртуальный каталог в IIS? - person tresstylez; 17.11.2010
comment
@tres - используете ли вы несколько клиентов для баз данных (несколько клиентов используют одну и ту же физическую базу данных, их соответствующая информация идентифицируется идентификатором клиента)? Или индивидуальные базы данных для каждого клиента? Если у вас несколько клиентов, использующих продукт версии 2.0, все ли они используют одну и ту же сборку или есть незначительные различия? - person slugster; 18.11.2010
comment
Мы используем индивидуальные базы данных для каждого клиента - с их строками подключения в отдельных файлах web.configs. Если несколько клиентов используют версию 2.0, я считаю, что код такой же. - person tresstylez; 19.11.2010

Задумывались ли вы об автоматизации обновлений и развертываний приложения. Если вы сможете придумать стандартизированный способ упаковки приложения независимо от версии, его будет очень легко автоматизировать с помощью такого инструмента, как Nolio ASAP (http://www.noliosoft.com). Это позволит вам создать процесс развертывания для каждой версии или даже для каждой учетной записи, а также включить «почти такие же» развертывания, где различия могут быть введены в качестве входных данных для каждого развертывания.

person Daniel Kushner    schedule 07.12.2010