如何从 VSTS 发布管道部署服务结构应用程序?
Posted
技术标签:
【中文标题】如何从 VSTS 发布管道部署服务结构应用程序?【英文标题】:How do I deploy service fabric application from VSTS release pipeline? 【发布时间】:2016-06-13 04:47:42 【问题描述】:根据以下文档,我在 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 文件夹、脚本、发布配置文件和应用程序参数)包含在 drop 中。通过这种方式,我可以将其传递给新的发布管道(基于代理的发布),以执行我的服务结构应用程序的实际部署。
在我的发布定义中,我有一个 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 更受欢迎。
【问题讨论】:
你能分享错误日志吗?它总是发生吗?您使用的是哪个代理?通常,运行 Publish-NewServiceFabricApplication 时集群连接不应丢失。 【参考方案1】:当调用 Connect-ServiceFabricCluster
函数时(来自 Deploy-FabricApplication.ps1),在调用 Connect-ServiceFabricCluster
后会设置一个本地 $clusterConnection
变量。你可以看到使用Get-Variable
。
不幸的是,一些 SDK 脚本中的逻辑要求设置该变量,但由于它们在不同的范围内运行,因此该局部变量不可用。
它可以在 Visual Studio 中工作,因为 Deploy-FabricApplication.ps1 脚本是使用 dot source notation 调用的,这会将 $clusterConnection
变量置于当前范围内。
我不确定在通过发布管道运行脚本时是否可以使用点源,但作为一种解决方法,您可以在通过 Connect-ServiceFabricCluster
设置 $clusterConnection
变量后立即将其设为全局变量称呼。编辑 Deploy-FabricApplication.ps1
脚本并在连接逻辑之后添加以下行(~第 169 行):
$global:clusterConnection = $clusterConnection
顺便说一句,您可能需要考虑设置 custom build/release tasks 来部署 Service Fabric 应用程序,而不是使用各种 Deploy-FabricApplication.ps1 脚本。
【讨论】:
感谢解释,很快就会尝试一下,我知道这是由于一些 powershell 变量范围问题。一旦功能发布管道启动并运行,我将研究自定义构建任务。我从 Deploy-FabricApplication.ps1 开始,因为它在我链接到的文档中被提及和使用。 接受这个答案 谢谢@charisk。 :D @charisk,Deploy-FabricApplication.ps1 不会在任何地方定义或使用 $ClusterConnection(您可以在整个文件夹 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ 上进行全文搜索) ServiceFabricSDK\。它是定义此变量的 Connect-ServiceFabricCluster,一些 SDK 函数似乎依赖于它(需要存在连接的函数)。请参阅github.com/Azure/service-fabric-issues/issues/137【参考方案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/。
【讨论】:
几天前看到的,因为几个月前我在uservoice上推荐了它,我真的很退出。伟大的工作。【参考方案3】:尝试使用“PowerShell”任务而不是“Azure PowerShell”任务。
【讨论】:
使用“纯”powershell 构建任务确保脚本是使用 . (点)符号就像一个魅力。【参考方案4】:我今天遇到了同样的错误并打开了一个 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
而不是 global-ling 获取连接)
【讨论】:
以上是关于如何从 VSTS 发布管道部署服务结构应用程序?的主要内容,如果未能解决你的问题,请参考以下文章