kurmann / GitHub.Workflows

Zentrale Sammelstelle für Reusable GitHub-Workflows.
Apache License 2.0
0 stars 0 forks source link

Release-Managment-Abklärungen #1

Closed kurmann closed 5 months ago

kurmann commented 5 months ago

Nun möchte ich die GitHub-Releases und Versionierung testen.

Dazu eine Frage was ist der beste Ansatz bei der Versionierung (wir testen dies zuerst).

Wenn ich ein Feature-Branch habe, lege ich dann die Versionierung bereits fest oder arbeite ich einfach an diesem?

Für mich zentral ist, dass eine Veröffentlichung immer mit den Release Notes einhergeht. Unklar für mich ist, wann man die Version (SerVer) festlegt.


ChatGPT: Die Versionierung und das Erstellen von Release Notes sind wichtige Aspekte der Softwareentwicklung, insbesondere wenn es um die Veröffentlichung und das Management von Releases geht. Hier sind einige Best Practices und Überlegungen zur Versionierung und zum Timing:

Wann die Version festlegen:

  1. Feature-Branches: In der Regel werden Versionen in Feature-Branches nicht festgelegt. Feature-Branches dienen der Entwicklung und dem Testen neuer Funktionen und Änderungen. Die Versionierung wird normalerweise erst festgelegt, wenn die Änderungen in den main oder release Branch gemerged werden, um ein neues Release zu erstellen.

  2. Release-Branches: Wenn du dich dem Punkt näherst, an dem du ein neues Release veröffentlichen möchtest, kannst du einen Release-Branch von main (oder einem anderen Haupt-Branch) erstellen. In diesem Branch kannst du die Versionsnummer aktualisieren und die Release Notes vorbereiten.

  3. Semantic Versioning (SemVer): Semantic Versioning ist ein weit verbreitetes System zur Versionsverwaltung. Es basiert auf drei Ziffern: Major.Minor.Patch (z.B., 1.0.0). Du aktualisierst:

    • Major: Bei inkompatiblen API-Änderungen
    • Minor: Bei Hinzufügen von Funktionalitäten in einer rückwärtskompatiblen Weise
    • Patch: Bei rückwärtskompatiblen Bugfixes
  4. Tags: Nachdem du den Release-Branch fertiggestellt hast, kannst du einen Git Tag anlegen, der der Versionsnummer entspricht. Dieser Tag kann dann für das Release verwendet werden.

Release Notes erstellen:

  1. Während der Entwicklung: Führe während der Entwicklung im Feature-Branch eine Liste von Änderungen, Fixes und neuen Funktionen. Dies kann in der Commit-Beschreibung oder in einer separaten CHANGELOG-Datei erfolgen.

  2. Vor dem Release: Bevor du den Release-Branch erstellst, solltest du sicherstellen, dass alle relevanten Informationen in die Release Notes aufgenommen werden. Diese können aus den Commit-Messages, Pull Request-Beschreibungen und anderen Dokumentationen zusammengestellt werden.

  3. GitHub Releases: GitHub bietet eine Release-Funktion, die es dir ermöglicht, Tags zu nutzen, um Releases zu erstellen, die auch die entsprechenden Release Notes enthalten können. Du kannst die Release Notes manuell hinzufügen oder ein automatisiertes Skript verwenden, das die Informationen aus deinem CHANGELOG oder den Commit-Messages zieht.

Automatisierung:

Du kannst den Prozess der Versionierung und das Erstellen von Release Notes teilweise automatisieren, indem du Workflows in GitHub Actions verwendest:

Zusammenfassung:

Das Festlegen der Version und das Erstellen von Release Notes kurz vor dem Release hilft dabei, den Prozess klar und verwaltet zu halten und sicherzustellen, dass alle Informationen auf dem neuesten Stand und genau sind.

kurmann commented 5 months ago

Ich verstehe. Ich denke bei mir kommt jetzt der Schritt mit dem Release-Branch.

Dann entwickle ich ein oder mehrere Feature-Branches und führe diese auf den Release-Branch zusammen. Beim Release-Branch mache ich sonst keine Entwicklungen ausser die Release-Notes anzupassen. Dann erfolgt eine Zusammenführung auf den Master-Branch und gleichzeitig könnte ich hier mit GitHub-Workflows einen neuen GitHub-Release erstellen.

Korrekt? Was habe ich sonst noch zu beachten?


Dein Verständnis ist absolut korrekt. Die Schritte, die du beschrieben hast, bilden einen guten Release-Workflow ab. Hier ist eine kurze Zusammenfassung und einige zusätzliche Punkte, die du beachten solltest:

  1. Feature-Branches: Entwickle neue Features oder Änderungen in Feature-Branches, die vom main oder einem development-Branch ausgehen.

  2. Release-Branch: Erstelle von main oder development einen Release-Branch (z.B. release/1.0.0), wenn du dich auf ein Release vorbereitest. In diesem Branch erfolgt keine weitere Entwicklung außer zur Vorbereitung des Releases.

  3. Zusammenführung (Merge) in den Release-Branch: Führe alle Feature-Branches, die in das Release aufgenommen werden sollen, in den Release-Branch zusammen.

  4. Anpassung der Release-Notes: Füge im Release-Branch die Release-Notes hinzu und aktualisiere die Versionsnummer gemäß dem Semantic Versioning.

  5. Merge in main: Wenn die Release-Notes fertig und alle Tests bestanden sind, merge den Release-Branch zurück in den main-Branch.

  6. Tagging und Release-Erstellung: Erstelle ein Git-Tag mit der Versionsnummer (z.B. v1.0.0) und benutze dann GitHub Actions, um automatisch ein GitHub Release basierend auf diesem Tag zu erstellen.

Zusätzliche Punkte zur Beachtung:

Indem du diese Schritte und Überlegungen befolgst, kannst du einen reibungslosen und effizienten Release-Prozess sicherstellen.

kurmann commented 5 months ago

Mich interessieren hier die Best-Practices noch zusätzlich bei Naming der Release-Branches und die Git-Tags.


Beim Naming von Release-Branches und Git-Tags ist Konsistenz entscheidend, damit Teammitglieder und Automatisierungstools einfach erkennen können, welche Branches und Tags zu welchen Releases gehören. Hier sind einige Best Practices:

Release-Branch Naming:

Beispiel für Release-Branches:

Git-Tag Naming:

Beispiel für Git-Tags:

Zusätzliche Tipps:

Die Verwendung dieser Best Practices sorgt dafür, dass deine Releases gut organisiert und leicht nachzuvollziehen sind. Sie helfen auch dabei, Fehler zu vermeiden und die Automatisierung von Workflows zu erleichtern, wie zum Beispiel das automatische Erstellen von Builds und das Veröffentlichen von Paketen basierend auf Tags.

kurmann commented 5 months ago

Warum brauche ich noch Git-Tags wenn ich den Release-Branch bereits mit den Versionsnummern versehe?


Git-Tags und Release-Branches dienen zwar beide der Versionierung, sie erfüllen jedoch unterschiedliche Funktionen im Entwicklungsprozess.

Release-Branches:

Git-Tags:

Warum beide verwenden?

Obwohl du die Versionsnummer im Namen des Release-Branches hast, repräsentiert ein Tag den genauen Stand des Codes zum Zeitpunkt des Releases. Wenn Änderungen am Release-Branch vorgenommen werden, wie z.B. Rückwärtskompatible Hotfixes, bleibt der Tag auf den Code des ursprünglichen Releases verweisen. So können Nutzer und Entwickler die spezifische Version des Codes wiederherstellen, die zum Zeitpunkt des Releases bestand.

Außerdem sind Tags im Git-Ökosystem als Versionierungsmechanismus etabliert. Viele CI/CD-Systeme und Build-Tools bieten spezielle Integrationen für Git-Tags, die beispielsweise das automatische Erstellen und Veröffentlichen von Software ermöglichen, sobald ein neuer Tag gepusht wird.

Zusammenfassend bieten Tags eine fixierte, historische Aufzeichnung von Releases, während Release-Branches einen Arbeitsbereich für die Vorbereitung und mögliche Anpassung eines bevorstehenden Releases darstellen. Tags gewährleisten die Unveränderlichkeit und Nachvollziehbarkeit von offiziellen Veröffentlichungen.

kurmann commented 5 months ago

Ein Git-Tag ist mit einem Commit verbunden?


Ja, genau! Ein Git-Tag ist eng mit einem bestimmten Commit verbunden. Ein Tag in Git ist im Wesentlichen ein benannter Referenzpunkt für einen spezifischen Commit im Repository. Das bedeutet, dass ein Tag immer auf den Zustand des Repositories zu dem Zeitpunkt verweist, als der Tag erstellt wurde, was ihn zu einem nützlichen Werkzeug für die Markierung von bestimmten Versionen oder Meilensteinen in der Entwicklungsgeschichte macht.

Typen von Git-Tags

Es gibt zwei Haupttypen von Tags in Git:

  1. Leichtgewichtige Tags: Diese sind wirklich nur ein einfacher Name, der an einen bestimmten Commit gebunden ist. Sie enthalten keine weiteren Metadaten über den Tag selbst außer dem Commit, den sie referenzieren.

    Erstellen eines leichtgewichtigen Tags:

    git tag <tagname>
  2. Annotierte Tags: Diese sind komplexer. Sie sind Objekte im Git-Datenbank, die Metadaten wie den Tag-Namen, eine Nachricht, den Autor des Tags (Name und E-Mail), das Datum der Erstellung und einen Verweis auf den Commit, den sie markieren, speichern. Annotierte Tags können signiert und verifiziert werden, was bei der Freigabe von Software für öffentliche oder sicherheitskritische Projekte wichtig ist.

    Erstellen eines annotierten Tags:

    git tag -a <tagname> -m "Release Message"

Verwendung von Tags

Zusammenfassend lässt sich sagen, dass Tags eine wesentliche Rolle in der Versionskontrolle spielen, indem sie einen unveränderlichen Verweis auf wichtige Punkte in der Entwicklungsgeschichte eines Projekts bieten.

kurmann commented 5 months ago

Wann setze ich dann genau den Git-Tag für den Release im Release-Branch? Vor der Zusammenführung mit dem Main-Branch?


Das Setzen eines Git-Tags für einen Release im Release-Branch kann strategisch zu verschiedenen Zeitpunkten erfolgen, je nachdem, wie dein Team den Release-Prozess gestaltet. Hier sind zwei gängige Ansätze:

1. Tagging nach der Zusammenführung in den main-Branch

Vorgehensweise:

Vorteile:

2. Tagging vor der Zusammenführung in den main-Branch

Vorgehensweise:

Vorteile:

Empfehlung

Die Wahl zwischen diesen beiden Ansätzen hängt von deinen spezifischen Anforderungen und deinem Workflow ab. Viele Teams bevorzugen es, den Tag nach dem Merge zu setzen, da dies die Verwaltung vereinfacht und sicherstellt, dass der main-Branch immer den neuesten freigegebenen Stand repräsentiert. Dieser Ansatz ist besonders sinnvoll, wenn:

Unabhängig vom gewählten Ansatz ist es wichtig, eine klare Dokumentation über das Tagging-Verfahren zu haben und sicherzustellen, dass das gesamte Team versteht, wie und wann Tags gesetzt werden. Dies hilft, Inkonsistenzen zu vermeiden und macht den Release-Prozess für alle Beteiligten transparenter.

kurmann commented 5 months ago

Angenommen ich arbeite die meiste Zeit alleine, welches Vorgehen würdest du mir empfehlen?


Wenn du hauptsächlich alleine an deinem Projekt arbeitest, wäre es wichtig, einen Workflow zu wählen, der sowohl effizient ist als auch das Risiko von Fehlern minimiert. Basierend auf dieser Überlegung empfehle ich folgenden Ansatz für die Verwendung von Git-Tags und das Management von Release-Branches:

Empfohlener Workflow

  1. Entwickle in Feature-Branches: Für jede neue Funktion oder jeden Bugfix erstellst du einen eigenen Branch von deinem main-Branch. Dies hält deine Entwicklungen organisiert und isoliert voneinander, was das Testen und Debuggen vereinfacht.

  2. Merge in den main-Branch: Sobald ein Feature oder Fix fertig und getestet ist, merge es in den main-Branch. Da du alleine arbeitest, dient der main-Branch als deine primäre Entwicklungs- und Release-Basis.

  3. Erstelle einen Release-Branch bei Bedarf: Wenn du dich auf ein Release vorbereitest, kannst du einen Release-Branch von main erstellen. Dies ist besonders nützlich, wenn du letzte Anpassungen vornehmen möchtest, wie z.B. das Aktualisieren von Dokumentationen, das Finalisieren von Release-Notes oder kleine Bugfixes, die spezifisch für das Release sind.

  4. Tagging und Releases erstellen:

    • Setze den Tag im main-Branch: Nachdem du alle Änderungen von deinem Release-Branch in den main-Branch gemerged hast, erstelle einen Tag im main-Branch. Dieser Tag markiert den offiziellen Release-Stand. Der Tag sollte nach dem Semantic Versioning Schema benannt werden (z.B., v1.0.0).
    • Erstelle ein GitHub Release: Nutze den erstellten Tag, um ein GitHub Release zu erstellen. Du kannst die zuvor vorbereiteten Release-Notes hinzufügen und das Release veröffentlichen.
  5. Automatisiere, was möglich ist: Da du alleine arbeitest, ist Zeit besonders wertvoll. Überlege, welche Teile deines Release-Prozesses automatisiert werden können, wie z.B. das Erstellen von Builds oder das Deployen deiner Software. GitHub Actions bietet hierfür hervorragende Möglichkeiten.

Vorteile dieses Ansatzes

Schlussgedanke

Dieser Workflow ist eine Empfehlung basierend auf der Prämisse, dass du hauptsächlich allein arbeitest. Es ist wichtig, dass der Workflow zu deiner spezifischen Situation passt und flexibel genug ist, um sich an zukünftige Änderungen in deinem Arbeitsumfeld anzupassen.

kurmann commented 5 months ago

Das Nachführen der Dokumentation würde ich dann wahrscheinlich direkt im Release-Branch vornehmen ohne eigenes Feature.


Das direkte Aktualisieren der Dokumentation im Release-Branch ist eine praktische und effiziente Methode, besonders wenn du alleine arbeitest oder in einem kleinen Team. Dieser Ansatz hat mehrere Vorteile:

Vorteile der Dokumentationsaktualisierung im Release-Branch

  1. Kontextbezogenheit: Wenn du die Dokumentation direkt im Release-Branch aktualisierst, befindet sie sich im Kontext der Änderungen, die für das Release vorgesehen sind. Das erleichtert das Überprüfen und Stellen sicher, dass alle neuen Features oder Änderungen korrekt dokumentiert sind.

  2. Verminderung von Merge-Konflikten: Indem du die Dokumentation in denselben Branch einfügst, der die relevanten Codeänderungen enthält, reduzierst du das Risiko von Merge-Konflikten, die entstehen könnten, wenn Dokumentationsänderungen aus verschiedenen Branches zusammengeführt werden.

  3. Effizienz: Es ist oft effizienter, Dokumentationsänderungen parallel zu den letzten Anpassungen vor dem Release vorzunehmen, da du einen vollständigen Überblick über das haben wirst, was geändert wurde und was dokumentiert werden muss.

Best Practices für die Aktualisierung der Dokumentation im Release-Branch

Abschluss des Release-Prozesses

Nachdem du die Dokumentation im Release-Branch aktualisiert hast, kannst du den Branch in den main-Branch mergen und den Release-Prozess fortsetzen, indem du wie besprochen ein Tag setzt und das Release veröffentlichst. Die aktualisierte Dokumentation wird so ein integraler Bestandteil des Releases, was die Qualität und Benutzerfreundlichkeit deines Produkts erhöht.

kurmann commented 5 months ago

Jetzt wird es spannend. Die Commit-Nachrichten zusammenführen zu Release-Notes möchte ich nicht, zumindest nicht die Commit-Nachrichten innerhalb eines Features.

Ich bin aber sehr interessiert hier einen Automatismus zu etablieren in geeigneter Form.


Automatisierte Release-Notes können eine große Hilfe sein, um den Aufwand für die manuelle Zusammenstellung der Release-Informationen zu reduzieren und gleichzeitig eine konsistente und professionelle Kommunikation zu gewährleisten. Hier sind ein paar Ansätze, wie du automatisierte Release-Notes auf eine Weise implementieren kannst, die nicht einfach nur alle Commit-Nachrichten zusammenfasst:

1. Verwendung von Labels in Pull Requests

Ansatz: Nutze GitHub Labels in deinen Pull Requests, um den Typ der Änderung zu kennzeichnen (z.B. feature, bugfix, enhancement). Du kannst dann ein Skript oder eine GitHub Action verwenden, die nur die Pull Requests mit bestimmten Labels in die Release-Notes aufnimmt.

Implementierung:

2. Manuelle Tags in Commit-Nachrichten

Ansatz: Standardisiere die Verwendung von Tags in deinen Commit-Nachrichten, die angeben, ob ein Commit für die Release-Notes relevant ist. Beispielsweise könntest du eine Konvention einführen, dass Commits, die mit [Include] beginnen, in den Release-Notes erwähnt werden sollten.

Implementierung:

3. CHANGELOG-Datei pflegen

Ansatz: Führe eine manuell gepflegte CHANGELOG.md-Datei im Repository, in der du wichtige Änderungen dokumentierst. Automatisiere den Prozess, um diese Datei als Basis für deine Release-Notes zu verwenden.

Implementierung:

4. Semantic Commit Messages

Ansatz: Verwende ein Format für Commit-Nachrichten, das es ermöglicht, aus diesen Nachrichten automatisch sinnvolle Release-Notes zu generieren. Beispiele für solche Formate sind Conventional Commits.

Implementierung:

Schlussfolgerung

Für Teams oder Einzelpersonen, die eine hohe Qualität und Genauigkeit in ihren Release-Notes suchen, ohne manuellen Aufwand, ist die Einführung eines dieser automatisierten Systeme ideal. Diese Systeme können erheblich zur Reduktion von Fehlern beitragen, die Zeit für die Vorbereitung von Releases optimieren und sicherstellen, dass alle Stakeholder angemessen über Änderungen informiert werden.