MSBuild - 构建后自动部署Windows服务

时间:2012-12-19 11:08:35

标签: powershell msbuild windows-services continuous-integration

好的,这就是我想要做的事情 -

我们有一个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 &quot;&amp;{ Stop-Service CreditProcessing }&quot;" /-->

<!-- 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提示符,然后什么都不做 Build stops at powershell doesn't continue

你能帮助避免这些问题(至少其中一个)吗?如果它工作正常,我认为powershell路线更受推荐,但我愿意接受建议。

其他几个问题 -

  • 我们希望在远程计算机上部署服务(因此停止并重新启动)(除此CI构建发生的地方除外) - 无论如何这可以完成吗?

  • 有没有办法添加检查服务是否已经在运行并且仅在服务正在运行时停止?如果停止并且我们再次尝试停止,则会显示“服务未启动”错误

2 个答案:

答案 0 :(得分:1)

为什么不使用具有原生远程功能的sc.exe

答案 1 :(得分:1)

您的启动命令是以下形式:

path\to\powershell.exe
-arg1 -arg2

换行意味着PowerShell永远不会收到参数,因此不知道它必须执行Start-Service命令,并且不知道您不希望它是交互式的。它可能只是等着你告诉它该怎么做。

检查$(PowerShell)变量,因为它最后可能有换行符。