【问题标题】:How to deploy a distributed system across multiple servers in parallel using VSTS release process如何使用 VSTS 发布流程跨多个服务器并行部署分布式系统
【发布时间】:2026-02-16 16:35:01
【问题描述】:

这是我的场景,我在 Visual Studio 中有一个在线任务组列表,其中包含 MachineName(目标服务器)的参数:

Task1
Task2
Task3
Task4

还有一组服务器:

SVR1
SVR2
SVR3
SVR4

目前,我有一个有效的部署管道(所有在同一个代理上使用 [None] Parallelism 选项):

Task1(SVR1)
Task1(SVR2)
Task1(SVR3)
Task1(SVR4)

Task2(SVR1)
Task2(SVR2)
Task2(SVR3)
Task2(SVR4)
etc...

这些任务必须按特定顺序执行,并且在所有服务器都接收到前一个任务之前,任何服务器都不应启动任何任务。然而,当前的部署过程并不是特别可扩展的。我们每增加一个节点,就会增加大约 1 分 20 秒的部署时间。

我想做的是:

Execute Task1 on all servers (Wait until all are complete)
Execute Task2 on all servers (Wait until all are complete)
Execute Task3 on all servers (Wait until all are complete)
etc.. you get the picture.

我目前在网上没有找到一个正是我需要的示例,而且我在使用 VSTS 进行并行部署方面没有太多经验。

有没有简单的方法来做到这一点?我是否需要运行多个代理才能使其正常工作,还是可以在同一个代理上运行多个并行任务?

提前致谢

【问题讨论】:

  • 你能解释一下为什么要在所有服务器上执行task1然后执行task2等的原因吗?既然部署在不同的服务器上,是不是应该分别部署到服务器上(比如在SVR1上执行task1,在SVR2上不执行task1,那么在SVR1上执行task2就不用等待了)?
  • @MarinaLiu-MSFT - 这是一个运行在多个节点上的分布式奥尔良应用程序。 Task1 是“停止所有服务”。 Task2 然后是“卸载所有旧服务”。 Task3 - '将新文件复制到服务器' Task4 - '安装所有新服务'。这就是为什么我们要按顺序执行它们。
  • 我对奥尔良不熟悉。但是如果你真的想将这四个任务依次部署到不同的服务器上,你应该在你的发布定义中添加 16 个任务。

标签: deployment parallel-processing azure-devops azure-pipelines-release-pipeline


【解决方案1】:

您可以为每个任务组(task1、task2 等)添加多个代理阶段:

  1. 添加一个变量来存储服务器(例如名称:servers;值:SVR1,SVR2,SVR3,SVR4
  2. 为每个任务组(task1、task2 等)添加多个代理阶段
  3. 为每个代理阶段配置执行计划(选择一个阶段>检查多配置选项>在Multipliers输入框中指定servers(step1变量)
  4. 那么就可以从task中的servers变量中获取一个服务器

另一方面,您可以在同一台机器和池中配置多个代理,然后在每个阶段的最大代理数量输入框中指定代理数量,以减少构建/发布时间。

【讨论】:

  • 好的 - 我有一个任务组,它采用以下参数:远程计算机、用户名、密码。因为任务组运行一个 powershell 脚本。是否可以将服务器/远程计算机名称从代理阶段乘数“传递”到并行任务组中。
  • 我的任务组:i.imgur.com/nr2jsxk.png。我的代理阶段:i.imgur.com/OIHZjUL.png。我的变量:i.imgur.com/fRPpQCo.png。如何在代理阶段指定一组乘数,我希望它通过在任务组中填充不同值的“远程计算机”参数来并行运行。
  • @Seb 1. 使用 SVR1、SVR2、SVR3、SVR4 值指定 services 变量 2. 在乘数中指定“服务” 3. 在 RemoteComputer 框中指定 $(services)。代理池必须有多个代理才能并行运行乘法器。
  • 太棒了,现在全部完成并并行运行!谢谢!
【解决方案2】:

由于您只有一个管道,因此任务将串行执行而不是并发执行。

如果你想在不同的服务器之间同时部署一个任务,你应该购买额外的管道。

【讨论】:

  • 您好,抱歉,我想我用错了。我有一个管道,有 1 个代理阶段和 42 个任务。问题是这会按顺序(串行)执行它们。我想要做的是 make = 代理阶段在所有服务器上执行任务 1,代理阶段在所有服务器上执行任务 2。但我想在这两者之间等待。这可以通过乘数和变量实现吗?
  • 您可以使用乘数,但它的工作方式与您当前的情况相似,因为您只有一个管道,因此所有任务都是串行执行的。比如task1不会在不同服务器之间并发执行。