Lab 23: Release Day¶
Hintergrund¶
Heute ist Release-Tag. Ein Setup-Skript simuliert mehrere Wochen Entwicklung: Feature-Branches, ein versteckter Bug, unsaubere Commits und ein dringender Hotfix-Request. Du durchläufst den gesamten Release-Zyklus — und räumst dabei die Vergangenheit auf.
Dieses Lab ist die Abschlussübung und integriert nahezu alle bisher gelernten Konzepte: Bisect, Interactive Rebase, Cherry-Pick, Tags, Release-Branches und Hotfixes.
Vorbereitung¶
Öffne das Terminal im Verzeichnis labs/23-release-workflow/exercise.
Das Repository enthält:
- ~25 Commits auf
main, die mehrere Wochen Entwicklung simulieren - Einem Bug, der irgendwann eingebaut wurde
- Einem Feature-Branch
feature/invoice-exportmit unsauberen Commits - Dem Tag
v1.0.0als letzte Release-Version
Verschaffe dir einen Überblick:
git log --oneline --graph --all
git tag
git branch
Phase 1: Bug-Report — git bisect¶
Ein Kunde meldet: "Die Berechnung in src/Calculator.al ist falsch —
quantity + unitPrice statt quantity * unitPrice."
Der Bug war in v1.0.0 noch nicht da, ist aber jetzt auf main vorhanden.
Irgendwann zwischen Tag v1.0.0 und HEAD wurde er eingebaut.
Aufgabe: Finde den schuldigen Commit mit git bisect.
- Starte die Session:
git bisect start - Markiere
HEADals schlecht undv1.0.0als gut. - Bei jedem Schritt: Prüfe
src/Calculator.al. Steht dortquantity * unitPrice(gut) oderquantity + unitPrice(schlecht)? - Notiere den schuldigen Commit (Hash und Message).
- Beende:
git bisect reset
Bonusaufgabe: Automatisiere den Bisect mit einem Test-Skript:
git bisect start HEAD v1.0.0
git bisect run grep -q "quantity \* unitPrice" src/Calculator.al
Diskussion: Wie viele Schritte hast du gebraucht? Wie viele wären es bei linearer Suche gewesen?
Phase 2: Bug fixen¶
Erstelle einen Bugfix direkt auf main:
- Korrigiere
src/Calculator.al(zurück zuquantity * unitPrice). - Committe mit einer Message, die auf den schuldigen Commit referenziert:
Fix calculation: use multiplication instead of addition
Introduced in <hash>. Reported by customer.
Phase 3: Feature-Branch aufräumen¶
Der Branch feature/invoice-export hat 5-6 Commits mit Messages wie "WIP",
"fix", "asdf", "forgot file". Bevor du einen PR erstellst, räumst du auf.
Aufgabe:
- Wechsle auf den Branch.
- Prüfe die Commits:
git log --oneline main..HEAD - Nutze Interactive Rebase:
git rebase -i main
- Im Editor:
- Squashe zusammengehörige Commits (
fixupodersquash) - Benenne WIP-Commits um (
reword) - Entferne den Commit, der offensichtlich nicht dazugehört (
drop) - Aktualisiere den Branch auf den neuesten
main-Stand (Rebase statt Merge):
git rebase main
- Prüfe das Ergebnis: Saubere, wenige Commits mit guten Messages.
Phase 4: Release vorbereiten¶
Der neue Release soll Version 1.1.0 werden.
Aufgabe:
- Merge den aufgeräumten Feature-Branch in
main. - Erstelle einen Release-Branch:
git switch -c release/1.1.0
- Bumpe die Version in
app.jsonauf1.1.0.0. - Prüfe, was seit v1.0.0 passiert ist:
git log --oneline v1.0.0..release/1.1.0
- Erstelle eine
CHANGELOG.mdaus der Git-Historie:
git log --pretty=format:"- %s" v1.0.0..release/1.1.0
Phase 5: Hotfix unter Druck¶
Während du das Release vorbereitest, meldet ein Kunde einen kritischen Bug in
v1.0.0: Der Publisher in app.json ist falsch. Das muss sofort gepatcht
werden — auf der Live-Version.
Aufgabe:
- Erstelle einen Hotfix-Branch von
v1.0.0:
git switch -c hotfix/v1.0.1 v1.0.0
- Korrigiere den Publisher und bumpe die Version auf
1.0.0.1. - Committe und tagge:
git tag -a v1.0.1 -m "Hotfix: fix publisher info"
- Cherry-Picke den Fix in den Release-Branch:
git switch release/1.1.0
git cherry-pick <hash>
- Cherry-Picke den Fix auch in
main:
git switch main
git cherry-pick <hash>
- Löse eventuelle Konflikte (die Versionen unterscheiden sich — behalte
jeweils die Version des Zielbranches, aber übernimm den Fix). Prüfe
nach jedem Cherry-Pick die Version in
app.json— auch wenn kein Konflikt auftritt, könnte die Version ungewollt überschrieben worden sein.
Phase 6: Release abschließen¶
- Wechsle zum Release-Branch.
- Prüfe, dass der Hotfix enthalten ist.
- Setze den Release-Tag:
git tag -a v1.1.0 -m "Release 1.1.0"
- Merge den Release-Branch in
main. - Räume auf:
git branch -d release/1.1.0
git branch -D hotfix/v1.0.1
Warum
-Dstatt-d? Der Hotfix-Branch wurde per Cherry-Pick inmainundrelease/1.1.0übernommen, aber nie direkt gemergt. Git erkennt Cherry-Picks nicht als Merge und betrachtet den Branch daher als "nicht vollständig gemergt". Mit-D(Großbuchstabe) erzwingst du das Löschen.
- Prüfe das Endergebnis:
git tag
git log --oneline --graph --all