2016-02-29 3 views
5

Ich habe ein CI-Build für eine Service-Fabric-Anwendung in Visual Studio Team Service konfiguriert, nach dieser Dokumentation: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous-integrationWie stelle ich die Service Fabric-Anwendung aus der VSTS-Release-Pipeline bereit?

Aber anstatt mein CI Build mit dem Verlag tun, ich den Build and Package Aufgaben nur erfüllen, und alle Service Fabric-bezogenen Ausgaben wie pkg-Ordner, Skripts, Veröffentlichungsprofile und Anwendungsparameter in die Ablage einschließen. Auf diese Weise kann ich sie an die neue Release-Pipeline (Agenten-basierte Releases) weitergeben, um die eigentliche Bereitstellung meiner Service-Fabric-Anwendung durchzuführen.

In meiner Release-Definition habe ich eine einzelne Azure Powershell-Task, die einen ARM-Endpunkt verwendet (mit den richtigen konfigurierten Service-Principals).

Wenn ich meine Anwendung in einem vorhandenen Service-Fabric-Cluster implementiere, verwende ich das standardmäßige Deploy-FabricApplication-Cmdlet, das den pkg-Ordner und ein Veröffentlichungsprofil übermittelt, das mit einer Verbindung zum vorhandenen Cluster konfiguriert ist.

Die Veröffentlichung schlägt mit der Fehlermeldung "Clusterverbindungsinstanz ist null" fehl. Und ich kann nicht verstehen warum?

Doing einige Debuggen Ich habe festgestellt, dass: Der Deploy-FabricApplication Cmdlet Connect-ServiceFabricCluster Cmdlets ganz gut ausgeführt wird, aber sobald die Publish-NewServiceFabricApplication Cmdlets Ausführung übernimmt, dann wird der Cluster-Verbindung verloren geht.

Ich würde erwarten, dass dieses Szenario mithilfe der Service-Fabric-Cmdlets möglich ist, aber ich kann nicht herausfinden, wie die Cluster-Verbindung während der Abholung geöffnet bleibt.

UPDATE: Der Link zur Dokumentation bezieht sich nicht mehr auf die Powershell-Skripts von Service Fabric, daher ist die Voraussetzung für diese Frage nicht mehr dokumentiert. Der Artikel bezieht sich nun auf die Build- und Release-Aufgaben von VSTS, die den Powershell-Cmdlets vorgezogen werden können, die ich zu verwenden versuchte.

+0

Können Sie die Fehlerprotokolle teilen? Ist es immer vorgekommen? Und welchen Agenten benutzen Sie? Normalerweise sollte die Clusterverbindung nicht verloren gehen, wenn Publish-NewServiceFabricApplication ausgeführt wird. –

Antwort

23

Wenn die Funktion Connect-ServiceFabricCluster aufgerufen wird (aus Deploy-FabricApplication.ps1), wird nach dem Aufruf von Connect-ServiceFabricCluster eine lokale $clusterConnection-Variable festgelegt. Sie können dies unter Verwendung von Get-Variable sehen.

Leider gibt es Logik in einigen SDK-Skripts, die erwarten, dass die Variable festgelegt wird, aber weil sie in einem anderen Bereich ausgeführt werden, ist diese lokale Variable nicht verfügbar.

Es funktioniert in Visual Studio, weil das Deploy-FabricApplication.ps1-Skript mit dot source notation aufgerufen wird, das die $clusterConnection-Variable in dem aktuellen Bereich setzt.

Ich bin mir nicht sicher, ob es einen Weg gibt, Punkt Sourcing zu verwenden, wenn ein Skript obwohl der Release-Pipeline läuft, aber man könnte, wie dieses Problem zu umgehen, stellen die $clusterConnection Variable global rechts, nachdem er über die Connect-ServiceFabricCluster Rufaufbau worden ist. Bearbeiten Sie Ihre Deploy-FabricApplication.ps1 Skript und fügen Sie die folgende Zeile nach der Verbindungslogik (~ Linie 169):

$global:clusterConnection = $clusterConnection 

By the way, möchten Sie vielleicht einrichten custom build/release tasks berücksichtigen, die eine Service-Fabric Anwendung bereitstellen, anstatt die verschiedenen Deploy-FabricApplication.ps1-Skripts.

+0

Thx für die Erklärung, werde es bald ausprobieren, und ich hatte eine Idee, dass dies aufgrund einer Powershell Variable Scoping Problem war. Ich werde die benutzerdefinierten Build-Aufgaben untersuchen, sobald ich eine funktionsfähige Release-Pipeline eingerichtet habe. Ich habe mit Deploy-FabricApplication.ps1 begonnen, seit es erwähnt und in der Dokumentation verwendet wurde, mit der ich verlinkt habe. – mikanyg

+1

Dies muss wirklich die angenommene Antwort sein – Steve

+0

Akzeptieren Sie diese Antwort – parek

1

Versuchen Sie, die Task "PowerShell" anstelle der Task "Azure PowerShell" zu verwenden.

+0

Mit der "puren" Powershell - Erstellungsaufgabe wurde sichergestellt, dass das Skript mit dem Befehl ausgeführt wurde. (Punkt-) Notation, die wie ein Zauber wirkte. – mikanyg

1

Es gibt jetzt eine integrierte VSTS-Task zum Bereitstellen einer Service Fabric-App, sodass Sie sich nicht länger mit der alleinigen Ausführung des PowerShell-Skripts beschäftigen müssen. Die Seite mit der Aufgabendokumentation befindet sich unter https://www.visualstudio.com/docs/build/steps/deploy/service-fabric-deploy. Der ursprüngliche CI-Artikel wurde ebenfalls aktualisiert. Er enthält Details zur Einrichtung von: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-set-up-continuous-integration/.

+0

vor ein paar Tagen bin ich wirklich aufgeregt, seit ich vor ein paar Monaten auf uservoice vorgeschlagen habe. – mikanyg

0

ich den gleichen Fehler heute getroffen und öffnete eine Ausgabe GitHub here

Auf einer Seite zur Kenntnis, verwendet VS generierte Skript Deploy-FabricApplication.ps1 Modul

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

Das ist, wo Publish-NewServiceFabricApplication herkommt. Sie können die Bereitstellungslogik überprüfen und sie mit ServiceFabric SDK-Cmdlets auf niedrigerer Ebene neu schreiben (möglicherweise wird eine Verbindung mit Get-ServiceFabricClusterConnection anstelle einer globalen Verbindung hergestellt)

Verwandte Themen