【问题标题】:How to tell Octopus Deploy to wait until another deployment finishes on the same machine?如何告诉 Octopus Deploy 等到同一台机器上的另一个部署完成?
【发布时间】:2020-02-19 15:33:40
【问题描述】:

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

此配置的一个缺点是,只要在同一台机器上运行多个部署,就会出现错误消息 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 配置为等待一个部署完全完成后再开始下一个部署?

【问题讨论】:

    标签: octopus-deploy


    【解决方案1】:

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

    选项 1:禁用互斥锁

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

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

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

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

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

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

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

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

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

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

    最后一个选项是在每个项目开始时包含一个步骤,该步骤会命中 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
          }
    }
    

    【讨论】:

      【解决方案2】:

      我收到这条消息是因为我点击了章鱼服务器上的任务上限。

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

      或者只是增加这个值来防止消息发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-19
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多