При использовании msbuildtasks UninstallAssembly служба ставится в очередь только для удаления и требует перезапуска сервера - PullRequest
1 голос
/ 10 сентября 2010

Я настраиваю проект для запуска под сервером интеграции teamcity на Windows Server 2003 (с sp2). Интеграционные тесты выполняются с использованием msbuild с последней версией msbuildtasks v1.2.0.306. Весь код собран с .net 2.0.

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

Чтобы удалить службы, мы используем задачу UninstallAssembly, например:

<UninstallAssembly
   AssemblyFiles='..\src\FolderName\ProjectName\bin\Debug\ProjectName.exe'
   ContinueOnError='true'>
</UninstallAssembly>

Когда я смотрю на результаты сборки, запускается команда installUtil:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe / uninstall .. \ src \ FolderName \ ProjectName \ bin \ Debug \ ProjectName.exe

Затем мы переустанавливаем службу с помощью задачи InstallAssembly:

<InstallAssembly
  AssemblyFiles='..\src\FolderName\ProjectName\bin\Debug\ProjectName.exe'>
</InstallAssembly>

это часто нормально, но иногда мы получаем эту ошибку:

ошибка MSB6006: "InstallUtil.exe"

выход с кодом -1.

Я посмотрел, и служба есть, но ее нельзя запустить / остановить / и т. Д.

Если я пытаюсь удалить с помощью sc delete servicename, я получаю ошибку

[SC] DeleteService FAILED 1072:

Указанная услуга помечена для удаления.

Когда служба находится в состоянии «помечено для удаления», есть ли способ от него избавиться?

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

редактирование:

Эта проблема возникает, когда при предыдущем запуске службы не удалось запустить. например. где мы получаем ошибку:

Сервис ServiceName запускается ...

F: \ TeamCityUser \ Checkout \ ствол \ DEV \ build.xml (187, 5): не удается запустить службу ServiceName на компьютере «ИМЯ КОМПЬЮТЕРА».

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

Я все еще хотел бы знать, как удалить службу без перезагрузки.

1 Ответ

2 голосов
/ 10 сентября 2010

Как указано в примечании , вам следует остановить службу перед ее удалением. Для этого вы можете использовать задачу ServiceController, чтобы остановить службу, и ServiceQuery, чтобы убедиться, что она остановлена.

<PropertyGroup>
  <ServiceName>Service</ServiceName>
</PropertyGroup>

<Target Name="StopService">
  <ServiceController ServiceName="$(ServiceName)" Action="Stop" />

  <CallTarget Targets="WaitStop"/>
</Target>

<Target Name="WaitStop">
  <Sleep Milliseconds="1000" />

  <ServiceQuery ServiceName="$(ServiceName)">
    <Output TaskParameter="Status" PropertyName="ServiceStatus" />
  </ServiceQuery>

  <!-- If the service isn't stopped we execute WaitStop again -->
  <MSBuild Condition="'$(ServiceStatus)' != 'Stopped'"
           Projects="$(MSBuildProjectFile)"
           Targets="WaitStop"/>
</Target>

<Target Name="UninstallService" DependsOnTargets="StopService">
  <UninstallAssembly
    AssemblyFiles="..\src\FolderName\ProjectName\bin\Debug\ProjectName.exe"
    ContinueOnError="false">
  </UninstallAssembly>
</Target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...