Executar um programa em uma máquina remota como parte de integração contínua
Pergunta
Nós usamos TeamCity, nant e psexec para executar um comando em uma máquina remota como parte da embalagem liberação. Tudo funciona bem quando eu executar o nant a partir do console, mas quando executado a partir de trava TeamCity psexec (congela) 50% das vezes.
Eu olhei através de muitos fóruns e parece haver soluções que aumentam a complexidade da chamada e envolvem perder a saída eo código de erro do comando.
Alguém sabe uma maneira mais fácil para executar um comando em uma máquina remota?
Eu não me importo a criação de algum aplicativo na máquina remota, como um servidor telnet, qualquer conselhos sobre o que fazer?
Graças
Solução
Eu ter resolvido esta questão com uma combinação de RemCom e uma tarefa MSBuild personalizado chamado ExecParse.
RemCom, porque ele não faz coisas estranhas com STDOUT (pendurado, assim, a compilação). Nós usamos, e ExecParse para capturar a saída da tarefa remoto e analisar o código de saída a partir da saída, porque a tarefa padrão MSBuild Exec não capturar a saída. Alguns NAnt equivalente que captura a saída iria funcionar.
Eu detalhou isso em um post no blog: "Integração contínua: Executar tarefas remotas com TeamCity, MSBuild, RemCom e ExecParse"
Outras dicas
PsExec faz algumas coisas funky com a entrada / saída padrão, e invocando este de Java (que TeamCity é construído sobre) levanta todos os tipos de problemas e questões de estabilidade. psexec -d não funcionou murchar.
Eu resolvi-lo usando Powershell no Team City.
O script abaixo pára um IIS 7 ApplicationPool em um servidor remoto:
[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
Mais sobre isso no meu blog: http://blog.degree.no/2012/03/executing-commands-and-programs-on-a-remote-machine-using-powershell/
Que tal colocar um (nant) time-out no psexec e repetir a chamada até que nenhum tempo limite acontece?
Eu uso PSExec com a opção -d (não espere que ela termine) e capturar o código de retorno. O código de retorno quando você usou -d é o ID do processo do processo em execução no sistema remoto. então eu uso pslist para consultar o sistema remoto para o ID do processo até que eu não encontrá-lo no sistema remoto por mais tempo.
O que acontece se você configurar agente TeamCity Desenvolver a máquina remota e deixá-lo executar a operação localmente, passando-os binários com "Artefato Dependências"?