有时,最好在单个服务器上托管和/或托管多个应用程序。我不是说这是“对”还是“错”,我只是说这是事实。
此配置的缺点是,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正在战斗。
如何配置八达通部署以等待一个部署完成才开始下一个部署?
在深入探讨答案之前,重要的是要理解为什么该信息首先出现。每次在部署目标上运行一个步骤时,触手都会创建一个“ Mutex”以防止其他项目对其进行干扰。一个早期的用例是在部署过程中更新IIS元数据库。在某些情况下,并发更新将导致随机错误。
我们已经看到互斥锁是延迟的原因。互斥锁是按步骤而不是按部署应用的。常见的情况是,八达通看上去在部署之间“跳跃”。根据并发部署的数量,这可能会减慢部署速度。自然的想法是完全禁用互斥锁。
通过添加变量OctopusBypassDeploymentMutex
并将其设置为,可以禁用互斥锁True
。该变量可以存在于特定项目或变量集中。
有关该变量作用的更多详细信息,请参见本文档。如果确实禁用互斥锁,请对其进行测试并监视是否有任何故障。在大多数情况下,我们看不到禁用互斥锁的问题,但是它有时会发生。它取决于许多其他因素,例如应用程序类型和Windows版本。
另一个选择是使用部署发布步骤来协调项目。通常,当要部署的项目属于同一应用程序套件的一部分时,这最有效。在下面的示例屏幕快照中,我有五个“部署”项目:
该项目负责Unleash the Kraken
协调那些项目的部署。
它通过使用Deploy a Release
步骤来执行此操作。首先,它启动所有基础架构,然后部署应用程序。
如果服务器托管50个不同的应用程序,则此方法将无法正常工作。
最终的选择是在每个项目的开始处包含一个步骤,该步骤会命中API,以检查针对部署目标的针对部署目标的活动版本。如果找到活动的部署,请等待直到完成。
您可以通过点击端点来做到这一点https://[YOUR URL]/api/[SPACE ID]/machines/[Machine Id]/tasks?skip=0&name=Deploy&states=Executing%2CCancelling&spaces=[SPACE ID]&includeSystem=false
。这将告诉您正在为特定计算机运行的所有活动任务。
您可以Machine Id
通过从中提取值来获得Octopus.Deployment.Machines
。您可以Space Id
通过从中提取值来获得Octopus.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
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句