如何从 VSTS 发布管道部署服务结构应用程序?

How do I deploy service fabric application from VSTS release pipeline?

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

但是我没有让 CI 构建进行发布,我只执行构建和打包任务,并包括所有 Service Fabric 相关输出,例如 pkg 文件夹、脚本、发布配置文件和应用程序参数,在下降。这样我就可以将它传递到新的发布管道(基于代理的发布)来实际部署我的服务结构应用程序。

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

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

发布失败并显示错误消息 "Cluster connection instance is null"。我不明白为什么?

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

我希望使用 service fabric cmdlet 可以实现这种情况,但我不知道如何在部署期间保持集群连接打开。

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

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

当调用 Connect-ServiceFabricCluster 函数时(从 Deploy-FabricApplication.ps1),在调用 Connect-ServiceFabricCluster 之后设置一个本地 $clusterConnection 变量。您可以使用 Get-Variable 看到这一点。

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

它在 Visual Studio 中有效,因为 Deploy-FabricApplication.ps1 脚本是使用 dot source notation 调用的,它将 $clusterConnection 变量放入当前范围。

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

$global:clusterConnection = $clusterConnection  

顺便说一下,您可能要考虑设置 custom build/release tasks 来部署 Service Fabric 应用程序,而不是使用各种 Deploy-FabricApplication。ps1 脚本。

现在有一个用于部署 Service Fabric 应用程序的内置 VSTS 任务,因此您不再需要自己执行 PowerShell 脚本。任务文档页面位于 https://www.visualstudio.com/docs/build/steps/deploy/service-fabric-deploy. The original CI article has also been updated which provides details on how to set everything up: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous-integration/.

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

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

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

这就是 Publish-NewServiceFabricApplication 的来源。您可以使用 lower-level ServiceFabric SDK cmdlet 检查部署逻辑并以更理智的方式重写它(可能使用 Get-ServiceFabricClusterConnection 而不是 global-ling 获取连接)