Quellcodeverwaltung (Erstellen Real-World Cloud-Apps mit Azure)

von Rick Anderson, Tom Dykstra

Download Fix It Project oder E-Book herunterladen

Das E-Book Building Real World Cloud Apps with Azure basiert auf einer Präsentation, die von Scott Guthrie entwickelt wurde. Es werden 13 Muster und Methoden erläutert, die Ihnen helfen können, Web-Apps für die Cloud erfolgreich zu entwickeln. Informationen zum E-Book finden Sie im ersten Kapitel.

Die Quellcodeverwaltung ist für alle Cloudentwicklungsprojekte unerlässlich, nicht nur für Teamumgebungen. Sie würden sich nicht vorstellen, Quellcode oder sogar ein Word Dokuments ohne rückgängige Funktion und automatische Sicherungen zu bearbeiten, und die Quellcodeverwaltung bietet Ihnen diese Funktionen auf Projektebene, wo sie noch mehr Zeit sparen können, wenn etwas schief geht. Mit Cloud-Quellcodeverwaltungsdiensten müssen Sie sich keine Gedanken mehr über komplizierte Einrichtung machen, und Sie können Azure Repos Quellcodeverwaltung kostenlos für bis zu 5 Benutzer verwenden.

Im ersten Teil dieses Kapitels werden drei wichtige bewährte Methoden erläutert, die berücksichtigt werden sollten:

Der Rest des Kapitels enthält einige Beispielimplementierungen dieser Muster in Visual Studio, Azure und Azure Repos:

Behandeln von Automatisierungsskripts als Quellcode

Wenn Sie an einem Cloudprojekt arbeiten, ändern Sie häufig Dinge und möchten schnell auf Probleme reagieren können, die von Ihren Kunden gemeldet werden. Schnelles Reagieren erfordert die Verwendung von Automatisierungsskripts, wie im Kapitel Automatisieren von Alles erläutert. Alle Skripts, die Sie verwenden, um Ihre Umgebung zu erstellen, bereitzustellen, zu skalieren usw., müssen mit Dem Quellcode Ihrer Anwendung synchronisiert sein.

Um Skripts mit Code synchron zu halten, speichern Sie sie in Ihrem Quellcodeverwaltungssystem. Wenn Sie Dann änderungen zurücksetzen oder eine schnelle Korrektur für Produktionscode vornehmen müssen, der sich von Entwicklungscode unterscheidet, müssen Sie keine Zeit damit verschwenden, nachzuverfolgen, welche Einstellungen geändert wurden oder welche Teammitglieder Kopien der benötigten Version besitzen. Sie sind sicher, dass die benötigten Skripts mit der Codebasis synchronisiert sind, für die Sie sie benötigen, und Sie sind sicher, dass alle Teammitglieder mit den gleichen Skripts arbeiten. Unabhängig davon, ob Sie tests und die Bereitstellung eines Hotfixes für die Produktion oder die Entwicklung neuer Features automatisieren müssen, verfügen Sie über das richtige Skript für den Code, der aktualisiert werden muss.

Geheimnisse nicht einchecken

Ein Quellcoderepository ist in der Regel für zu viele Personen zugänglich, als dass es ein entsprechend sicherer Ort für vertrauliche Daten wie Kennwörter ist. Wenn Skripts von Geheimnissen wie Kennwörtern abhängig sind, parametrisieren Sie diese Einstellungen so, dass sie nicht im Quellcode gespeichert werden, und speichern Sie Ihre Geheimnisse an einem anderen Ort.

Mit Azure können Sie beispielsweise Dateien herunterladen, die Veröffentlichungseinstellungen enthalten, um die Erstellung von Veröffentlichungsprofilen zu automatisieren. Diese Dateien enthalten Benutzernamen und Kennwörter, die für die Verwaltung Ihrer Azure-Dienste autorisiert sind. Wenn Sie diese Methode zum Erstellen von Veröffentlichungsprofilen verwenden und diese Dateien in die Quellcodeverwaltung einchecken, kann jeder Benutzer mit Zugriff auf Ihr Repository diese Benutzernamen und Kennwörter sehen. Sie können das Kennwort sicher im Veröffentlichungsprofil selbst speichern, da es verschlüsselt ist und sich in einer PUBXML.user-Datei befindet, die standardmäßig nicht in der Quellcodeverwaltung enthalten ist.

Strukturieren von Quell-Branches zur Vereinfachung des DevOps-Workflows

Die Implementierung von Branches in Ihrem Repository wirkt sich auf Ihre Fähigkeit aus, neue Features zu entwickeln und Probleme in der Produktion zu beheben. Hier ist ein Muster, das viele mittelgroße Teams verwenden:

Quellbranchstruktur

Der Standard Branch stimmt immer mit Code überein, der sich in der Produktion befindet. Verzweigungen unter Standard entsprechen verschiedenen Phasen des Entwicklungslebenszyklus. Im Entwicklungsbranch implementieren Sie neue Features. Für ein kleines Team haben Sie möglicherweise nur Standard und Entwicklung, aber wir empfehlen häufig, dass die Benutzer einen Staging-Branch zwischen Entwicklung und Standard haben. Sie können Staging für abschließende Integrationstests verwenden, bevor ein Update in die Produktion verschoben wird.

Für große Teams gibt es möglicherweise separate Branches für jedes neue Feature. Für ein kleineres Team können alle Mitarbeiter beim Entwicklungsbranch einchecken.

Wenn Sie über einen Branch für jedes Feature verfügen, wird der Quellcode von Feature A in den Entwicklungsbranch und nach unten in die anderen Feature-Branches zusammengeführt. Dieser Prozess der Zusammenführung von Quellcode kann zeitaufwändig sein, und um diese Arbeit zu vermeiden, während die Features weiterhin getrennt bleiben, implementieren einige Teams eine alternative, sogenannte Feature-Umschalter (auch als Featureflags bezeichnet). Dies bedeutet, dass sich der gesamte Code für alle Features im selben Branch befindet, Sie jedoch jedes Feature mithilfe von Schaltern im Code aktivieren oder deaktivieren. Angenommen, Feature A ist ein neues Feld für Fix It-App-Aufgaben, und Feature B fügt Zwischenspeicherungsfunktionen hinzu. Der Code für beide Features kann sich im Entwicklungsbranch befinden, aber die App zeigt das neue Feld nur an, wenn eine Variable auf TRUE festgelegt ist, und sie verwendet nur die Zwischenspeicherung, wenn eine andere Variable auf true festgelegt ist. Wenn Feature A nicht für eine Heraufstuftung bereit ist, aber das Feature B bereit ist, können Sie den gesamten Code in die Produktion höherstufen, wenn feature A ausgeschaltet und Feature B aktiviert ist. Anschließend können Sie Feature A abschließen und später höherstufen, ohne Quellcodezusammenführung.

Unabhängig davon, ob Sie Branchs oder Umschalten für Features verwenden oder nicht, eine Verzweigungsstruktur wie diese ermöglicht es Ihnen, Ihren Code aus der Entwicklung in die Produktion auf agile und wiederholbare Weise zu fließen.

Mit dieser Struktur können Sie auch schnell auf Kundenfeedback reagieren. Wenn Sie eine schnelle Lösung für die Produktion vornehmen müssen, können Sie dies auch effizient und auf agile Weise tun. Sie können einen Branch aus Standard oder Staging erstellen, und wenn sie bereit ist, können Sie ihn in Standard und in Entwicklungs- und Feature-Branches zusammenführen.

Hotfix-Branch

Ohne eine solche Verzweigungsstruktur mit ihrer Trennung von Produktions- und Entwicklungszweigen könnte ein Produktionsproblem dazu führen, dass Sie den neuen Featurecode zusammen mit Ihrer Produktionsfixierung höherstufen müssen. Der neue Featurecode ist möglicherweise nicht vollständig getestet und für die Produktion bereit, und Sie müssen möglicherweise viel Arbeit leisten, um Änderungen zu unterstützen, die nicht bereit sind. Oder Sie müssen ihre Korrektur möglicherweise verzögern, um Änderungen zu testen und sie für die Bereitstellung bereit zu machen.

Als Nächstes sehen Sie Beispiele für die Implementierung dieser drei Muster in Visual Studio, Azure und Azure Repos. Dies sind Beispiele anstelle detaillierter schrittweiser Anleitungen; Ausführliche Anweisungen, die den gesamten erforderlichen Kontext enthalten, finden Sie im Abschnitt Ressourcen am Ende des Kapitels.

Hinzufügen von Skripts zur Quellcodeverwaltung in Visual Studio

Sie können Skripts zur Quellcodeverwaltung in Visual Studio hinzufügen, indem Sie sie in einen Visual Studio-Projektmappenordner aufnehmen (vorausgesetzt, ihr Projekt befindet sich in der Quellcodeverwaltung). Hier ist eine Möglichkeit, dies zu tun.

Erstellen Sie einen Ordner für die Skripts in Ihrem Projektmappenordner (derselbe Ordner mit Ihrer SLN-Datei ).

Automation-Ordner

Kopieren Sie die Skriptdateien in den Ordner.

Inhalt des Automation-Ordners

Fügen Sie in Visual Studio dem Projekt einen Projektmappenordner hinzu.

Menüauswahl

Fügen Sie die Skriptdateien dem Projektmappenordner hinzu.

Menüauswahl

Dialogfeld

Die Skriptdateien sind jetzt in Ihrem Projekt enthalten, und die Quellcodeverwaltung verfolgt ihre Versionsänderungen zusammen mit den entsprechenden Quellcodeänderungen nach.

Speichern vertraulicher Daten in Azure

Wenn Sie Ihre Anwendung auf einer Azure-Website ausführen, können Sie das Speichern von Anmeldeinformationen in der Quellcodeverwaltung vermeiden, indem Sie sie stattdessen in Azure speichern.

Beispielsweise speichert die Fix It-Anwendung in ihrer Web.config Datei zwei Verbindungszeichenfolgen, die Kennwörter in der Produktion und einen Schlüssel enthalten, der Zugriff auf Ihr Azure-Speicherkonto ermöglicht.

<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MyFixItMembership.mdf;Initial Catalog=MyFixItMembership;Integrated Security=True" providerName="System.Data.SqlClient" />
  <add name="appdb" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MyFixItTasks.mdf;Initial Catalog=aspnet-MyFixItTasks;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
  <add key="webpages:Version" value="3.0.0.0" />
  <add key="webpages:Enabled" value="false" />
  <add key="ClientValidationEnabled" value="true" />
  <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  <add key="StorageAccountName" value="fixitdemostorage" />
  <add key="StorageAccountAccessKey" value="[accesskeyvalue]" />
</appSettings>

Wenn Sie die tatsächlichen Produktionswerte für diese Einstellungen in Ihre Web.config datei einfügen oder sie in die Web.Release.config-Datei einfügen, um eine Web.config Transformation zu konfigurieren, um sie während der Bereitstellung einzufügen, werden sie im Quellrepository gespeichert. Wenn Sie die Datenbankverbindungszeichenfolgen in das Produktionsveröffentlichungsprofil eingeben, befindet sich das Kennwort in Ihrer PUBXML-Datei . (Sie könnten die PUBXML-Datei aus der Quellcodeverwaltung ausschließen, aber dann verlieren Sie den Vorteil, alle anderen Bereitstellungseinstellungen gemeinsam zu nutzen.)

Azure bietet Eine Alternative für die Abschnitte appSettings und Verbindungszeichenfolgen der Web.config-Datei . Hier sehen Sie den relevanten Teil der Registerkarte Konfiguration für eine Website im Azure-Verwaltungsportal:

appSettings und connectionStrings im Portal

Wenn Sie ein Projekt auf dieser Website bereitstellen und die Anwendung ausgeführt wird, überschreiben alle Werte, die Sie in Azure gespeichert haben, alle Werte in der Web.config-Datei.

Sie können diese Werte in Azure festlegen, indem Sie entweder das Verwaltungsportal oder Skripts verwenden. Das Automatisierungsskript zur Umgebungserstellung, das Sie im Kapitel Automate Everything gesehen haben, erstellt eine Azure SQL Datenbank, ruft den Speicher und SQL-Datenbank Verbindungszeichenfolgen ab und speichert diese Geheimnisse in den Einstellungen für Ihre Website.

# Configure app settings for storage account and New Relic
$appSettings = @{ `
    "StorageAccountName" = $storageAccountName; `
    "StorageAccountAccessKey" = $storage.AccessKey; `
    "COR_ENABLE_PROFILING" = "1"; `
    "COR_PROFILER" = "{71DA0A04-7777-4EC6-9643-7D28B46A8A41}"; `
    "COR_PROFILER_PATH" = "C:\Home\site\wwwroot\newrelic\NewRelic.Profiler.dll"; `
    "NEWRELIC_HOME" = "C:\Home\site\wwwroot\newrelic" `
}
# Configure connection strings for appdb and ASP.NET member db
$connectionStrings = ( `
    @{Name = $sqlAppDatabaseName; Type = "SQLAzure"; ConnectionString = $sql.AppDatabase.ConnectionString}, `
    @{Name = "DefaultConnection"; Type = "SQLAzure"; ConnectionString = $sql.MemberDatabase.ConnectionString}
)

Beachten Sie, dass die Skripts parametrisiert sind, damit die tatsächlichen Werte nicht im Quellrepository gespeichert werden.

Wenn Sie lokal in Ihrer Entwicklungsumgebung ausgeführt werden, liest die App Ihre lokale Web.config-Datei, und Ihre Verbindungszeichenfolge verweist auf eine LocalDB-SQL Server-Datenbank im Ordner App_Data Ihres Webprojekts. Wenn Sie die App in Azure ausführen und die App versucht, diese Werte aus der Web.config-Datei zu lesen, werden die werte zurückgegeben und verwendet, die für die Website gespeichert sind, und nicht das, was sich tatsächlich in Web.config Datei befindet.

Verwenden von Git in Visual Studio und Azure DevOps

Sie können eine beliebige Quellcodeverwaltungsumgebung verwenden, um die zuvor vorgestellte DevOps-Verzweigungsstruktur zu implementieren. Für verteilte Teams kann ein verteiltes Versionskontrollsystem (DVCS) am besten funktionieren. für andere Teams funktioniert ein zentralisiertes System möglicherweise besser.

Git ist ein beliebtes verteiltes Versionskontrollsystem. Wenn Sie Git für die Quellcodeverwaltung verwenden, verfügen Sie über eine vollständige Kopie des Repositorys mit dem gesamten Verlauf auf Ihrem lokalen Computer. Viele Benutzer bevorzugen dies, da es einfacher ist, weiter zu arbeiten, wenn Sie nicht mit dem Netzwerk verbunden sind. Sie können weiterhin Commits und Rollbacks durchführen, Branches erstellen und wechseln usw. Selbst wenn Sie mit dem Netzwerk verbunden sind, ist es einfacher und schneller, Branchs zu erstellen und Branches zu wechseln, wenn alles lokal ist. Sie können auch lokale Commits und Rollbacks durchführen, ohne auswirkungen auf andere Entwickler zu haben. Außerdem können Sie Commits batchieren, bevor Sie sie an den Server senden.

Azure Repos bietet sowohl Git als auch Team Foundation-Versionskontrolle (TFVC; zentralisierte Quellcodeverwaltung). Hier erhalten Sie erste Schritte mit Azure DevOps.

Visual Studio 2017 umfasst integrierte, erstklassige Git-Unterstützung. Hier sehen Sie eine kurze Demo, wie dies funktioniert.

Wenn ein Projekt in Visual Studio geöffnet ist, klicken Sie mit der rechten Maustaste auf die Projektmappe in Projektmappen-Explorer, und wählen Sie dann Projektmappe zur Quellcodeverwaltung hinzufügen aus.

Hinzufügen einer Lösung zur Quellcodeverwaltung

Visual Studio fragt Sie, ob Sie TFVC (zentrale Versionskontrolle) oder Git verwenden möchten.

Quellcodeverwaltung auswählen

Wenn Sie Git auswählen und auf OK klicken, erstellt Visual Studio ein neues lokales Git-Repository in Ihrem Projektmappenordner. Das neue Repository enthält noch keine Dateien. Sie müssen sie dem Repository hinzufügen, indem Sie einen Git-Commit ausführen. Klicken Sie mit der rechten Maustaste auf die Projektmappe in Projektmappen-Explorer, und klicken Sie dann auf Commit.

Commit

Visual Studio inszeniert automatisch alle Projektdateien für den Commit und listet sie in Team Explorer im Bereich Enthaltene Änderungen auf. (Wenn Sie einige nicht in den Commit aufnehmen möchten, können Sie sie auswählen, klicken Sie mit der rechten Maustaste, und klicken Sie auf Ausschließen.)

Team Explorer

Geben Sie einen Commitkommentar ein, und klicken Sie auf Commit, und Visual Studio führt den Commit aus und zeigt die Commit-ID an.

Team Explorer Änderungen

Wenn Sie nun Code so ändern, dass er sich von dem im Repository befindet, können Sie die Unterschiede problemlos anzeigen. Klicken Sie mit der rechten Maustaste auf eine Datei, die Sie geändert haben, und wählen Sie Mit Unverändert vergleichen aus, und Sie erhalten eine Vergleichsanzeige, in der Ihre nicht festgelegte Änderung angezeigt wird.

Vergleich mit Nicht geändert

Diff mit Änderungen

Sie können leicht sehen, welche Änderungen Sie vornehmen, und sie einchecken.

Angenommen, Sie müssen einen Branch erstellen – sie können dies auch in Visual Studio tun. Klicken Sie in Team Explorer auf Neuer Branch.

Team Explorer Neuer Branch – Image 1

Geben Sie einen Branchnamen ein, klicken Sie auf Branch erstellen, und wenn Sie Branch auschecken ausgewählt haben, checkt Visual Studio den neuen Branch automatisch aus.

Team Explorer Neuer Branch – Image 2

Sie können jetzt Änderungen an Dateien vornehmen und sie in diesen Branch einchecken. Außerdem können Sie problemlos zwischen Branches wechseln, und Visual Studio synchronisiert die Dateien automatisch mit dem ausgecheckten Branch. In diesem Beispiel wurde der Titel der Webseite in _Layout.cshtml im HotFix1-Branch in "Hot Fix 1" geändert.

Hotfix1-Branch

Wenn Sie zurück zum Standard-Branch wechseln, rückgängig machen der Inhalt der Datei _Layout.cshtml automatisch in den Standard-Branch.

Standard Branch

Dies ist ein einfaches Beispiel dafür, wie Sie schnell einen Branch erstellen und zwischen Zweien hin- und herwechseln können. Dieses Feature ermöglicht einen hochgradig agilen Workflow mithilfe der Branchstruktur und Automatisierungsskripts, die im Kapitel Automate Everything vorgestellt werden. Sie können z. B. im Entwicklungsbranch arbeiten, einen Hot Fix-Branch von Standard erstellen, zum neuen Branch wechseln, ihre Änderungen dort vornehmen und diese commitsieren und dann zurück zum Entwicklungsbranch wechseln und ihre Aktivitäten fortsetzen.

Hier haben Sie gesehen, wie Sie mit einem lokalen Git-Repository in Visual Studio arbeiten. In einer Teamumgebung pushen Sie Änderungen in der Regel auch in ein gemeinsames Repository. Mit den Visual Studio-Tools können Sie auch auf ein Git-Remoterepository verweisen. Sie können GitHub.com zu diesem Zweck verwenden, oder Sie können Git und Azure Repos verwenden, die in alle anderen Azure DevOps-Funktionen integriert sind, z. B. Arbeitsaufgaben und Fehlernachverfolgung.

Natürlich ist dies nicht die einzige Möglichkeit, eine agile Verzweigungsstrategie zu implementieren. Sie können denselben agilen Workflow mithilfe eines zentralen Quellcodeverwaltungsrepositorys aktivieren.

Zusammenfassung

Messen Sie den Erfolg Ihres Quellcodeverwaltungssystems basierend darauf, wie schnell Sie eine Änderung vornehmen und es auf sichere und vorhersagbare Weise live schalten können. Wenn Sie Angst haben, eine Änderung vorzunehmen, weil Sie ein oder zwei Tage manuell testen müssen, können Sie sich fragen, was Sie prozess- oder testweise tun müssen, damit Sie diese Änderung in Minuten oder im schlimmsten Fall nicht länger als eine Stunde vornehmen können. Eine Strategie hierfür ist die Implementierung von Continuous Integration und Continuous Delivery, die wir im nächsten Kapitel behandeln werden.

Ressourcen

Weitere Informationen zu Verzweigungsstrategien finden Sie in den folgenden Ressourcen:

Weitere Informationen zum Behandeln vertraulicher Informationen, die nicht in Quellcodeverwaltungsrepositorys aufbewahrt werden sollten, finden Sie in den folgenden Ressourcen:

Informationen zu anderen Methoden zum Fernhalten vertraulicher Informationen aus der Quellcodeverwaltung finden Sie unter ASP.NET MVC: Beibehalten privater Einstellungen außerhalb der Quellcodeverwaltung.