作为发布包的一部分,我们使用 TeamCity、nant 和 psexec 在远程机器上运行命令。当我从控制台运行 nant 时,一切正常,但从 teamcity psexec 运行时,50% 的时间会挂起(冻结)。
我浏览了许多论坛,似乎有一些变通方法会增加调用的复杂性并涉及丢失命令的输出和错误代码。
有谁知道在远程机器上运行命令的更简单方法?
我不介意在远程机器上设置一些应用程序,比如 telnet 服务器,有什么建议吗?
谢谢
5 回答
我通过结合使用 RemCom 和一个名为 ExecParse 的自定义 MSBuild 任务解决了这个问题。
RemCom,因为它不会对 STDOUT 做奇怪的事情(因此挂起构建)。我们使用和 ExecParse 来捕获远程任务的输出,并从输出中解析 Exit Code,因为标准的 MSBuild Exec 任务不会捕获输出。一些捕获输出的 NAnt 等效项会起作用。
我在博客文章中对此进行了详细说明:“持续集成:使用 TeamCity、MSBuild、RemCom 和 ExecParse 执行远程任务”
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/
如何在 psexec 上设置(nant)超时并重复调用直到没有超时发生?
如果您在远程机器上设置 TeamCity 构建代理并让它在本地执行操作,将带有“工件依赖项”的二进制文件传递给它,会发生什么?
我将 PSExec 与 -d 选项一起使用(不要等待它完成)并捕获返回码。使用 -d 时的返回码是远程系统上运行的进程的进程 ID。然后我使用 PSList 轮询远程系统以获取进程 ID,直到我不再在远程系统上找到它。