Прежде чем погрузиться в ответ, важно понять, почему это сообщение появляется в первую очередь. Каждый раз, когда на цели развертывания выполняется шаг, щупальце будет создавать «Mutex», чтобы другие проекты не мешали ему. Одним из первых вариантов использования этого было обновление метабазы IIS во время развертывания. В некоторых случаях одновременные обновления могут привести к случайным ошибкам.
Вариант 1. Отключение мьютекса
Мы видели случаи, когда мьютекс был причиной задержки. Мьютекс применяется за шаг, а не за развертывание. Часто встречается ситуация, когда Octopus «прыгает» между развертываниями. В зависимости от количества одновременных развертываний это может замедлить развертывание. Естественная мысль состоит в том, чтобы полностью отключить мьютекс.
Можно отключить мьютекс, добавив переменную OctopusBypassDeploymentMutex
и установив ее в True
. Эта переменная может существовать либо в конкретном проекте c, либо в наборе переменных.
Более подробную информацию о том, что делает эта переменная, можно найти в это документ . Если вы отключили мьютекс, пожалуйста, проверьте его и следите за любыми сбоями. По большей части мы не видим проблем с отключением мьютекса, но это происходило время от времени. Это зависит от множества других факторов, таких как тип приложения и Windows версия.
Вариант 2. Использование этапа развертывания релиза
Другой вариант - координировать проекты с помощью развертывания этапа релиза . Обычно это работает лучше всего, когда развертываемые проекты являются частью одного и того же набора приложений. В приведенном ниже примере экрана у меня есть пять проектов развертывания:
- Azure Worker Ia C
- Database Worker Ia C
- Kubernetes Worker Ia C
- Script Worker Ia C
- 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
. Это скажет вам все активные задачи, выполняемые для определенного компьютера c.
Вы можете получить 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
}
}