在深入了解答案之前,首先要了解为什么会出现该消息,这一点很重要。每次在部署目标上运行一个步骤时,触手都会创建一个“互斥锁”以防止其他项目对其进行干扰。一个早期的用例是在部署期间更新 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
}
}