Как заставить Octopus Deploy ждать, пока не завершится другое развертывание на той же машине? - PullRequest
0 голосов
/ 19 февраля 2020

Иногда предпочтительно и / или необходимо разместить десятки приложений на одном сервере. Не говоря, что это «правильно» или «неправильно», я лишь говорю, что это происходит.

Недостатком этой конфигурации является сообщение об ошибке 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 так, чтобы ждать, пока одно развертывание полностью завершится sh, прежде чем начнется следующее?

1 Ответ

1 голос
/ 19 февраля 2020

Прежде чем погрузиться в ответ, важно понять, почему это сообщение появляется в первую очередь. Каждый раз, когда на цели развертывания выполняется шаг, щупальце будет создавать «Mutex», чтобы другие проекты не мешали ему. Одним из первых вариантов использования этого было обновление метабазы ​​IIS во время развертывания. В некоторых случаях одновременные обновления могут привести к случайным ошибкам.

Вариант 1. Отключение мьютекса

Мы видели случаи, когда мьютекс был причиной задержки. Мьютекс применяется за шаг, а не за развертывание. Часто встречается ситуация, когда Octopus «прыгает» между развертываниями. В зависимости от количества одновременных развертываний это может замедлить развертывание. Естественная мысль состоит в том, чтобы полностью отключить мьютекс.

Можно отключить мьютекс, добавив переменную OctopusBypassDeploymentMutex и установив ее в True. Эта переменная может существовать либо в конкретном проекте c, либо в наборе переменных.

By Passing The Tentacle Mutex

Более подробную информацию о том, что делает эта переменная, можно найти в это документ . Если вы отключили мьютекс, пожалуйста, проверьте его и следите за любыми сбоями. По большей части мы не видим проблем с отключением мьютекса, но это происходило время от времени. Это зависит от множества других факторов, таких как тип приложения и Windows версия.

Вариант 2. Использование этапа развертывания релиза

Другой вариант - координировать проекты с помощью развертывания этапа релиза . Обычно это работает лучше всего, когда развертываемые проекты являются частью одного и того же набора приложений. В приведенном ниже примере экрана у меня есть пять проектов развертывания:

  • Azure Worker Ia C
  • Database Worker Ia C
  • Kubernetes Worker Ia C
  • Script Worker Ia C
  • OctoStudy

Проект Unleash the Kraken координирует развертывания для этих проектов.

Unleash the Kraken

Это выполняется с помощью шага Deploy a Release. Сначала он раскручивает всю инфраструктуру, затем развертывает приложение.

Deploy a Release Step

Это не будет работать, если на сервере размещено 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
      }
}
...