Я использую вариант 1. В наши дни процесс обновления обновляется очень редко. Он использует XML-файл, содержащий подробную информацию о том, откуда взять файлы (в настоящее время поддерживает SVN, работает над добавлением поддержки NuGet) и где их разместить. Он также указывает, какие из них являются службами, а какие - веб-сайтами, и указывает имя службы, которая будет использоваться для каждого проекта.
Процесс опрашивает источник, если доступна новая версия, он копирует ее в пронумерованный каталог с новой версией, а затем обновляет службу. Он также хранит 5 копий каждого обновления, что упрощает откат в случае возникновения проблемы.
Вот основной фрагмент кода для средства обновления, которое останавливает существующую службу, копирует файлы, а затем перезапускает ее.
if (isService)
{
log.Debug("Stopping service " + project.ServiceName);
var service = GetService(project);
if (service != null &&
service.Status != System.ServiceProcess.ServiceControllerStatus.Stopped && service.Status != System.ServiceProcess.ServiceControllerStatus.StopPending)
{
service.Stop();
}
service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped, new TimeSpan(0, 1, 0));
if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
log.Debug("Service stopped");
else
log.Error("ERROR: Expected Stopped by Service is " + service.Status);
}
log.Debug("Copying files over");
CopyFolder(checkoutDirectory, destinationDirectory);
if (isService)
{
log.Debug("Starting service");
var service = GetService(project);
// Currently it doesn't create services, you need to do that manually
if (service != null)
{
service.Start();
service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, 1, 0));
if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)
log.Debug("Service running");
else
log.Error("Service " + service.Status);
}
}
person
Ian Mercer
schedule
17.09.2011