发布管理vNext组件部署瓶颈

13

我们正在使用带有vNext发布模板的Release Management 2015。对于我们应用程序的每个部分,我们都有一个基于Powershell DSC的组件部署。事实上,我们有两个不同的应用程序正在部署并进行活动开发,并且通常几乎同时部署。

我们在部署过程中经常会遇到以下错误:

OperationFailedException:由于另一个部署正在进行中,因此不允许新的部署。请稍后重试部署。

完整的堆栈跟踪显示,该错误不是来自Powershell本身,而是来自Release Management系统,该系统负责在目标机器上执行Powershell脚本。

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)

上述错误导致整个部署失败,我们不得不重试阶段或整个部署才能完成。

有两种情况会导致这种情况发生:

  1. 两个发布模板在同一目标服务器上同时执行其PowerShell脚本
  2. 单个发布模板具有并行控制流,其中包含两个不同的组件,两者都在同一目标服务器上执行脚本

换句话说,发布管理使用的执行远程服务器上PowerShell脚本的机制似乎只能同时执行单个脚本,并且无法等待/保持其他脚本完成。

如果所涉及的脚本正在主动修改其执行的服务器,那么这种情况有点合理,但在我们的情况下,服务器基本上只是一个运行脚本的暂存区。脚本的“真正”目标与运行PowerShell的服务器无关。

除了每个同时部署的组件都有一个服务器(哇),还有什么解决方法吗?这似乎是一个很大的疏忽,严重地让我考虑完全放弃发布管理。


我建议与微软的产品团队进行交流。这里有一篇博客(http://blogs.msdn.com/b/visualstudioalm/archive/2015/04/29/release-management-announcements-at-build-2015.aspx),作者Vijay M在其中谈到了发布管理,并回应了至少两次博客评论。 - Χpẘ
2个回答

7

我在远程服务器上运行Powershell脚本时遇到了问题。最终,我采用了稍微不同的方法。相反,我只需使用Invoke-Command块运行普通的Powershell命令。我相信您应该能够并行运行此命令。

Function Get-PSCredential($User,$Password) {
    $SecPass = ConvertTo-SecureString -AsPlainText -String $Password -Force
    $Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$SecPass
    Return $Creds
}    

$credential = Get-PSCredential -User $deployUser -Password $deployPass
$session = New-PSSession YourServerName -Credential $credential

Invoke-Command -Session $session -ScriptBlock {
    # do your work here
}

如果您正在以具有对计算机访问权限的服务帐户身份运行,则应该能够消除凭据相关的内容,并仅使用以下内容:
$session = New-PSSession YourServerName

我这周才开始使用发布管理,因此这似乎是在短时间内最好的方法。

另外,如果您以前从未使用过Invoke-Command,那么脚本块内的所有内容实际上都在其自己的作用域中,因此如果有任何变量,您需要使用-ArgumentList将它们传递进去。如果您还有更多关于此的问题,请查看这篇文章


我明白了。所以你认为通过明确创建一个新的会话,我们将避免这些问题?测试起来应该很容易。马上回来。 ;) - RMD
不,问题似乎不是PowerShell。它是Release Management本身的问题。使用vNext模板/组件时,RM使用PowerShell来部署代理程序,然后运行组件的PowerShell脚本。这个vNext代理程序无法运行,而不是PowerShell。从我们看到的堆栈跟踪可以看出这一点。我已经编辑了原始问题以显示完整的堆栈跟踪。 - RMD

1
正如我今天在另一篇文章中解释的那样,MS Release Management的部署方式有点违反直觉:它不仅使用PSRemoting来执行您的Powershell部署脚本,还使用PSRemoting在目标服务器上安装一个Windows服务(VisualStudioRemoteDeployer.exe)。然后该服务在本地运行您的部署脚本,并且MSRM服务器定期轮询此Windows服务(参见此处)以查看其是否完成部署。
我怀疑这种奇怪的设置与避免双跳问题有关,因此它允许您的脚本从目标服务器向另一台服务器进行第二次跳转,例如进行webservice调用。
无论如何,这个Windows服务可能构成瓶颈,因为每个服务器只能运行一个这样的实例-因此,在相同服务器上并行部署组件似乎会发生冲突。
我认为你的问题源于选择了一个“服务器基本上作为脚本运行的暂存区”的设置 - MS Release Management 2013/2015在这种情况下表现不佳(正如你所发现的),你应该直接将组件部署到需要安装它们的目标服务器上,从而避免暂存区瓶颈。 MS Release Management的下一个版本将使用部署代理作为暂存点,从中部署组件到其他服务器。这有助于减少您必须在防火墙上允许的MS Release Management和目标服务器之间的连接数量(这可能是您选择暂存区设置的原因),同时仍然允许并行(或至少排队)部署。

在许多情况下,没有服务器可以运行脚本并作为目标。例如,我们将模式部署到 Sql Azure 实例中。我应该从哪里运行这些脚本?这种限制可能会成为我们的瓶颈。我们不想运行十几个“脚本服务器”来解决这个问题。 - RMD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接