TeamCity、nant、およびpsexecを使用して、リリースパッケージの一部としてリモートマシンでコマンドを実行します。コンソールからnantを実行するとすべて正常に動作しますが、teamcityから実行するとpsexecが50%の時間ハング(フリーズ)します。
私は多くのフォーラムを調べましたが、呼び出しの複雑さが増し、コマンドの出力とエラーコードを失うことを伴う回避策があるようです。
リモートマシンでコマンドを実行する簡単な方法を知っている人はいますか?
telnetサーバーなど、リモートマシンにアプリケーションを設定してもかまいませんが、何をすべきかについてアドバイスはありますか?
ありがとう
5 に答える
RemComとExecParseと呼ばれるカスタムMSBuildタスクの組み合わせでこの問題を解決しました。
RemComは、STDOUTで奇妙なことをしないためです(したがって、ビルドがハングします)。標準のMSBuildExecタスクは出力をキャプチャしないため、ExecParseを使用してリモートタスクの出力をキャプチャし、出力から終了コードを解析しました。出力をキャプチャする同等のNAntが機能します。
これについては、ブログ投稿「継続的インテグレーション:TeamCity、MSBuild、RemCom、およびExecParseを使用したリモートタスクの実行」で詳しく説明しています。
psexecに(nant)タイムアウトを設定し、タイムアウトが発生しなくなるまで呼び出しを繰り返すのはどうですか?
PsExecは、標準の入出力を使用していくつかのファンキーなことを行います。これをJava(TeamCityが構築されている)から呼び出すと、あらゆる種類の問題と安定性の問題が発生します。psexec-dは枯れて機能しませんでした。
TeamCityでPowershellを使用して解決しました。
次のスクリプトは、リモートサーバー上のIIS7ApplicationPoolを停止します。
[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を-dオプション(終了するのを待たないでください)とともに使用し、戻りコードをキャプチャします。-dを使用した場合の戻りコードは、リモートシステムで実行されているプロセスのプロセスIDです。次に、PSListを使用して、リモートシステムでプロセスIDが見つからなくなるまで、プロセスIDについてリモートシステムをポーリングします。
リモートマシンでTeamCityビルドエージェントをセットアップし、ローカルで操作を実行させて、「アーティファクトの依存関係」を含むバイナリを渡すとどうなりますか?