継続的インテグレーションの一部としてリモートマシンでプログラムを実行する
質問
TeamCity、nant、psexecを使用して、リリースパッケージの一部としてリモートマシンでコマンドを実行します。コンソールからnantを実行するとすべてが正常に動作しますが、teamcityから実行するとpsexecが50%の割合でハング(フリーズ)します。
私は多くのフォーラムに目を通しましたが、コールの複雑さを増し、コマンドの出力とエラーコードを失うことを伴う回避策があるようです。
リモートマシンでコマンドを実行する簡単な方法を知っている人はいますか?
telnetサーバーなど、リモートマシンにアプリケーションをセットアップするのはどうでもいいのですが、何をすべきかアドバイスはありますか?
ありがとう
解決
RemComとExecParseと呼ばれるカスタムMSBuildタスクを組み合わせてこの問題を解決しました。
RemCom。STDOUTで奇妙なことをしません(したがって、ビルドがハングします)。標準のMSBuild Execタスクは出力をキャプチャしないため、ExecParseを使用して、リモートタスクの出力をキャプチャし、出力から終了コードを解析しました。出力をキャプチャするいくつかの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)タイムアウトを設定し、タイムアウトが発生しなくなるまで呼び出しを繰り返すのはどうですか?
-dオプションを指定してPSExecを使用し(終了するのを待たずに)、リターンコードをキャプチャします。 -dを使用した場合の戻りコードは、リモートシステムで実行されているプロセスのプロセスIDです。次に、PSListを使用して、リモートシステム上でプロセスIDが見つからなくなるまで、プロセスIDについてリモートシステムをポーリングします。
リモートマシンでTeamCityビルドエージェントをセットアップし、ローカルで操作を実行させ、「Artifact Dependencies」でバイナリを渡すとどうなりますか?