自动执行Windows服务部署的最佳方法是什么?

时间:2013-04-04 22:55:24

标签: c# msbuild windows-services build-automation

我在Visual Studio 2010中使用C#创建了一个Windows服务。我做了很多关于自动化安装过程的研究。有很多建议,但没有一个对我有用。我创建的Windows服务有很多依赖项,我希望客户端在安装过程中没有UI交互。我为此创建了一个安装项目,其中包含安装程序中的所有依赖项。

涉及的流程:

  • 为Windows服务创建构建
  • 将设置文件(.msi)推送到远程位置
  • 调用.msi并静默安装服务,无需用户交互。

到目前为止我做了什么:

  • 创建了一个PowerShell脚本以将文件推送到远程位置
  • 执行powershell脚本并安装服务

请记住powershell脚本

sc create "servicename" binpath="somepath"

用于从项目目录安装服务,而不是用于安装使用Setup Project创建的.msi文件,这是两个截然不同的东西。如果您不明白,请不要回答。

可能的解决方案:

现在我的问题是。如何将Windows服务安装程序推送到远程位置?如何创建自定义构建参数并使用msbuild扩展包或Exec Task并安装服务?

我知道对于没有使用安装项目创建的(.MSI)安装服务的人来说,这听起来很愚蠢和恼人。但是我的要求是我试图在企业环境中解决几个星期。

1 个答案:

答案 0 :(得分:18)

我会从powershell脚本中完成大部分工作。

  1. 使用您提到的msbuild Exec任务将其添加到构建过程中。这是关于using the exec task to run your powershell script的一篇非常好的文章。

  2. 由于您使用的是VS 2010,setup and deployment project非常简单。在解决方案中添加一个,并将服务项目的输出添加到其中。这是关于adding the setup project for a windows service的文章。

  3. 使用您的powershell脚本将安装程序.msi复制到远程服务器。如果您有权访问文件共享,则可以使用copy-item [source] [destination]

  4. 停止远程计算机上的服务。您可以使用(get-service -ComputerName [destination] -Name [service-name]).Stop()(来自this question

  5. 使用psexec psexec \\remotecomputer "[msi-destination-path]" /qn Here's the rest of the command line options for the .msi.

  6. 静默安装服务
  7. 使用(get-service -ComputerName [destination] -Name [service-name]).Start()

  8. 启动服务

    我还会在powershell脚本中为目标服务器,服务名称等添加一堆参数。这将使维护构建过程的这一部分变得更加容易。您的构建代理也很可能也必须是目标计算机上的管理员。

    最后,请务必将您的powershell构建脚本放在源代码管理中!

    编辑(2014年6月)
    VS 2013 has installer projects again!(对不起,VS 2012)

    此外,如果找到this awesome answer有关如何在不使用安装项目的情况下安装Windows服务的话。