Какой лучший способ развернуть исполняемый процесс на веб-сервере? - PullRequest
7 голосов
/ 14 декабря 2009

Оригинальный вопрос:

Название этого вопроса может быть немного неуклюжим, но вот ситуация:

На моем сервере развернут веб-проект .NET. Это все еще в бета-версии, так что много релизов и переизданий происходит.

Я также написал исполняемый файл C # в том же решении VS (назовите его «admin.exe»), который выполняется в фоновом режиме на сервере, периодически выполняя определенные проверки целостности бизнес-правил и делая соответствующие вставки в таблицу предупреждений в DB.

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

Спасибо!

Редактировать - Баунти начался

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

  1. Публикация последней версии веб-сайта;
  2. Завершить работу всех экземпляров admin.exe, работающих на сервере;
  3. Обновление admin.exe;
  4. Запустить admin.exe;
  5. Все вышеперечисленное следует выполнять предпочтительно за один шаг или как можно меньше этапов, поскольку это будет повторяться в течение всего срока службы продукта; и
  6. Все вышеперечисленное должно выполняться предпочтительно без необходимости установки какого-либо программного обеспечения сторонних производителей.

Спасибо за помощь!

Незначительное редактирование - уточнение

Я думаю, что многие предлагаемые решения переоценили сложность проблемы, поэтому позвольте мне уточнить: все, что должно быть развернуто, должно быть развернуто только на одном компьютере, который также К счастью, Visual Studio доступна со всем исходным кодом. Мне нужно только (1) опубликовать веб-сайт в веб-папке и (2) закрыть, переустановить и перезапустить admin.exe на том же сервере. Разве нет простого способа сделать это за один шаг? Можно ли это сделать с помощью проекта VS Deployment?

Ответы [ 11 ]

3 голосов
/ 01 февраля 2010

«Правильный» способ - это, вероятно, настроить сценарии развертывания и установщики, но возможность просто щелкнуть «Опубликовать» в Visual Studio и пропустить переход с удаленного рабочего стола намного удобнее во время разработки.

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

Просто добавьте ссылку на консольный проект в веб-приложении администратора. Даже если вы не вызываете какие-либо методы в консольном проекте, ссылка приведет к тому, что консольное приложение будет перестроено и загружено при публикации веб-сайта администратора.

Простая стартовая / стоповая страница, добавленная в веб-приложение, выполняет шаги 2 и 4 - Mine вызывает Process.Start () / Process.Kill (), хотя у вас, очевидно, есть возможность более чистого отключения в зависимости от настроек из admin.exe.

Ниже приведен код моей стартовой / стоповой страницы - я настроил их как методы веб-службы (для облегчения некоторых вещей мониторинга, которые вам, вероятно, не понадобятся), но они должны работать так же хорошо, как и при простом нажатии кнопки метод. Обратите внимание, что учетной записи службы потребуется разрешение для запуска / остановки процесса - в окне разработчика простейшим вариантом является настройка iis для запуска от имени администратора, а не учетной записи службы по умолчанию.

    private void KillProcess(string name)
    {
        var binpath = Server.MapPath("~/bin");
        var pp2 = Process.GetProcesses();

        var pp = from p in pp2 where p.ProcessName.Contains(name) && !p.ProcessName.Contains("vshost") select p;
        foreach (var p in pp)
        {
            p.Kill();
        }
    }

[WebMethod]
    public void StartQueueRunner()
    {
        var binpath = Server.MapPath("~/bin");
        System.Diagnostics.Process.Start(Path.Combine(binpath, "TwoNeeds.QueueRunner.exe"));
    }

[WebMethod]
    public void StartQueueRunner()
    {
        var binpath = Server.MapPath("~/bin");
        System.Diagnostics.Process.Start(Path.Combine(binpath, "TwoNeeds.QueueRunner.exe"));
    }
3 голосов
/ 14 декабря 2009

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

MSBuild делает гораздо больше, чем просто создает решения. Вы также можете использовать его для копирования файлов и их обновления. Хороший ресурс для выполнения задач - MSBuild Community Tasks здесь .

Затем можно включить развертывание фонового процесса вместе с развертыванием развертывания веб-сайта.

Альтернативным подходом может быть использование Windows Powershell с чем-то вроде PSExec для удаленного выполнения команд копирования и обновления.

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

2 голосов
/ 29 января 2010

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

Я предполагаю, что ваш админ-процесс запускает службу Windows (в любом случае, имеет смысл запускать ее как службу), поэтому вы должны развернуть ее следующим образом (это часть сценария msbuild - вы можете удалять биты с именем пользователя и пароль, если он вам не нужен):

<ItemGroup>
    <ReleaseFiles Include="localPath\bin\*.dll"/>
    <ReleaseFiles Include="localPath\bin\*.exe"/>
    <ReleaseFiles Include="localPath\bin\*.pdb"/>
    <ReleaseFiles Include="localPath\bin\*.config"/>   
</ItemGroup>

<Target Name="Release">
    <Message Text="Installing Admin on $(DeploymentMachine) as user $(User)"/>
    <Exec ContinueOnError="true" Command="sc.exe \\$(DeploymentMachine) stop &quot;Admin&quot;" />
    <Exec ContinueOnError="true" Command="sc.exe \\$(DeploymentMachine) delete &quot;Admin&quot;" />
    <Delete ContinueOnError="true" Files="\\$(DeploymentMachine)\C$\path-to-admin\*.*"/>
    <MakeDir Directories="\\$(DeploymentMachine)\C$\path-to-admin"/>
    <Copy SourceFiles="@(ReleaseFiles)" DestinationFiles="@(ReleaseFiles->'\\$(DeploymentMachine)\C$\path-to-admin\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Exec Command="sc.exe \\$(DeploymentMachine) create &quot;Admin&quot; binpath= &quot;C:\path-to-admin\admin.exe&quot; start= auto obj= $(User) password= $(Password)"  />
    <Exec ContinueOnError="true" Command="sc.exe \\$(DeploymentMachine) start &quot;Admin&quot;" />
</Target>

Развертывание веб-сайтов IIS обычно немного сложнее, но если у вас все настроено на целевой машине, возможно, будет достаточно просто скопировать файлы по сети (снова используя \ DeploymentMachine \ share или \ DeploymentMachine \ C $ \ путь адресации).

К сожалению, развертывание никогда не бывает красивым и элегантным: (

Пожалуйста, дайте мне знать, если вам нужно что-то прояснить

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

Вероятно, есть более понятный способ, но, возможно, установите его как службу Windows, а затем запишите команды установки / удаления с помощью installutil.exe. Затем просто обновите папку, в которой находится служба, и повторно запустите сценарий для каждого обновления?

Отличное руководство по обслуживанию здесь

Надеюсь, это поможет

1 голос
/ 01 февраля 2010

Вот противная мысль. Если вы admin.exe не делаете ничего слишком жесткого ядра, почему бы не выбросить в IIS? Чтобы написать веб-сервис на C #, вам, вероятно, не нужно много менять.

Чтобы обеспечить его повторный вызов, вы можете использовать любые методы, такие как планировщик Windows, для запуска wget раз в минуту. Не допускайте одновременного запуска копий с блокировкой файлов, если на их завершение потребуется более одной минуты.

Это сделает развертывание таким же простым, как копирование файла (FTP). Я даже не думаю, что вам нужно перезагрузить IIS при нажатии на C # DLL. Если вы это сделаете, вы можете написать это по SSH.

0 голосов
/ 02 февраля 2010

Чтобы упростить задачу и убедиться, что я смогу откатить все, я создал сценарий PowerShell, который выполнял следующие действия:

  1. Остановить пул приложений.
  2. Скопируйте текущее веб-приложение в «папка истории», чтобы вы могли выполнить откат к этой версии, если требуется
  3. Развертывание нового веб-приложения
  4. Остановить текущий admin.exe из услуги
  5. Удалите admin.exe, выполнение Uninstall.bat (это довольно часто для Windows Services)
  6. Скопируйте текущее приложение admin.exe в папка истории (см. 2)
  7. Скопируйте новый admin.exe в правильное местоположение и запустите install.bat
  8. Запустить новый сервис
  9. Запустить приложение Pool

Вы можете автоматизировать все это в скрипте Powershell (единственное, в чем я не уверен, это в пуле приложений, но я почти уверен, что вы можете это сделать).

Более подробную информацию о PowerShell можно найти здесь: http://arstechnica.com/business/news/2005/10/msh.ars/2

0 голосов
/ 02 февраля 2010

Как насчет того, чтобы сделать admin.exe одним щелчком мыши при развертывании. Затем в вашем файле admin.exe, прежде чем проверять целостность бизнес-правил, проверьте, доступно ли обновление. Если это так, обновите, а затем продолжите проверку.

0 голосов
/ 29 января 2010

VS Проект развертывания для веб-приложения не так прост в освоении и в некоторой степени ненадежен. Что я бы посоветовал:

  1. Измените ваш Admin.exe в службу .NET Windows. Смотри ниже, зачем тебе это нужно.
  2. Используйте sc.exe, InstallUtil.exe или службы сборки установщиков, такие как installer.codeeffects.com, чтобы быстро переустанавливать службу при каждом развертывании. Кстати, если я правильно помню, по адресу installer.codeeffects.com вы можете загрузить пример кода VS для создания службы Windows .NET, если вы новичок в службах.

Развертывание можно выполнить следующим образом (при условии, что ваши потребности в автоматизации минимальны, и вы можете развернуть их почти вручную):

Запустите любой из вышеупомянутых инструментов, чтобы сначала переустановить службу. Инструменты sc.exe и InstalUtil.exe поддерживают командную строку. Поэтому, если ваше веб-приложение, VS и служба работают на одном компьютере (ваш компьютер разработчика, я полагаю?), Вы можете щелкнуть правой кнопкой мыши веб-проект в VS, выбрать Свойства и установить команды до или после сборки в там есть вкладка Build Events. Таким образом, ваша VS может автоматически перестраивать и переустанавливать ваш сервис перед публикацией веб-приложения. Это основная причина, по которой программа exe в вашем случае не подходит, служба Windows лучше вам подойдет.

Затем разверните ваше веб-приложение (при условии, что оно было собрано, как описано выше). Здесь нет ничего сложного, просто используйте команду «Опубликовать» из своего VS или переместите все файлы вашего веб-приложения, кроме файлов .cs, / Properties / и / obj / folder. Или, если выполняется из папки проекта, просто щелкните правой кнопкой мыши главную страницу и выберите «Просмотр в браузере» - это запустит время выполнения через VS без запуска отладчика.

Извините за такой длинный пост. Правильно ли я понял ваш вопрос и разъяснения? :)

0 голосов
/ 26 января 2010

Храните на сервере / в сети самую последнюю версию проекта, которая находится в сети. Например: в файле version.txt укажите значение «2.1.0» или запросите базу данных, если у вас есть доступ.

Ваше приложение, работающее на клиентах, будет периодически читать содержимое файла version.txt, а затем сравнивать со встроенным (самостоятельным) номером версии.

  • Если обнаружен патч или второстепенный выпуск, например 2.1.123, запускается второе приложение (updater.exe), которое будет тихо
    • сделать обновление,
    • он должен загрузить обновленный (предпочтительно в архиве) проект с сервера / сети.
    • Остановите все запущенные экземпляры.
    • Распаковка содержимого.
    • Резервное копирование существующих файлов (переименование)
    • копировать / установить новую версию проекта,
    • Запустите приложение (при успешном перезапуске приложение удалит свой собственный файл резервной копии).
  • если обнаружен основной выпуск, например: 3.0.0
    • уведомляет пользователя о серьезном обновлении
    • если пользователь принимает, скачайте установщик
    • запускает полное обновление установщика

Помогает ли это?

0 голосов
/ 26 января 2010

Я бы написал приложение для командной строки, которое сделало бы все это.

Вот пример:

Site.api.publish();
admin.api.shutdown();
while(shell.status("admin.exe") == true) {}; //still running
file.replace("admin.exe", "path-to-compile\admin.exe");
shell.run("admin.exe");

Вы, наверное, поняли. Если вы хотите, чтобы это делалось автоматически, просто используйте Task Schedular, чтобы вызывать его каждый день, или как часто вы этого хотите.

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