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

标签 octopus-deploy

有时首选和/或需要在单个服务器上托管数十个应用程序。不是说这是“对”或“错”,我只是说它发生了。

此配置的缺点是出现错误消息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 same time每当对同一台机器的多个部署正在运行时。似乎 Octopus Deploy 正在 self 斗争。

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

最佳答案

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

选项 1:禁用互斥锁

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

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

By Passing The Tentacle Mutex

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

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

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

  • Azure Worker IaC
  • 数据库 worker IaC
  • Kubernetes Worker IaC
  • 脚本 worker IaC
  • OctoStudy

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

Unleash the Kraken

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

Deploy a Release Step

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

选项 3:利用 API 检查正在运行的部署

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

您可以通过点击端点https://[YOUR URL]/api/[SPACE ID]/machines/[Machine Id]/tasks?skip=0&name=Deploy&states=Executing%2CCancelling&spaces=[空间 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-deploy - 如何告诉 Octopus Deploy 等到同一台机器上的另一个部署完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303864/

相关文章:

continuous-integration - 将 Octopack nuget 版本号更改为 teamcity 的内部版本号

octopus-deploy - 在八达通服务器上拉取但不部署 nuget 包

testing - 如何在 Octopus Deploy 中测试部署

powershell - 使用 PowerShell 添加到 IIS 的绑定(bind)而不覆盖现有绑定(bind)

ssl - 使用 Octopus 在 iis 上为每个站点部署单独的证书

c# - 如何从 nuget 包中排除子目录和内容

powershell - 为什么我通过 Chef 获得以管理员身份运行 Octopus Tentacle 的 UnauthorizedAccessException?

asp.net-core - 有没有办法使用 NuGet 或其他方式打包 ASP.NET Core 应用程序?

msbuild - 无法为指定的 URI 添加部分,因为它已在包中

azure-web-app-service - 无法加载 System.IdentityModel.Tokens.Jwt