Мы используем Release Management 2015 с шаблонами выпуска vNext. У нас есть развертывание компонентов на основе Powershell DSC для каждой из частей нашего приложения, и на самом деле у нас есть два различных приложения, которые развернуты и которые находятся в активной разработке и часто развертываются почти в одно и то же время.
Мы очень часто получаем следующую ошибку при развертывании:
OperationFailedException: новое развертывание не допускается по мере развертывания другого развертывания. Повторно повторите развертывание через некоторое время.
Полная трассировка стека показывает, что ошибка исходит не от самой Powershell, а из системы управления релизами, которая отвечает за выполнение powershell script на целевой машине:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Microsoft.TeamFoundation.Release.Common.Helpers.OperationFailedException: New deployment is not allowed as an another deployment is in progress. Retry the deployment after sometime.
at Microsoft.TeamFoundation.Release.EnvironmentProvider.OnPrem.Implementation.OnPremDeploymentProvider.ReadDeploymentResponse(DeploymentResponse response)
at Microsoft.TeamFoundation.Release.EnvironmentProvider.OnPrem.Implementation.OnPremDeploymentProvider.RunScript(String scriptPath, String configurationPath, MachineSpecification machine, StorageSpecification storage, Dictionary`2 configurationVariables)
at Microsoft.TeamFoundation.Release.MonitorServices.Dsc.OnPrem.OnPremDeploymentActions.InvokePlatform(String activityId, MachineSpecification machineSpecification, StorageSpecification storageSpecification, String scriptPath, String configurationPath, Dictionary`2 configurationVariables)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.TeamFoundation.Release.DeploymentAgent.Services.Deployer.Dsc.DscComponentInstaller.InvokeMethodByReflection(String methodArguments)
Приведенная выше ошибка приводит к сбою всего развертывания, и мы вынуждены повторить этап или все развертывание, чтобы завершить его.
Есть два сценария, которые вызывают это:
- Два шаблона выпуска выполняют свои сценарии powershell на одном и том же целевом сервере одновременно
- Один шаблон выпуска имеет параллельный поток управления, который содержит два разных компонента, которые выполняют сценарии на одном и том же целевом сервере.
Другими словами, механизм, который Управление релизами использует для запуска powershell script на удаленном сервере, может только когда-либо выполнять одиночный script за раз, и не имеет возможности ждать/удерживать для других пользователей полная.
Этот вид /sorta имеет смысл, если рассматриваемый script активно модифицирует сервер, на котором он выполняется, но в нашем случае сервер выступает в качестве основной области для запуска script. "Настоящая" цель script не имеет ничего общего с сервером, на котором выполняется powershell.
Помимо того, что у вас есть сервер-на-одновременно развернутый компонент (wow), что здесь работает? Это похоже на серьезный надзор, и это серьезно заставляет меня рассмотреть возможность вообще отказаться от управления релизами.