2

好的,这就是我想做的-

我们有一个 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 提示符,然后什么也不做 在 powershell 处构建停止不会继续

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

还有几个问题——

  • 我们想在远程机器上部署服务(因此停止并重新启动)(除了这个 CI 构建发生的地方)——无论如何这可以做到吗?

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

4

2 回答 2

1

为什么不使用具有本机远程功能的sc.exe呢?

于 2012-12-19T11:23:38.763 回答
1

您的启动命令采用以下形式:

path\to\powershell.exe
-arg1 -arg2

换行意味着 PowerShell 从不接收参数,因此不知道它必须执行Start-Service命令,也不知道您不希望它是交互式的。它可能只是在等你告诉它该做什么。

检查您的 $(PowerShell) 变量,因为它的末尾可能有一个换行符。

于 2012-12-19T11:54:28.033 回答