(重新)部署代码/ bin文件到(多个)Windows Azure虚拟机的方法

时间:2012-07-12 15:16:02

标签: c# azure deployment virtual-machine azure-configuration

此问题可能与Azure虚拟机无关,但我希望Azure提供的方式比Amazon EC2更容易。

我在多个Azure虚拟机上运行长时间运行的应用程序(即不是Azure网站或[Paas]角色)。它们是简单的控制台应用程序/ Windows服务。有时,我会进行代码刷新,需要停止这些过程更新代码/二进制文件,然后重新启动这些过程

过去,我曾尝试使用PSTools( psexec )来远程执行此操作,但这似乎是一种黑客攻击。有没有更好的方法来远程终止应用程序,刷新部署并重新启动应用程序?

理想情况下,Visual Studio中会有一个“发布控制台应用程序”等同于允许我将代码部署为Azure网站,但我猜这不是可能的。

非常感谢任何建议!

3 个答案:

答案 0 :(得分:4)

有许多“正确”的方法可以完成你的任务。

如果您运行的是Windows Azure应用程序 - MSDN上有一个简单的指南。 但是,如果你必须使用常规控制台应用程序 - 你有问题。

Microsoft方式是使用WMI - 适用于任何类型的远程Windows服务器管理的好技术。我想WMI应该适合你的目的。

最后一种方法:在每个Azure VM上安装Git并编写简单的服务器端脚本,计划每5分钟运行一次,以便从存储库更新代码,构建它,终止旧进程并启动新进程。将更新发布到存储库,这就是全部。 绝对是破解,但它甚至适用于非Windows机器。

答案 1 :(得分:3)

一种常见模式是在Windows Azure Blob存储中存储项目,例如命令行应用程序。我经常这样做(例如:我将所有MongoDB二进制文件存储在blob中,压缩,每个版本使用一个zip#)。在VM启动时,我有一个任务,将zip从blob下载到本地磁盘,解压缩到本地文件夹,并启动mongod.exe进程(这同样适用于其他控制台应用程序)。如果安装更复杂,则需要使用MSI或其他类型的自动安装程序。关于在blob存储中存储这些应用程序的两个好处:

  • 减少部署包大小
  • 不再需要重新部署整个云应用程序只是为了更改它的一个组件

更新控制台应用时:您可以将新版本上传到blob存储。现在,您有几种方法可以通知我的VM进行更新。例如:

  • 修改我的配置文件(也许我有一个键/值对,指的是我的应用名称+版本号)。当这改变时,我可以在我的web / worker角色中处理事件,允许我的代码采取适当的行动。此操作可能是停止exe,从blob中获取新的,然后重新启动。或者......如果它比这更复杂,我甚至可以让VM实例自行重启,清除内存/临时文件/等。并干净地开始一切。
  • 发送自己某种类型的命令来更新应用程序。我可能会使用Service Bus队列来执行此操作,因为我可以在“软件更新”主题上拥有多个订阅者。每个实例都可以订阅队列,并在显示更新消息时,相应地处理它(可能该消息包含应用程序名称和版本号,如配置中的键/值对)。我也可以使用Windows Azure存储队列,但是我可能每个实例需要一个队列(我不喜欢这个)。
  • 创建我的角色实例侦听的某种类型的wcf服务,以便更新命令。与Windows Azure队列相同的问题:要求我找到一种方法将相同的消息推送到我的web / worker角色的每个实例。

这些都适用于独立的exe(或xcopy-deployable exe)。对于需要管理员级权限的MSI,这些需要通过启动脚本运行。在这种情况下,您可以进行配置更改事件,该事件将由您的角色实例处理(如上所述),但您只需重新启动实例,允许它们通过启动脚本运行MSI。

答案 2 :(得分:1)

你可以

  1. 构建您的源并将包内容存储在打包文件夹中
  2. 打包文件夹中的二进制文件生成并上传到Blob存储
  3. 使用PowerShell远程处理host下拉(并解压缩)到远程文件夹
  4. 根据需要,使用PowerShell远程处理host包内容运行install.ps1(即下载和配置)。
  5. 可以使用Enter-PSSession -ComputerName $env:COMPUTERNAME同样的方法来快速部署本地构建策略,这意味着您正在使用相同的策略来开发,生成并测试la Continuous Delivery

    您可以在以后执行的潜在优化(如果需要)是(对于本地版本)来删除步骤2和3,即假装您已打包,上传,下载和解压缩,只需提供打包文件夹远程文件夹的形式安装到install.ps1,并在非远程会话中以交互方式运行install.ps1

    上述主题的一个常见变体是使用高效的文件传输和版本控制机制,如git(或(shudder)TFS!),以实现“在构建结束时推送到某处”和“在部署开始时拉动”练习的一部分(Azure网站提供了内置的TFS或git端点,这使得每个'push'隐含地在远端包含'pull')。

    如果您的代码是xcopy deployable(并且复制了影子),您甚至可以在git中拥有一个完整的应用程序映像,只需执行git pull来更新您的站点(有或没有包含PowerShell Remoting执行的第4步) install.ps1)。