作为持续集成的一部分在远程计算机上运行程序

时间:2009-10-22 07:02:24

标签: nant teamcity psexec

我们使用TeamCity,nant和psexec作为发布包装的一部分在远程计算机上运行命令。当我从控制台运行nant时,一切正常,但是当从teamcity运行时,psexec会在50%的时间内挂起(冻结)。
我查看了很多论坛,似乎有一些变通方法可以增加调用的复杂性,并且会失去输出和命令的错误代码。
有没有人知道在远程机器上运行命令的更简单方法?
我不介意在远程机器上设置一些应用程序,比如telnet服务器,有关如何做的任何建议? 感谢

5 个答案:

答案 0 :(得分:3)

我已经通过RemCom和一个名为ExecParse的自定义MSBuild任务的组合解决了这个问题。

RemCom,因为它不会对STDOUT做出奇怪的事情(因此挂起了构建版本)。我们使用和ExecParse来捕获远程任务的输出,并从输出中解析Exit Code,因为标准的MSBuild Exec任务不捕获输出。捕获输出的一些NAnt等效物将起作用。

我在博文中详细说明了这一点:"Continuous Integration: Executing Remote Tasks with TeamCity, MSBuild, RemCom, and ExecParse"

答案 1 :(得分:1)

如何在psexec上暂停(nant)超时并重复通话直到没有超时?

此致

Sebastiaan

答案 2 :(得分:1)

PsExec使用标准输入/输出做了一些时髦的事情,从Java(TeamCity构建的)调用它会引发各种问题和稳定性问题。 psexec -d没有工作枯萎。

我在Team City中使用Powershell解决了这个问题。

下面的脚本会停止远程服务器上的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/

答案 3 :(得分:0)

我使用带有-d选项的PSExec(不要等待它完成)并捕获返回码。使用-d时的返回码是远程系统上运行的进程的进程ID。然后我使用PSList轮询远程系统的进程ID,直到我再也找不到远程系统。

答案 4 :(得分:0)

如果您在远程计算机上设置TeamCity构建代理并让它在本地执行操作,并使用" Artifact Dependencies"?

传递二进制文件,会发生什么?