MsDeploy удаленное выполнение манифеста дважды - PullRequest
10 голосов
/ 23 марта 2011

У меня есть:

  1. Создан манифест для msdeploy для:
    Остановка, удаление, копирование, установка и запуск службы Windows.
  2. Создание пакета изманифест
  3. Выполнен msdeploy для пакета на удаленном сервере.

Проблема: весь манифест выполняется дважды.

Попытка: я возился с waitInterval и waitAttempts, думая, что время истекло и начинается заново, но это не помогает.

Вопрос: Что может сделатьон выполняется дважды?

Манифест:

<sitemanifest>
  <runCommand path="net stop TestSvc"
              waitInterval="240000"
              waitAttempts="1"/>

  <runCommand 
    path="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u
       C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe"
       waitInterval="240000"
       waitAttempts="1"/>

  <dirPath path="C:\msdeploy\TestSvc\TestSvc\bin\Debug" />

  <runCommand 
    path="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe
    C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe"
    waitInterval="240000"
    waitAttempts="1"/>

  <runCommand path="net start TestSvc"
    waitInterval="240000"
    waitAttempts="1"/>

</sitemanifest>

Команда, выданная для его упаковки:

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy" 
         -verb:sync 
         -source:manifest=c:\msdeploy\custom.xml 
         -dest:package=c:\msdeploy\package.zip

Команда, выданная для его выполнения:

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy" 
         -verb:sync 
         -source:package=c:\msdeploy\package.zip 
         -dest:auto,computername=<computerNameHere>

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


Редактировать:

Я включил -verbose и нашел в журнале несколько интересных строк:

Verbose: выполнение этапа синхронизации №1.

...

Verbose: Source filePath (C: \ msdeploy \ MyTestWindowsService\ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.exe) не соответствует назначению (C: \ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.exe), отличающиеся атрибутами (lastWriteTime [11/08/2011 23:40:30)',' 11/08/2011 23:39:52 ']).Ожидание обновления.

Подробно: исходный файл filePath (C: \ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ bin \ Debug \ MyTestWindowsService.pdb) не соответствует назначению (C: \ msdeploy \ MyTestWindowsService \ MyTestWindowsService \ MyTestWindowsService.pdb) различающиеся по атрибутам (lastWriteTime ['11 / 08/2011 23:40:30 ',' 11/08/2011 23:39:52 ']).Ожидание обновления.

После этих строк файлы не копируются в первый раз, а копируются во второй раз

...

Подробно: Проверка зависимостей 'DependencyCheckInUse' не обнаружила проблем.
Подробно: Получен ответ от агента (HTTP-статус "ОК").
Подробно: на текущем этапе синхронизации отсутствует потоковое содержимое для 2 объектов.

Подробно: выполнение этапа синхронизации № 2.

...


Высокий уровень

Обычно я развертываю только что созданный пакет с более новыми битами, чем на сервере.

Во время второго прохода он дублирует все, что было сделано на первом проходе.

На проходе 1 онбудет:

  • Остановить, удалить, (удалить некоторые файлы журнала, созданные при установке службы), установить и запустить службу Windows

На этапе 2 будет:

  • Останов, удаление, Копирование файлов через , Установка и запуск службы Windows.

Понятия не имею, почему он не копирует файлы на этапе 1 или почему срабатывает этап 2.

Если я переустановлю тот же пакет вместо развертывания свежих битов, он будетВыполните все шаги на этапе 1, а не на этапе 2. Вероятно, потому что файлы имеют одинаковую отметку времени.

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

В вопросе недостаточно информации, чтобы действительно воспроизвести проблему, чтобы дать конкретный ответ ... но есть несколько вещей, которые нужно проверить / изменить / попытаться сделать эту работу:

РЕДАКТИРОВАТЬ - после добавления -verbose вывод:

Я вижу эти возможности:

  • ВремяОбе машины имеют разницу во времени (либо одна из них просто не работает, либо какая-то проблема с часовым поясом ...)
  • Файловая системаЕсли одна из файловых систем является FAT, это может привести к проблемам (разрешение метки времени ...)

EDIT 2 - согласно комментариям:

В моем последнем EDIT я писал о метке времени, потому чтоЯ подозреваю, что что-то идет не так, когда сравниваются ... это может быть, например, различие часов между двумя машинами (даже разница в 30 секунд может оказать влияние) и / или некоторые проблемы с часовым поясом ...

Я писал о файловой системе ESP.FAT, поскольку разрешение временной метки FAT составляет около 2 секунд, в то время как NTFS имеет гораздо более высокое разрешение, опять же, это может оказать влияние при сравнении временных меток ...

Из того, что вы описываете, я бы предложил следующие обходные пути:

РЕДАКТИРОВАТЬ 3 - согласно комментарию от Мерлина Моргана-Грэма результат для будущего использования:

При использовании поставщика runCommand используйте пакетные файлы.По какой-то причине это заставило его перестать проходить два прохода.

Проблема с этим решением заключается в том, что невозможно указать каталог установки службы с помощью файла SetParameters.xml (то же самое для dontUseCommandExe / preSync / postSync для SetParameters.xml).

РЕДАКТИРОВАТЬ 4 - согласно комментарию от Merlyn Morgan-Graham:

Параметры тайм-аута применяются к тому, следует ли уничтожать эту конкретную команду, а не к закрытию самой службы Windows ... в этомВ этом случае кажется, что для остановки службы Windows достаточно много времени, и, таким образом, выполняются только runCommand без копирования / синхронизации и запускается новая попытка для всего запуска ...

0 голосов
/ 11 марта 2015

У меня была такая же проблема, но я не делаю файл package.zip.Я выполняю синхронизацию непосредственно за один шаг.Решение preSync / postSync мне очень помогло, и нет необходимости использовать файлы манифеста.Вы можете попробовать следующую команду в вашем случае:

"C:\Program Files\IIS\Microsoft Web Deploy V2\msdeploy"  
-verb:sync 
-preSync:runCommand="net stop TestSv && C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u
       C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe",waitInterval=240000,waitAttempts=1 
-source:dirPath="C:\msdeploy\TestSvc\TestSvc\bin\Debug"
-dest:auto,computername=<computerNameHere>
-postSync:runCommand="C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe
    C:\msdeploy\TestSvc\TestSvc\bin\Debug\TestSvc.exe && net start TestSvc",waitInterval=240000,waitAttempts=1

"- verb: sync" параметр означает, что вы синхронизируете данные между источником и местом назначения.В вашем случае в первый раз вы выполняете синхронизацию между папкой «C: \ msdeploy \ TestSvc \ TestSvc \ bin \ Debug» и «package.zip».Кроме того, вы используете файл манифеста, поэтому, когда вы выполняете вторую синхронизацию между «package.zip» и целевым «computername», msbuild использует ранее предоставленный манифест дважды для места назначения и для источника, поэтому каждая операция манифеста выполняется дважды.Я использовал трюк && для выполнения нескольких команд в одной командной строке.Кроме того, в моем случае мне пришлось добавить операцию тайм-аута, чтобы убедиться, что служба полностью остановлена ​​(«ping -n 30 127.0.0.1> nul»).

...