7

根据以下文档,我在 Visual Studio Team Services 中为 Service Fabric 应用程序配置了 CI 构建:https ://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous -一体化

但是,我并没有让我的 CI 构建执行发布,而是只执行构建和打包任务,并将所有与 Service Fabric 相关的输出(例如 pkg 文件夹、脚本、发布配置文件和应用程序参数)包含在下拉列表中。通过这种方式,我可以将它传递给新的发布管道(基于代理的发布)来执行我的服务结构应用程序的实际部署。

在我的发布定义中,我有一个 Azure Powershell 任务,它使用一个 ARM 端点(配置了适当的服务主体)。

当我将我的应用程序部署到现有的 Service Fabric 集群时,我使用默认的 Deploy-FabricApplication cmdlet 传递 pkg 文件夹和配置了与现有集群的连接的发布配置文件。

发布失败并显示错误消息“集群连接实例为空”。我不明白为什么?

做一些调试我发现: Deploy-FabricApplication cmdlet 执行 Connect-ServiceFabricCluster cmdlet 很好,但是一旦 Publish-NewServiceFabricApplication cmdlet 接管执行,集群连接就会丢失。

我希望使用服务结构 cmdlet 可以实现这种情况,但我无法弄清楚如何在部署期间保持集群连接打开。

更新:文档的链接不再引用 Service Fabric PowerShell 脚本,因此不再记录此问题的先决条件。这篇文章现在指的是 VSTS 构建和发布任务,它比我尝试使用的 powershell cmdlet 更受欢迎。

4

4 回答 4

31

Connect-ServiceFabricCluster函数被调用(来自 Deploy-FabricApplication.ps1)$clusterConnection时,在调用Connect-ServiceFabricCluster. 你可以看到使用Get-Variable.

不幸的是,一些 SDK 脚本中的逻辑期望设置该变量,但由于它们在不同的范围内运行,因此该局部变量不可用。

它可以在 Visual Studio 中工作,因为 Deploy-FabricApplication.ps1 脚本是使用点源表示法调用的,它将$clusterConnection变量置于当前范围内。

我不确定在通过发布管道运行脚本时是否有使用点源的方法,但作为一种解决方法,您可以在通过调用$clusterConnection设置变量后立即将其设为全局。Connect-ServiceFabricCluster编辑您的Deploy-FabricApplication.ps1脚本并在连接逻辑之后添加以下行(~第 169 行):

$global:clusterConnection = $clusterConnection  

顺便说一句,您可能需要考虑设置部署 Service Fabric 应用程序的自定义生成/发布任务,而不是使用各种 Deploy-FabricApplication.ps1 脚本。

于 2016-03-01T12:28:42.473 回答
2

现在存在用于部署 Service Fabric 应用程序的内置 VSTS 任务,因此您不再需要自行执行 PowerShell 脚本。任务文档页面位于https://www.visualstudio.com/docs/build/steps/deploy/service-fabric-deploy。原始 CI 文章也已更新,其中提供了有关如何设置所有内容的详细信息:https ://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous-integration/ 。

于 2016-08-03T18:35:37.803 回答
1

尝试使用“PowerShell”任务而不是“Azure PowerShell”任务。

于 2016-03-01T09:20:52.970 回答
0

我今天遇到了同样的错误并在这里打开了一个 GitHub 问题

附带说明,VS 生成的脚本Deploy-FabricApplication.ps1使用模块

"$((Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Service Fabric SDK" -Name "FabricSDKPSModulePath").FabricSDKPSModulePath)\ServiceFabricSDK.psm1"

那是Publish-NewServiceFabricApplication从哪里来的。您可以检查部署逻辑并使用较低级别的 ServiceFabric SDK cmdlet 以更理智的方式重写它(可能使用Get-ServiceFabricClusterConnection而不是 global-ling 获取连接)

于 2017-01-18T02:43:29.813 回答