わかりました、これが私がやりたいことです -
Windows サービスがあり、CI ビルドが成功するたびに、このサービスのテスト環境への展開を自動化したいと考えています。このために、次のアプローチを考えました。
- Windows サービス プロジェクトを (依存関係と共に) ビルドします。
- Windows サービスを停止する
- プロジェクトの出力を出力フォルダーから Windows サービスのファイル パスにコピーします。
- サービスを開始する
ただし、現在、Windows サービスの開始と停止に関する問題に直面しています。
これは MSBuild スニペットです -
<!-- TODO: do this using Powershell instead of normal commandline so that it can be executed on remote machines as well -->
<Exec Command="Net Stop CreditProcessing" />
<!-- Exec Command="$(PowerShellExe) -NoProfile -Noninteractive -command "&{ Stop-Service CreditProcessing }"" /-->
<!-- TODO: The destination needs to come from the env variable or rsp file? -->
<Copy
SourceFiles="@(WindowsServiceFilesToDeploy)"
DestinationFiles="@(WindowsServiceFilesToDeploy->'D:\WindowsServices\Credit Processing Service%(RecursiveDir)%(Filename)%(Extension)')" />
<Exec Command="Net Start CreditProcessing" />
<!--Exec Command="$(PowerShellExe) -NoProfile -Noninteractive -command Start-Service CreditProcessing" /-->
これは、直接のコマンド ライン コマンドと powershell コマンドの両方で試しました。
A) これは、このビルドを通常のコマンドで実行しようとしたときに直面する問題です。サービスの開始/停止に時間がかかり、ビルドが十分に待機せず、エラーが報告されて停止します。
「... サービスを開始できませんでした」。「サービスはエラーを報告しませんでした」
または時々停止するとき
「サービスは現在の状態では制御できませんでした。」
一方、サービスをすぐに確認すると、「開始」段階になり、すぐに「開始」段階になります。ビルドをもう少し忍耐強くする方法はありますか? コマンドプロンプトから直接実行した場合、コマンドはこれを行いません。
B)これは、上記のpowershellコマンドを使用した場合に直面する問題です(現在、スニペットでコメントされています)-
ビルドログでpowershellプロンプトを開くだけで、何もしません
これらの問題 (少なくとも 1 つ) を回避できますか? 正常に動作する場合は、powershell ルートの方が推奨されると思いますが、提案は受け付けています。
他のいくつかの質問 -
リモート マシン (この CI ビルドが行われている場所以外) にサービスをデプロイ (したがって、停止して再起動) したいのですが、とにかくこれを実行できますか?
サービスが既に実行されているかどうかのチェックを追加し、実行中の場合にのみ停止する方法はありますか? 停止して再度停止しようとすると、「サービスが開始されていません」というエラーが表示されます