Горячее развертывание сборок .net - PullRequest
7 голосов
/ 07 декабря 2009

У нас есть приложение, работающее в качестве службы Windows на производственном сервере. Приложение разбито на несколько сборок, в основном на границах развертывания. Я хотел бы упростить развертывание оперативных исправлений в сборках приложений. В настоящее время я делаю следующие шаги для развертывания оперативного исправления. (у нас есть дубликат производственной среды для постановки, поэтому все должно быть сделано дважды)

  1. Вход на сервер
  2. Остановить услугу
  3. Резервная копия, развернутая в данный момент dll
  4. Заменить на исправление (Скопировать исправление поверх существующей DLL)
  5. Перезапустить службу
  6. Откат в случае непредвиденных ошибок загрузки (пока не произошло)

Я думаю, что я хотел бы загрузить dll (SFTP) в предустановленную папку и заставить приложение взять новую dll.

Одним из решений, которое я рассмотрел, является запуск отдельной службы на сервере. Давайте назовем это службой развертывания исправлений. Он будет отслеживать файловую систему на наличие новых файлов и выполнять шаги 2-6 из списка выше.

Любое понимание приветствуется. Я открыт для других альтернатив, так как они уменьшают трения при развертывании.

Ответы [ 3 ]

5 голосов
/ 07 декабря 2009

Отдельный сервис, вероятно, ваш лучший вариант.

Возможно, вы могли бы сделать это в одном сервисе. Однако этот «трюк», необходимый для самообновления службы, немного сложен для реализации.

То, что вам нужно было бы сделать, - это запустить службу как не более чем очень легкую службу оболочки Затем он может запустить отдельный изолированный домен AppDomain, и этот appDomain загрузит сборки вашей службы, инициализирует и запустит.

Позже, когда вы захотите выполнить обновление (которое может инициироваться через любое событие, которое может забрать служба, включая копирование новых сборок в папку обновления [через FileSystemWatcher], явное указание этого через сеть и т. Д.]), Оно будет необходимо активировать способ сказать внутреннему типу AppDomain об остановке, затем выгрузить AppDomain . На этом этапе он может выполнить шаги 3 и 4 выше. Затем нужно просто перезагрузить домен приложения, повторно запустить его инициализацию и т. Д.

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

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

2 голосов
/ 07 декабря 2009

На нашем сервере сборки мы используем скрипт powershell для удаленной остановки службы, копирования нового файла и перезапуска службы.

1 голос
/ 07 декабря 2009

Я бы посмотрел на Castle Windsor как на хороший вариант для "горячей замены" сборок.

Это продвинутая и хорошо поддерживаемая среда IoC / DI, которая помогает выполнять многие из упомянутых вами задач, кроме фактического перемещения файлов на целевой компьютер. Хотя с сантехникой позаботятся о CW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...