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

时间:2016-02-29 23:06:03

标签: azure-devops azure-service-fabric

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

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

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

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

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

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

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

更新:文档的链接不再引用Service Fabric powershell脚本,因此不再记录此问题的前提条件。该文章现在引用了VSTS构建和发布任务,可以优先考虑我尝试使用的PowerShell cmdlet。

3 个答案:

答案 0 :(得分:31)

调用Connect-ServiceFabricCluster函数时(来自Deploy-FabricApplication.ps1),在调用$clusterConnection后设置了本地Connect-ServiceFabricCluster变量。你可以看到使用Get-Variable

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

它在Visual Studio中工作,因为使用dot source notation调用Deploy-FabricApplication.ps1脚本,它将$clusterConnection变量放在当前作用域中。

我不确定在通过发布管道运行脚本时是否有办法使用点源,但是作为一种解决方法,您可以通过{设置$clusterConnection变量后将其设置为全局{1}}致电。编辑Connect-ServiceFabricCluster脚本并在连接逻辑(〜第169行)后添加以下行:

Deploy-FabricApplication.ps1

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

答案 1 :(得分: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/

答案 2 :(得分:0)

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

另外,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进行连接而不是全局链接)