如何告诉 Octopus Deploy 等到同一台机器上的另一个部署完成?

How to tell Octopus Deploy to wait until another deployment finishes on the same machine?

有时 and/or 需要在一台服务器上托管数十个应用程序。不是说这是 "right" 或 "wrong," 我只是说它发生了。

此配置的一个缺点是,只要对同一台机器的多个部署 运行,就会出现错误消息 Waiting for the script in task [TASK ID] to finish as this script requires that no other Octopus scripts are executing on this target at the same time。好像Octopus Deploy自己打架了。

如何配置 Octopus Deploy 以等待一个部署完全完成后再开始下一个部署?

在深入研究答案之前,首先要了解为什么会出现该消息,这一点很重要。每次部署目标上的步骤 运行 时,触手都会创建一个 "Mutex" 以防止其他项目干扰它。一个早期的用例是在部署期间更新 IIS 元数据库。在某些情况下,并发更新会导致随机错误。

选项 1:禁用互斥体

我们已经看到互斥体是延迟原因的案例。互斥量是按步骤应用的,而不是按部署应用的。经常会看到 Octopus 在部署之间 "jumping" 的情况。根据并发部署的数量,这可能会减慢部署速度。自然的想法是完全禁用互斥锁。

可以通过添加变量 OctopusBypassDeploymentMutex 并将其设置为 True 来禁用互斥锁。该变量可以存在于特定项目或变量集中。

有关该变量作用的更多详细信息,请参见此 document。如果您确实禁用互斥锁,请对其进行测试并监控是否有任何故障。在大多数情况下,我们没有看到禁用互斥锁的问题,但它时常发生。它取决于许多其他因素,例如应用程序类型和 Windows 版本。

选项 2:利用部署发布步骤

另一种选择是使用 deploy a release step 协调项目。通常,当部署的项目是同一应用程序套件的一部分时,这种方法效果最好。在下面的示例屏幕截图中,我有五个 "deployment" 个项目:

  • Azure Worker IaC
  • 数据库工作者 IaC
  • Kubernetes Worker IaC
  • 脚本工作者 IaC
  • OctoStudy

项目 Unleash the Kraken 协调这些项目的部署。

它通过使用 Deploy a Release 步骤来完成此操作。首先启动所有基础架构,然后部署应用程序。

如果服务器托管 50 个不同的应用程序,这将无法正常工作。

选项 3:利用 API 检查 运行ning 部署

最后一个选项是在每个项目开始时包含一个步骤,该步骤点击 API 以检查部署目标的活动发布。如果找到活动部署,则等待它完成。

您可以通过点击端点 https://[YOUR URL]/api/[SPACE ID]/machines/[Machine Id]/tasks?skip=0&name=Deploy&states=Executing%2CCancelling&spaces=[SPACE ID]&includeSystem=false 来完成此操作。这将告诉您特定机器的所有活动任务 运行。

您可以通过从Octopus.Deployment.Machines 中提取值来获得Machine Id。您可以通过从 Octopus.Space.Id 中提取值来获得 Space Id

此方法的伪代码可能如下所示(我不包括实际代码,因为您的要求可能非常不同)。

activeDeployments = true

while (activeDeployments)
{
      activeDeployments = false
      foreach(machineId in Octopus.Deployment.Machines)
      {
             activeTasks = https://[YOUR URL]/api/[Octopus.Space.Id]/machines/[Machine Id]/tasks?skip=0&name=Deploy&states=Executing%2CCancelling&spaces=[Octopus.Space.Id]&includeSystem=false

             if (activeTasks.Count > 0)
             {
                      activeDeployments = true
             }
      }

      if (activeDeployments = true)
      {
            Sleep for 5 seconds
      }
}

我收到此消息是因为我达到了八达通服务器上的任务上限。

在 Octopus\Configuration\Nodes 中,将任务上限更改为 1 以一次部署 1 个,即使代理位于不同的服务器上也是如此。消息会一直显示

或者只是增加此值以防止消息出现。