9

这个问题可能与 Azure 虚拟机无关,但我希望 Azure 提供了比 Amazon EC2 更简单的方法。

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

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

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

非常感谢您的任何建议!

4

3 回答 3

4

有许多“正确”的方法可以执行您的任务。

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

微软的方式是使用WMI——一种适用于任何远程 Windows 服务器管理的好技术。我想 WMI 应该可以满足您的目的。

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

于 2012-07-12T16:02:32.233 回答
3

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

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

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

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

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

于 2012-07-12T17:45:57.730 回答
1

你可以

  1. 构建您的源并将包内容存储在打包文件夹中
  2. 从打包文件夹中的二进制文件生成一个并上传到 Blob 存储
  3. 使用 PowerShell Remoting 将host包下拉(并解包)远程文件夹中
  4. 使用 PowerShell Remoting 根据host需要install.ps1包内容(即下载和配置)中运行。

您可以使用相同的方法来Enter-PSSession -ComputerName $env:COMPUTERNAME 快速部署本地构建策略,这意味着您对开发、生产和测试使用相同的策略,例如持续交付

您可以稍后(如有必要)进行的潜在优化是(对于本地构建)删除第 2 步和第 3 步,即假装您已经打包、上传、下载和解包,只需将打包文件夹提供给您的 install.ps1 为远程文件夹install.ps1在非远程会话中以交互方式运行。

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

如果您的代码是 xcopy 可部署的(并且是影子复制的),您甚至可以在 git 中拥有一个完整的应用程序映像,然后简单地执行 git pull 来更新您的站点(有或没有由 PowerShell Remoting 执行的第 4 步install.ps1)。

于 2013-07-25T13:11:33.787 回答