有时首选和/或需要在单个服务器上托管数十个应用程序。不是说这是“对”或“错”,我只是说它发生了。
此配置的缺点是出现错误消息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
来禁用互斥锁。该变量可以存在于特定项目或变量集中。
有关该变量作用的更多详细信息,请参见 document .如果您确实禁用互斥锁,请对其进行测试并监控是否有任何故障。在大多数情况下,我们没有看到禁用互斥锁的问题,但它时常发生。它取决于许多其他因素,例如应用程序类型和 Windows 版本。
选项 2:利用部署发布步骤
另一种选择是使用 deploy a release step 协调项目.通常,当部署的项目是同一应用程序套件的一部分时,这种方法效果最好。在下面的示例屏幕截图中,我有五个“部署”项目:
- Azure Worker IaC
- 数据库 worker IaC
- Kubernetes Worker IaC
- 脚本 worker 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=[空间 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/