Erkunde das Git-Verzweigungsmodell für kontinuierliche Lieferung

Abgeschlossen

Die erfolgreiche Softwarebereitstellung hängt von einer Verzweigungsstrategie ab, die Geschwindigkeit, Qualität und Risikomanagement ausgleicht. Ziel ist es, Verbesserungen schnell zu versenden und gleichzeitig die Produktionsstabilität aufrechtzuerhalten.

Strategische Balance: Geschwindigkeit und Qualität

Ein effektives Verzweigungsmodell muss das richtige Gleichgewicht haben:

  • Minimieren Sie den Prozessaufwand , um den Zeit-zu-Markt zu beschleunigen.
  • Stellen Sie sicher, dass Qualitätssicherungspunkte bestehen bleiben, um zu verhindern, dass Fehler in die Produktion gelangen.
  • Aktivieren Sie parallele Entwicklung für die Skalierbarkeit des Teams.
  • Unterstützen Sie eine schnelle Hotfixbereitstellung für kritische Probleme.

Während zahlreiche Git Branching-Strategien vorhanden sind, kombiniert der effektivste Ansatz bewährte Muster mit den spezifischen Anforderungen Ihres Teams. Moderne Unternehmensteams übernehmen in der Regel ein einfaches, trunkbasiertes Entwicklungsmodell , das sich auf Featurezweigen und Pullanforderungen zentriert.

Kernprinzip: Immer-Bereit Hauptzweig

In dieser Lektion erfahren Sie, wie Sie ein fortlaufendes Bereitstellungsfertiges Verzweigungsmodell mithilfe von Featureverzweigungen und Pullanforderungen implementieren, um eine konsistente bereitstellungsfähige Hauptverzweigung aufrechtzuerhalten.

Rahmen für unternehmensweite Verzweigungsstrategien

Die folgenden Prinzipien legen eine stabile Grundlage für die kontinuierliche Lieferung fest:

Hauptzweigstabilität

  • Single Source of Truth: Der Mainbranch ist der exklusive Weg für Produktionsversionen.
  • Produktionsbereitschaft: Der Hauptzweig muss sich immer in einem bereitstellungsfähigen Zustand befinden.
  • Branch-Schutz: Implementieren Sie umfassende Branchrichtlinien, um direkte Commits zu verhindern.
  • Gated-Änderungen: Alle Änderungen fließen ausschließlich durch Pullanforderungen.
  • Versionsnachverfolgung: Markieren Sie alle Produktionsversionen mit semantischen Git-Tags.

Featurebranchdisziplin

  • Isolierte Entwicklung: Erstellen Sie dedizierte Verzweigungen für alle Features und Fehlerbehebungen.
  • Integration von Featurekennzeichnungen: Verwalten Sie lange ausgeführte Features mit Feature-Umschaltern, um die Branchlebenszeit zu reduzieren.
  • Strategische Benennung: Verwenden Sie beschreibende Benennungskonventionen, die den Geschäftlichen Wert widerspiegeln.
  • Pull Request-Workflow: Zusammenführen im Mainbranch ausschließlich über überprüfte Pull Requests.

Release Branch-Strategie

  • Dedizierte Vorbereitung: Erstellen Sie Release-Verzweigungen aus stabilen Featureintegrationspunkten.
  • Qualitätssicherung: Führen Sie gründliche Tests und Stabilisierung auf Release-Branches durch.
  • Produktionshärtung: Wenden Sie abschließende Fehlerbehebungen und Leistungsoptimierungen an.
  • Meilensteinverfolgung: Markieren Sie wichtige Veröffentlichungsmeilensteine zur Rückverfolgbarkeit.

Benennungskonventionen für Skalierung

# Bug fixes
bugfix/[ticket-id]-description
bugfix/AUTH-123-login-timeout

# Feature development
features/[area]/[feature-name]
features/authentication/oauth-integration
features/api/rate-limiting

# Hotfixes
hotfix/[severity]-description
hotfix/critical-payment-gateway

# Personal branches
users/[username]/[description]
users/john-doe/experimental-caching

Pull Request-Verwaltung

  • Obligatorische Codeüberprüfung: Keine Ausnahmen für direkte Zusammenführungen zum Hauptteil.
  • Automatisierte Validierung: Integration von CI/CD-Pipelines für Qualitätssicherungsgrenzen.
  • Leistungsmetriken: Nachverfolgen und Optimieren der Abschlusszeit der Pullanforderung.
  • Wissensaustausch: Verwenden Sie Rezensionen für teambasiertes Lernen und die Durchsetzung von Standards.

Voraussetzungen und Einrichtung

Grundlegende Tools für Git-Workflows für Unternehmen

Diese praktische Übung nutzt die umfassende DevOps-Toolkette von Azure:

  • Azure CLI: Cloudnative Befehlszeilenschnittstelle für Azure-Dienste.
  • Azure DevOps CLI: Spezialisierte Erweiterung für nahtlose Git-, CI/CD- und Agile-Toolintegration in Windows, Linux und macOS.

Azure DevOps CLI-Konfiguration

Die Azure DevOps CLI bietet flexible Ausgabeformatierung (JSON, YAML, Tabelle, TSV), um verschiedene Automatisierungsszenarien zu unterstützen. Konfigurieren Sie Ihr bevorzugtes Format mithilfe von:

az devops configure --defaults output=table

Hands-On Implementierung: Enterprise Git Workflow

Diese umfassende Anleitung veranschaulicht das Branching mit Git auf professionellem Niveau für die kontinuierliche Bereitstellung, wobei die Entwicklung von Funktionen, die Hotfix-Deployments und die Konfliktlösung abgedeckt werden.

Schritt 1: Erstellung und Entwicklung von Feature branch

Erstellen Sie einen Feature-Branch gemäß unternehmensspezifischen Namenskonventionen.

myWebApp

git checkout -b feature/myFeature-1

Ausgabe:Switched to a new branch 'feature/myFeature-1'.

Überprüfen des Branchkontexts und des Arbeitsstrukturstatus:

myWebApp

git branch

Ausgabe:✓ feature/myFeature-1

  • main*

Schritt 2: Featureimplementierung und Versionssteuerung

Implementieren Sie Ihre Funktionsänderungen.

myWebApp

# Edit your source files
code Program.cs  # Or your preferred editor

Folgen Sie dem vollständigen Commit-Lebenszyklus:

myWebApp

git status

Ausgabe:On branch feature/myFeature-1Changes not staged for commit:

  • geändert: Program.cs*

myWebApp

git add .
git commit -m "feat: implement myFeature-1 with enhanced error handling"

Ausgabe:[feature/myFeature-1 70f67b2] feat: implement myFeature-1 with enhanced error handling1 file changed, 1 insertion(+)

Veröffentlichen im Remote-Repository:

myWebApp

git push -u origin feature/myFeature-1

Ausgabe:Zu https://dev.azure.com/organization/teamproject/_git/MyWebApp

  • [new branch] feature/myFeature-1 -> feature/myFeature-1Branch feature/myFeature-1 set up to track remote branch feature/myFeature-1 from origin.

Schritt 3: Azure DevOps CLI-Konfiguration und Erstellung von Pull-Anforderungen

Konfigurieren Sie die Azure DevOps CLI für Ihre Organisation und Ihr Projekt. Ersetzen Sie Organisation und Projektname:

az devops configure --defaults organization=https://dev.azure.com/organization project="project name"

Erstellen Sie einen neuen Pull Request (mithilfe der Azure DevOps CLI), um die Änderungen im Branch „feature-1“ zu überprüfen:

az repos pr create --title "Review Feature-1 before merging to main" --work-items 38 39 `
--description "#Merge feature-1 to main" `
--source-branch feature/myFeature-1 --target-branch main `
--repository myWebApp --open

Verwenden Sie den --open Schalter beim Auslösen der Pullanforderung, um sie in einem Webbrowser zu öffnen, nachdem sie erstellt wurde. Der --deletesource-branch Schalter kann verwendet werden, um die Verzweigung zu löschen, nachdem die Pullanforderung abgeschlossen ist. Erwägen Sie außerdem, --auto-complete zu verwenden, um automatisch abzuschließen, wenn alle Richtlinien erfüllt sind und der Quellzweig in den Zielzweig zusammengeführt werden kann.

Hinweis

Weitere Informationen zum Parameter az repos pr create finden Sie unter Erstellen eines Pull Requests zum Überprüfen und Mergen von Code.

Das Team überprüft gemeinsam die Codeänderungen und genehmigt den Pull Request:

Screenshot des Pull Requests mit genehmigten und abgeschlossenen Codeänderungen

Der Mainbranch kann jetzt freigegeben werden. Das Team markiert den Mainbranch mit der Releasenummer:

Screenshot der Erstellung eines Beispiel-Tags

Schritt 4: Parallele Featureentwicklung

Beginnen Sie mit der Arbeit an Feature 2. Erstellen Sie einen Branch an einem Remotespeicherort aus dem Mainbranch, und führen Sie das Auschecken lokal durch:

myWebApp

git push origin main:refs/heads/feature/myFeature-2

Ausgabe:Total 0 (delta 0), reused 0 (delta 0) To https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [new branch] origin/HEAD -> refs/heads/feature/myFeature-2.

myWebApp

git checkout feature/myFeature-2

Switched to a new branch 'feature/myFeature-2' Branch feature/myFeature-2 set up to track remote branch feature/myFeature-2 from origin.

Ändern Sie Program.cs, indem Sie die gleiche Kommentarzeile im Code ändern, der in feature-1 geändert wurde:

```
public class Program
{
    // Editing the same line (file from feature-2 branch)
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
```

Schritt 5: Feature 2 Pull-Request und Hotfix-Szenario

Committen Sie die Änderungen lokal, pushen Sie sie in das Remoterepository, und lösen Sie dann einen Pull Request aus, um die Änderungen von „feature/myFeature-2“ mit dem Mainbranch zu mergen:

az repos pr create --title "Review Feature-2 before merging to main" --work-items 40 42 `
--description "#Merge feature-2 to main" `
--source-branch feature/myFeature-2 --target-branch main `
--repository myWebApp --open

Ein kritischer Fehler wird in der Produktion für das Release „feature-1“ mit dem aktiven Pull Request gemeldet. Um das Problem zu untersuchen, müssen Sie die Version des Codes debuggen, die derzeit in der Produktion bereitgestellt ist. Um das Problem zu untersuchen, erstellen Sie einen neuen fof-Branch, indem Sie das Tag „release_feature1“ verwenden:

myWebApp

git checkout -b fof/bug-1 release_feature1

Ausgabe:Zu einem neuen Branch gewechselt, 'fof/bug-1'.

Schritt 6: Kritische Hotfix-Implementierung

Ändern Sie die Datei „Program.cs“, indem Sie die gleiche Codezeile ändern, die im „feature-1“-Release geändert wurde:

public class Program
{
    // Editing the same line (file from feature-FOF branch)
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

Stagen Sie Ihre Änderungen, und führen Sie den Commit lokal durch. Pushen Sie dann die Änderungen zum Remoterepository:

myWebApp

git add .
git commit -m "Adding FOF changes."
git push -u origin fof/bug-1

Ausgabe:To https://dev.azure.com/**organization**/**teamproject**/\_git/MyWebApp * [new branch] fof/bug-1 - fof/bug-1 Branch fof/bug-1 set up to track remote branch fof/bug-1 from origin.

Schritt 7: Hotfix-Integration und Konfliktauflösung

Unmittelbar nachdem ein Rollout der Änderungen in die Produktion erfolgt ist, markieren Sie den Branch „fof\bug-1“ mit dem Tag „release_bug-1“ und lösen dann einen Pull Request aus, um die Änderungen von „fof/bug-1“ wieder im Mainbranch zu mergen:

az repos pr create --title "Review Bug-1 before merging to main" --work-items 100 `
--description "#Merge Bug-1 to main" `
--source-branch fof/Bug-1 --target-branch main `
--repository myWebApp --open

Im Rahmen des Pull Requests wird der Branch gelöscht. Mithilfe des Tags können Sie jedoch weiterhin auf den gesamten Verlauf verweisen.

Nachdem der Fix für den kritischen Fehler aus dem Weg geräumt ist, wechseln Sie zur Überprüfung von Pull Request „feature-2“.

Auf der Seite der Branches ist deutlich zu erkennen, dass der Branch „feature/myFeature-2“ eine Änderung mehr und zwei Änderungen weniger als der Mainbranch aufweist:

Screenshot der Seite mit Branches. Die beiden Branches „feature“ und „myFeature“ weisen eine Änderung mehr und zwei Änderungen weniger als der Mainbranch auf.

Wenn Sie versuchen würden, den Pull Request zu genehmigen, würden Sie eine Fehlermeldung erhalten, die Sie über einen Konflikt beim Zusammenführen informiert:

Screenshot von Mergekonflikten aus einem Pull Request.

Merge-Konflikte beheben

Um Zusammenführungskonflikte zu beheben, können Sie die Azure DevOps-Weboberfläche verwenden oder lokal mithilfe von Git-Befehlen beheben. Aktualisieren Sie für die lokale Auflösung zuerst Ihren Featurebranch mit den neuesten Änderungen vom Mainbranch:

```CMD
git checkout feature/myFeature-2
git fetch origin
git merge origin/main
```

Lösen Sie die Konflikte in Ihrem bevorzugten Editor und führen Sie dann den Merge durch:

```CMD
git add .
git commit -m "Resolve merge conflicts between feature-2 and main"
git push origin feature/myFeature-2
```

Nachdem die Konflikte behoben wurden, kann die Pullanforderung erfolgreich abgeschlossen werden.

An diesem Punkt können Sie einen Release-Branch basierend auf der kritischen Fehlerbehebung erstellen, die im fof/bug-1-Branch implementiert und in Main zusammengeführt wurde. Erstellen Sie mithilfe des Befehls "git checkout" einen dedizierten Release-Branch aus der Hauptzweigung.

git checkout -b release/v1.1 main

Dieser Befehl erstellt eine neue Verzweigung namens release/v1.1 basierend auf der Hauptverzweigung.

Da wichtige Meilensteine während des Veröffentlichungsprozesses erreicht werden, sollten Sie Veröffentlichungen im Release-Branch mithilfe von Git-Tags markieren. Tags dienen als Markierungen, um bestimmte Versionen der Software zu kennzeichnen.

git tag -a v1.1 -m "Release version 1.1"

Mit diesem Befehl wird ein Tag mit dem Namen v1.1 erstellt, um die Version 1.1 im Release-Branch zu markieren.

Funktionsweise

Wir haben erfahren, wie das Git-Verzweigungsmodell Ihnen die Flexibilität bietet, parallel an Features zu arbeiten, indem Sie für jedes Feature einen Branch erstellen.

Mit dem Pull Request-Workflow können Sie Codeänderungen mithilfe der Branchrichtlinien überprüfen.

Git-Tags sind eine hervorragende Möglichkeit, Meilensteine aufzuzeichnen, z. B. die Version des freigegebenen Codes. Tags bieten Ihnen die Möglichkeit, Branches aus Tags zu erstellen.

Wir haben einen Branch aus einem früheren Releasetag erstellt, um einen kritischen Fehler in der Produktion zu beheben.

Die Ansicht „Zweige“ im Webportal erleichtert das Erkennen von Zweigen, die dem Hauptzweig voraus sind. Außerdem erzwingt sie einen Zusammenführungskonflikt, wenn aktive Pull Requests versuchen, in den Mainbranch zusammenzuführen, ohne die Zusammenführungskonflikte zu beheben.

Mit einem schlanken Verzweigungsmodell können Sie kurzlebige Branches erstellen und qualitative Änderungen schneller in die Produktionsumgebung übertragen.