Запуск программы на удаленном компьютере в рамках непрерывной интеграции
Вопрос
Мы используем TeamCity, nant и psexec для запуска команды на удаленной машине в составе пакета выпуска. Все работает нормально, когда я запускаю nant из консоли, но при запуске из teamcity psexec зависает (зависает) в 50% случаев.
Я просмотрел много форумов, и, кажется, есть обходные пути, которые увеличивают сложность вызова и включают потерю вывода и кода ошибки команды.
Кто-нибудь знает более простой способ выполнить команду на удаленной машине?
Я не против установки какого-либо приложения на удаленной машине, например, сервера telnet, каких-либо советов о том, что делать?
Благодаря
Решение
Я решил эту проблему с помощью комбинации RemCom и пользовательской задачи MSBuild под названием ExecParse.
RemCom, потому что он не делает странных вещей со STDOUT (таким образом, вешает сборку). Мы использовали и ExecParse для захвата выходных данных удаленной задачи и анализа кода выхода из выходных данных, поскольку стандартная задача MSBuild Exec не захватывает выходные данные. Некоторый эквивалент NAnt, который захватывает выходные данные, будет работать.
Я подробно рассказал об этом в своем блоге: " Непрерывная интеграция: выполнение удаленных задач с TeamCity, MSBuild, RemCom и ExecParse "
Другие советы
PsExec делает некоторые забавные вещи со стандартным вводом / выводом, и вызов этого из Java (на котором построен TeamCity) поднимает всевозможные проблемы и проблемы со стабильностью. psexec -d не работал с.
Я решил это с помощью Powershell в Team City. Р>
Приведенный ниже скрипт останавливает IIS 7 ApplicationPool на удаленном сервере:
[string]$HostName = "myWebServer"
[string]$Cmd = "C:\Windows\System32\inetsrv\appcmd.exe stop apppool MyMainAppPool”
Invoke-WmiMethod -class Win32_process -name Create -ArgumentList ($Cmd) -ComputerName $HostName
Подробнее об этом в моем блоге: http://blog.degree.no/2012/03/executing-commands-and-programs-on-a-remote-machine-using-powershell/ р>
Как насчет установки (nant) тайм-аута в psexec и повторения вызова до тех пор, пока не произойдет тайм-аут?
Я использую PSExec с параметром -d (не дожидаясь его завершения) и фиксирую код возврата. Код возврата при использовании -d - это идентификатор процесса, запущенного в удаленной системе. затем я использую PSList для опроса удаленной системы на предмет идентификатора процесса, пока не найду его в удаленной системе.
Что произойдет, если вы настроите агент сборки TeamCity на удаленном компьютере и позволите ему выполнить операцию локально, передав двоичные файлы с " зависимостями артефактов??