Merge Trains in GitLab: wann sie sich lohnen
AI generated
CI/CD
.yml
GitLab · CI/CD · DevOps
Merge Trains
in GitLab: wann sie sich lohnen

Je mehr Merge Requests gleichzeitig gegen denselben geschuetzten Branch antreten, desto groesser das Risiko, dass zwei einzeln erfolgreich getestete Aenderungen sich nach dem Merge gegenseitig kaputt machen. Merge Trains loesen dieses Problem, indem sie jeden Merge Request nicht gegen den aktuellen, sondern gegen den erwarteten zukuenftigen Zustand des Ziel-Branches testen, sequenziell, einer nach dem anderen, wie Waggons in einem Zug.

16 Min. Lesezeit Merge Trains Merge Queue Geschuetzte Branches Semi-lineare Historie

1. Das Problem gleichzeitiger Merges auf einen Branch

Selbst wenn zwei Merge Requests jeweils einzeln eine erfolgreiche Merge-Request-Pipeline durchlaufen haben, ist damit nicht garantiert, dass beide zusammen funktionieren, sobald sie nacheinander in denselben Ziel-Branch gemerged werden. Merge Request A testet gegen den aktuellen Stand von main, Merge Request B testet ebenfalls gegen den aktuellen Stand von main, aber keiner der beiden Tests beruecksichtigt, wie main aussieht, nachdem beide gemerged wurden. Wenn beide Aenderungen an derselben Stelle im Code ansetzen oder sich gegenseitig in ihrer Logik beeinflussen, kann main nach beiden Merges kaputt sein, obwohl jeder einzelne Merge Request fuer sich genommen eine gruene Pipeline hatte.

Dieses Problem, oft als Semantic Merge Conflict bezeichnet, tritt umso haeufiger auf, je mehr Merge Requests gleichzeitig gegen denselben Branch antreten und je hoeher die Merge-Frequenz ist. In Teams, die mehrmals taeglich mehrere Merge Requests gegen main mergen, insbesondere bei geschuetzten Branches mit strikten Anforderungen an eine gruene Pipeline vor jedem Merge, wird dieses Problem schnell zu einem echten operativen Aergernis, weil der Ziel-Branch trotz aller Einzelchecks regelmaessig in einen kaputten Zustand geraet und ein nachtraeglicher Fix-Commit noetig wird.

2. Wie ein Merge Train tatsaechlich funktioniert

Ein Merge Train ist eine geordnete Warteschlange von Merge Requests, die alle fuer denselben geschuetzten Branch vorgesehen sind. Sobald ein Merge Request in den Merge Train aufgenommen wird, erstellt GitLab einen simulierten Zustand, der nicht nur den Feature-Branch mit dem aktuellen Ziel-Branch zusammenfuehrt, sondern zusaetzlich alle bereits vor ihm im Zug eingereihten, noch nicht gemergten Merge Requests beruecksichtigt. Der zweite Merge Request im Zug wird also nicht gegen den heutigen main getestet, sondern gegen einen main-Zustand, der so aussieht, als waere bereits der erste Merge Request im Zug erfolgreich gemerged worden.

Erst wenn die Pipeline fuer diesen kombinierten, simulierten Zustand erfolgreich durchlaeuft, wird der Merge Request tatsaechlich in den echten Ziel-Branch gemerged, und der naechste Merge Request im Zug ruueckt entsprechend nach. Faellt die Pipeline fuer einen Merge Request im Zug fehl, wird genau dieser Merge Request aus dem Zug entfernt, und alle nachfolgenden Merge Requests im Zug werden automatisch neu getestet, jetzt ohne den fehlgeschlagenen Merge Request in ihrer simulierten Basis, damit ein fehlerhafter Merge Request nicht die gesamte Warteschlange blockiert oder gar zu einem kaputten Ziel-Branch fuehrt.


workflow:
  rules:
    - if: '$CI_MERGE_REQUEST_EVENT_TYPE == "merge_train"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

test_in_train:
  stage: test
  script:
    - vendor/bin/phpunit
  rules:
    - if: '$CI_MERGE_REQUEST_EVENT_TYPE == "merge_train"'

3. Aktivierung und Voraussetzungen

Merge Trains sind ein Feature der GitLab Premium- und Ultimate-Stufe und stehen in der kostenlosen Free-Stufe nicht zur Verfuegung, was bei der Bewertung des Aufwand-Nutzen-Verhaeltnisses eine wichtige Randbedingung ist. Aktiviert wird die Funktion in den Projekteinstellungen unter Merge requests durch die Option Enable merged results pipelines gefolgt von Enable merge trains, wobei Merged-Results-Pipelines eine technische Voraussetzung fuer Merge Trains sind, weil beide auf demselben Mechanismus zur Berechnung eines simulierten Merge-Zustands basieren.

Zusaetzlich muss der Ziel-Branch als geschuetzter Branch konfiguriert sein und die Pipeline-Erfolgs-Anforderung fuer Merges aktiviert haben, weil ein Merge Train ohne diese Voraussetzung keinen Sinn ergibt: Der gesamte Mechanismus existiert ja gerade, um automatisiert sicherzustellen, dass nur gruen getestete Aenderungen in den geschuetzten Branch gelangen. Fuer Runner-Kapazitaet bedeutet die Aktivierung zudem, dass bei hoher Merge-Frequenz mehrere vollstaendige Pipeline-Laeufe gleichzeitig oder kurz hintereinander laufen koennen, was ausreichend Runner-Kapazitaet voraussetzt, damit sich Merge-Request-Autoren nicht durch lange Warteschlangen auf freie Runner zusaetzlich ausgebremst fuehlen.

4. Semi-lineare Historie als Nebeneffekt

Ein oft unterschaetzter Vorteil von Merge Trains ist ihr Effekt auf die Git-Historie des Ziel-Branches: Weil jeder Merge Request im Zug nacheinander und nicht parallel gemergt wird, entsteht auf dem Ziel-Branch eine semi-lineare Historie, in der jeder Merge-Commit tatsaechlich auf dem direkt vorherigen Commit aufbaut, statt mehrere gleichzeitig entstandene, parallele Merge-Commits zu verschachteln. Diese Eigenschaft erleichtert spaeteres Bisecting bei der Fehlersuche erheblich, weil git bisect auf einer semi-linearen Historie deutlich zuverlaessiger funktioniert als auf einer Historie mit vielen ueberlappenden Merge-Commits, deren gegenseitige Reihenfolge nicht eindeutig ist.

Diese semi-lineare Historie ist auch fuer Audits und Compliance-Anforderungen wertvoll, weil sich fuer jeden Commit auf dem geschuetzten Branch eindeutig nachvollziehen laesst, in welchem Zustand sich der Branch zum Zeitpunkt dieses Merges befand und welche Pipeline genau diesen Zustand getestet hat. In Branchen mit strengen Nachvollziehbarkeitsanforderungen, etwa im Finanz- oder Gesundheitssektor, ist dieser Nebeneffekt manchmal sogar der eigentliche Hauptgrund fuer die Einfuehrung von Merge Trains, wichtiger noch als die reine Vermeidung von Semantic Merge Conflicts.

5. Der tatsaechliche Kostenaufwand von Merge Trains

Der offensichtlichste Kostenfaktor ist, dass ein Merge Train fuer jeden Merge Request im Zug eine vollstaendige Pipeline gegen den kombinierten simulierten Zustand ausfuehrt, und diese Pipelines muessen bei einer Aenderung am Zug, etwa wenn ein frueherer Merge Request fehlschlaegt, teilweise neu ausgefuehrt werden. Bei einem Zug mit fuenf wartenden Merge Requests und einer typischen Pipeline-Laufzeit von zehn Minuten kann sich die effektive Wartezeit fuer den letzten Merge Request im Zug deutlich verlaengern, verglichen mit einem einzelnen, isolierten Merge-Request-Pipeline-Lauf ohne Warteschlange.

Dieser Effekt verstaerkt sich, wenn Pipelines in der Praxis regelmaessig fehlschlagen, weil jeder Fehlschlag im Zug eine Neuberechnung fuer alle nachfolgenden Merge Requests ausloest. Teams mit einer instabilen Test-Suite, die haeufig flaky Tests enthaelt, also Tests, die ohne inhaltliche Aenderung mal erfolgreich und mal fehlschlagend sind, erleben mit Merge Trains oft eine deutlich schlechtere Erfahrung als ohne, weil sich die Instabilitaet der Tests durch die Kettenreaktion im Zug potenziert statt isoliert zu bleiben. Merge Trains lohnen sich deshalb erst, wenn die zugrunde liegende Pipeline bereits verlaesslich und schnell ist.

6. Wann sich Merge Trains tatsaechlich lohnen

Merge Trains entfalten ihren groessten Nutzen in Teams mit mehreren aktiven Contributor, einer hohen taeglichen Merge-Frequenz auf einen einzigen geschuetzten Branch und einer bereits stabilen, vergleichsweise schnellen Pipeline von wenigen Minuten bis maximal zehn bis fünfzehn Minuten Laufzeit. In dieser Konstellation ist das Risiko von Semantic Merge Conflicts real und die Kosten fuer den zusaetzlichen sequenziellen Testlauf pro Merge Request sind ueberschaubar, weil die Warteschlange durch die kurze Pipeline-Laufzeit nicht ausufert.

Ein zusaetzliches, oft entscheidendes Kriterium ist die tatsaechliche Historie von kaputten main-Branches: Teams, die bereits mehrfach erlebt haben, dass main trotz aller einzeln gruenen Merge-Request-Pipelines kaputt ging, weil sich zwei parallel gemergte Aenderungen gegenseitig gestoert haben, haben den klarsten Beleg fuer den Nutzen von Merge Trains. Wer dieses Problem noch nie erlebt hat, weil die Merge-Frequenz ohnehin niedrig ist oder Merges meist zeitlich weit auseinanderliegen, sollte den zusaetzlichen Konfigurations- und Wartezeit-Aufwand kritisch hinterfragen, bevor Merge Trains eingefuehrt werden.

7. Wann sich Merge Trains nicht lohnen

Bei kleinen Teams mit wenigen Contributor, niedriger Merge-Frequenz oder Pipelines, die laenger als fuenfzehn bis zwanzig Minuten laufen, ist der Aufwand fuer Merge Trains meist nicht gerechtfertigt. Lange Pipeline-Laufzeiten kombiniert mit einer Warteschlange fuehren dazu, dass Entwickler am Ende eines Zuges mehrere Stunden auf ihren tatsaechlichen Merge warten muessen, was die Motivation, ueberhaupt kleine, haeufige Merge Requests einzureichen, untergraebt und paradoxerweise zu groesseren, seltener eingereichten Merge Requests fuehrt, die das urspruengliche Problem eher verschaerfen als loesen.

Auch fuer Projekte ohne echte Premium- oder Ultimate-Lizenz entfaellt die Option ohnehin, und eine Umstellung der GitLab-Lizenzstufe ausschliesslich wegen Merge Trains ist selten wirtschaftlich sinnvoll, wenn nicht ohnehin schon andere Premium-Features wie erweiterte Code-Owner-Regeln oder Epics genutzt werden sollen. In solchen Faellen sind einfachere Alternativen oft ausreichend, etwa eine Teamvereinbarung, Merge Requests zeitlich zu staffeln, oder eine strengere Pflicht, den Feature-Branch unmittelbar vor dem Merge noch einmal gegen den aktuellen Ziel-Branch zu rebasen und die Pipeline erneut laufen zu lassen.

8. Alternativen und Zwischenstufen

Fuer Teams, die den vollen Merge-Train-Mechanismus scheuen, aber trotzdem etwas gegen Semantic Merge Conflicts tun wollen, bietet sich eine einfachere Zwischenstufe an: Merged-Results-Pipelines ohne die eigentliche Zug-Warteschlange testen bereits jeden einzelnen Merge Request gegen einen simulierten Merge-Zustand, ohne die zusaetzliche Sequenzierung mehrerer gleichzeitiger Merge Requests. Dieser Zwischenschritt reduziert das Risiko von Merge-Konflikten, die durch den Ziel-Branch selbst entstehen, deckt aber weiterhin keine Konflikte zwischen zwei gleichzeitig laufenden Merge Requests ab.

Eine weitere pragmatische Alternative ist eine organisatorische Regel, bei der Merge Requests fuer besonders sensible Codebereiche, etwa Datenbank-Migrationen oder zentrale Konfigurationsdateien, manuell nacheinander gemergt werden, waehrend fuer den Rest des Codes das normale, parallele Merge-Request-Pipeline-Verfahren ohne Merge Train ausreicht. Diese selektive Anwendung reduziert den Wartezeit-Overhead auf genau die Bereiche, in denen Semantic Merge Conflicts tatsaechlich am wahrscheinlichsten und am teuersten sind, statt pauschal jeden Merge Request durch die Zug-Warteschlange zu schicken.

9. Fazit: Merge Trains als gezieltes Werkzeug, nicht als Standardeinstellung

Merge Trains loesen ein reales Problem, naemlich Semantic Merge Conflicts zwischen gleichzeitig gemergten Aenderungen auf stark frequentierten geschuetzten Branches, und liefern als Nebeneffekt eine besser nachvollziehbare, semi-lineare Git-Historie. Der Nutzen haengt aber direkt von zwei Faktoren ab: einer bereits stabilen und schnellen Pipeline sowie einer tatsaechlich hohen Merge-Frequenz mit mehreren aktiven Contributor. Fehlen diese Voraussetzungen, erzeugt der Mechanismus vor allem zusaetzliche Wartezeit und Komplexitaet ohne entsprechenden Gegenwert.

Die folgende Tabelle fasst die wichtigsten Entscheidungskriterien fuer oder gegen Merge Trains als praktische Checkliste zusammen.

Kriterium Merge Trains lohnen sich Merge Trains lohnen sich eher nicht Hinweis
Merge-Frequenz auf Ziel-Branch mehrfach taeglich, mehrere Contributor selten, meist ein Merge pro Tag oder weniger geringe Frequenz senkt Konfliktrisiko ohnehin
Pipeline-Laufzeit wenige Minuten bis ca. 15 Minuten ueber 20 Minuten lange Pipelines fuehren zu langen Warteschlangen
Test-Stabilitaet verlaesslich, kaum flaky Tests instabile, haeufig flaky Suite Instabilitaet potenziert sich in der Zug-Warteschlange
GitLab-Lizenzstufe Premium oder Ultimate bereits vorhanden nur Free-Stufe genutzt Lizenz-Upgrade allein wegen Merge Trains selten wirtschaftlich
Historie kaputter Ziel-Branches wiederholt durch Semantic Merge Conflicts noch nie erlebt konkreter Schmerzpunkt ist bester Entscheidungsindikator

Mironsoft

CI/CD-Pipelines, Zero-Downtime-Deployments und Release-Automatisierung

Deployments, die ohne Ausfallzeit und ohne Nervenkitzel laufen?

Wir prüfen bestehende GitLab-Pipelines auf fragile Deployment-Schritte und fehlende Absicherung und bauen daraus einen Release-Prozess mit Zero-Downtime-Deployments, automatisierten Checks und einem Rollback, dem ihr im Ernstfall vertrauen könnt.

Pipeline-Review

Bestehende .gitlab-ci.yml auf Fragilität, fehlende Stages und Sicherheitslücken prüfen.

Zero-Downtime-Deployment

Symlink-Releases, Health-Checks und Rollback-Strategien für Magento-Shops aufbauen.

CI/CD-Automatisierung

Tests, Security-Scans und Deployments zu einer zuverlässigen Pipeline verbinden.

10. Zusammenfassung

Merge Trains: Das Wichtigste auf einen Blick

Kernidee von Merge Trains

Merge Requests werden sequenziell gegen den erwarteten Zustand nach allen vorherigen Merges im Zug getestet, nicht gegen den heutigen Ziel-Branch.

Groesster Nutzen

Vermeidung von Semantic Merge Conflicts bei hoher Merge-Frequenz plus semi-lineare, leichter nachvollziehbare Git-Historie.

Wichtigste Voraussetzung

Eine bereits stabile, schnelle Pipeline, da Fehlschlaege im Zug eine Neuberechnung aller nachfolgenden Merge Requests ausloesen.

Wann eher nicht

Niedrige Merge-Frequenz, lange Pipeline-Laufzeiten oder instabile Test-Suites machen den Aufwand meist nicht wett.

11. FAQ: Merge Trains: Das Wichtigste auf einen Blick

1Was genau testet ein Merge Train, das eine normale Merge-Request-Pipeline nicht testet?
Ein Merge Train testet einen Merge Request gegen einen simulierten Zustand, der nicht nur den aktuellen Ziel-Branch, sondern auch alle vor ihm im Zug eingereihten, noch nicht gemergten Merge Requests beruecksichtigt. Eine normale Merge-Request-Pipeline testet dagegen nur gegen den aktuellen Ziel-Branch, ohne parallel wartende Merge Requests zu beruecksichtigen.
2Sind Merge Trains in der GitLab Free-Stufe verfuegbar?
Nein, Merge Trains sind ein Feature der Premium- und Ultimate-Stufe von GitLab. In der Free-Stufe steht der Mechanismus nicht zur Verfuegung, was bei der Kosten-Nutzen-Abwaegung beruecksichtigt werden sollte.
3Was passiert, wenn ein Merge Request in der Mitte des Zuges fehlschlaegt?
Der fehlgeschlagene Merge Request wird aus dem Zug entfernt, und alle nachfolgenden Merge Requests im Zug werden automatisch neu getestet, diesmal ohne den fehlgeschlagenen Merge Request in ihrer simulierten Basis, damit der Ziel-Branch nicht durch die fehlerhafte Aenderung gefaehrdet wird.
4Verlangsamen Merge Trains grundsaetzlich den Merge-Prozess?
Fuer den letzten Merge Request in einer langen Warteschlange kann sich die Wartezeit deutlich erhoehen, besonders bei langen Pipeline-Laufzeiten. Bei kurzen, stabilen Pipelines und moderater Zuglaenge ist der zusaetzliche Zeitaufwand meist gering.
5Brauche ich Merged-Results-Pipelines, bevor ich Merge Trains aktivieren kann?
Ja, Merged-Results-Pipelines sind eine technische Voraussetzung fuer Merge Trains, weil beide Funktionen auf demselben Mechanismus zur Berechnung eines simulierten Merge-Zustands basieren. Merge Trains muessen deshalb zusaetzlich zu Merged-Results-Pipelines aktiviert werden.
6Warum verbessert sich die Git-Historie durch Merge Trains?
Weil Merge Requests im Zug nacheinander statt parallel gemergt werden, entsteht eine semi-lineare Historie, in der jeder Merge-Commit auf dem direkt vorherigen aufbaut. Das erleichtert Werkzeuge wie git bisect erheblich gegenueber einer Historie mit vielen ueberlappenden, parallelen Merge-Commits.
7Was passiert bei flaky Tests innerhalb eines Merge Trains?
Ein zufaellig fehlschlagender Test loest dieselbe Kettenreaktion aus wie ein echter Fehler: Der betroffene Merge Request wird aus dem Zug entfernt und alle nachfolgenden Merge Requests werden neu getestet. Instabile Test-Suites verschlechtern deshalb die Merge-Train-Erfahrung deutlich staerker als eine normale Pipeline ohne Zug.
8Muss der Ziel-Branch fuer Merge Trains geschuetzt sein?
Ja, der Ziel-Branch muss als geschuetzter Branch konfiguriert sein und die Pipeline-Erfolgs-Anforderung fuer Merges aktiviert haben, weil Merge Trains ohne diese Voraussetzung ihren Zweck verfehlen wuerden.
9Gibt es eine einfachere Alternative zu vollen Merge Trains?
Ja, Merged-Results-Pipelines ohne die eigentliche Zug-Warteschlange testen bereits jeden Merge Request gegen einen simulierten Merge-Zustand, ohne die zusaetzliche Sequenzierung mehrerer gleichzeitig wartender Merge Requests. Das deckt einen Teil des Nutzens bei geringerem Wartezeit-Overhead ab.
10Ab welcher Teamgroesse lohnen sich Merge Trains typischerweise?
Eine feste Teamgroesse gibt es nicht, entscheidend ist die tatsaechliche Merge-Frequenz auf denselben geschuetzten Branch. Teams mit mehreren aktiven Contributor, die mehrfach taeglich gegen denselben Branch mergen, profitieren typischerweise deutlich mehr als kleine Teams mit gelegentlichen Merges.