Merge Request Approval Rules in GitLab: Pflichtpruefer richtig konfigurieren
AI generated
CI/CD
.yml
GitLab · Code Review · Team-Workflow
Merge Request Approval Rules
Pflichtpruefer statt Ehrenkodex

Approval Rules sorgen dafuer, dass Code-Reviews nicht vom guten Willen einzelner Entwickler abhaengen, sondern technisch erzwungen werden, mit CODEOWNERS-Integration, Mindestanzahl an Freigaben und klaren Regeln fuer Ausnahmen.

17 Min. Lesezeit CODEOWNERS Branch Protection Merge Checks

1. Warum ein Vier-Augen-Prinzip allein nicht reicht

Viele Teams fuehren Code Reviews als organisatorische Regel ein: Jeder Merge Request braucht ein Approval, bevor er gemerged wird. Das klingt zunaechst nach einer soliden Grundlage, scheitert in der Praxis aber regelmaessig an der Durchsetzung. Ohne technische Absicherung kann jedes Teammitglied mit ausreichenden Rechten die Regel schlicht ignorieren, sei es aus Zeitdruck, Unwissenheit oder weil ein Hotfix schnell raus muss. Am Ende des Quartals stellt sich dann heraus, dass ein Viertel aller Merges ohne echtes Review passiert ist.

GitLab loest dieses Problem mit Approval Rules, die auf Projekt- oder Merge-Request-Ebene definiert werden und in Kombination mit Branch Protection technisch verhindern, dass ein Merge Request ohne die geforderten Freigaben in den geschuetzten Branch gelangt. Der entscheidende Unterschied zur reinen Teamregel: Die Durchsetzung liegt nicht mehr bei den Entwicklern, sondern bei der Plattform selbst. Das reduziert Diskussionen ueber Ausnahmen erheblich, weil die Regel fuer alle gleich gilt und nicht individuell interpretiert werden kann.

2. CODEOWNERS als Basis fuer bereichsbezogene Pruefpflichten

Die CODEOWNERS-Datei im Projektroot (oder unter .gitlab/ bzw. docs/) definiert, welche Personen oder Gruppen fuer bestimmte Pfade im Repository verantwortlich sind. GitLab liest diese Datei aus und kann daraus automatisch Approval Rules ableiten, sodass etwa Aenderungen am Zahlungsmodul zwingend von der Payments-Gruppe freigegeben werden muessen, waehrend Frontend-Aenderungen von einem anderen Team geprueft werden. Das verhindert, dass ein Reviewer Code freigibt, fuer dessen fachlichen Kontext er gar nicht zustaendig ist.

Wichtig ist die Reihenfolge der Regeln: Spaetere, spezifischere Eintraege ueberschreiben fruehere, allgemeinere. Ein Wildcard-Eintrag * am Anfang der Datei deckt das gesamte Repository ab, waehrend gezielte Pfadmuster weiter unten fuer kritische Bereiche wie app/code/Vendor/Payment/ zusaetzliche, striktere Anforderungen definieren. So laesst sich ein abgestuftes Schutzniveau abbilden, ohne dass jede einzelne Datei manuell gepflegt werden muss.


# .gitlab/CODEOWNERS

# Standardregel: mindestens ein Review aus dem Core-Team
* @mironsoft/core-reviewers

# Zahlungs- und Checkout-Code: zwingend Payments-Team
app/code/Vendor/Payment/**       @mironsoft/payments-team
app/code/Vendor/Checkout/**      @mironsoft/payments-team @security-lead

# Frontend/Theme: Frontend-Team ist zustaendig
app/design/frontend/**           @mironsoft/frontend-team

# CI/CD-Konfiguration: nur Platform-Team darf Pipelines aendern
.gitlab-ci.yml                   @mironsoft/platform-team
/ci/**                           @mironsoft/platform-team

3. Mindestanzahl an Freigaben pro Regelgruppe festlegen

Neben der CODEOWNERS-Zuordnung erlaubt GitLab, fuer jede Approval-Gruppe eine eigene Mindestanzahl an Freigaben zu definieren. Ein einzelnes Approval reicht fuer die meisten Aenderungen, aber sicherheitskritische Bereiche wie Authentifizierung oder Zahlungsabwicklung profitieren von zwei unabhaengigen Freigaben aus unterschiedlichen Teams. Diese Granularitaet ist der eigentliche Mehrwert gegenueber einer globalen Ein-Approval-Regel, weil sie Aufwand und Risiko in ein sinnvolles Verhaeltnis setzt, statt jeden Tippfehler-Fix genauso streng zu behandeln wie eine Aenderung an der Zahlungslogik.

In der Projektkonfiguration unter Settings > Merge requests > Merge request approvals lassen sich mehrere Regeln parallel definieren, jede mit eigener Zielgruppe, eigenem Pfadfilter und eigener Mindestanzahl. GitLab wertet bei einem Merge Request alle zutreffenden Regeln aus und verlangt, dass jede einzelne erfuellt ist, bevor der Merge-Button aktiv wird. Das erlaubt eine feingranulare Eskalationslogik, ohne dass ein separates externes Tool noetig ist.


# Beispielhafte Approval-Rule-Definition via GitLab API
# (POST /projects/:id/approval_rules)
{
  "name": "Payments Security Review",
  "approvals_required": 2,
  "user_ids": [],
  "group_ids": [4821, 4903],
  "protected_branch_ids": [1],
  "applies_to_all_protected_branches": false
}

# Zweite, allgemeinere Regel fuer den Rest des Codes
{
  "name": "Standard Code Review",
  "approvals_required": 1,
  "group_ids": [4711],
  "applies_to_all_protected_branches": true
}

4. Typische Umgehungsmoeglichkeiten und warum sie entstehen

Selbst gut konfigurierte Approval Rules haben Schlupfloecher, wenn andere Einstellungen nicht mitziehen. Der haeufigste Fall: Ein Projekt-Maintainer besitzt genug Rechte, um Branch-Protection-Regeln temporaer zu aendern oder den Merge Request direkt per Push in den geschuetzten Branch zu umgehen. Ohne eine explizite Einschraenkung koennen Nutzer mit der Rolle Maintainer zudem Approval Rules pro Merge Request nachtraeglich anpassen und Pruefer entfernen, was den gesamten Mechanismus aushebelt, wenn niemand diese Aenderung bemerkt.

Ein zweites, subtileres Problem ist die Selbstfreigabe: Standardmaessig kann der Autor eines Merge Requests seine eigene Aenderung nicht freigeben, aber ohne die Option "Prevent approval by author" aktiviert zu haben, gilt das nicht in jeder GitLab-Konfiguration verlaesslich, insbesondere bei aelteren Projekten, die vor Einfuehrung dieser Einstellung angelegt wurden. Auch die Moeglichkeit, committende Personen als Pruefer zuzulassen, hoehlt das Vier-Augen-Prinzip aus, wenn zwei Entwickler sich gegenseitig ungeprueft durchwinken.

5. Umgehung bewusst einschraenken: die relevanten Schalter

GitLab bietet unter Settings > Merge requests mehrere Schalter, die gezielt gegen die oben beschriebenen Schlupfloecher wirken. Prevent approval by author verhindert, dass der MR-Ersteller sein eigenes Approval zaehlt. Prevent approvals by users who add commits schliesst die Luecke, dass jemand nach der initialen Freigabe unbemerkt weiteren Code nachschiebt. Prevent editing approval rules in merge requests verbietet es Maintainern, Regeln pro MR aufzuweichen, sodass nur zentrale Projekteinstellungen greifen.

Fuer wirklich kritische Repositories empfiehlt sich zusaetzlich, die Berechtigung zum Aendern von Branch-Protection-Regeln auf einen sehr kleinen Personenkreis zu beschraenken und Code owner approval required fuer den geschuetzten Branch zu aktivieren. Dadurch kann selbst ein Maintainer den CODEOWNERS-Zwang nicht mehr per Klick umgehen, sondern muesste die Branch-Protection-Konfiguration explizit und nachvollziehbar aendern, was in einem Audit-Log sichtbar bleibt.


# Relevante Einstellungen ueber die GitLab API setzen
curl --request PUT \
  --header "PRIVATE-TOKEN: <token>" \
  "https://gitlab.example.com/api/v4/projects/123/approval_rules/settings" \
  --data "prevent_approval_by_author=true" \
  --data "prevent_approval_by_commit_author=true" \
  --data "disable_overriding_approvers_per_merge_request=true"

6. Notfall-Hotfixes: Ausnahmen dokumentieren statt Regeln aufweichen

Der klassische Einwand gegen strikte Approval Rules lautet: "Was, wenn nachts ein kritischer Fehler live behoben werden muss und kein Pruefer erreichbar ist?" Die falsche Antwort darauf ist, die Regel dauerhaft aufzuweichen. Die richtige Antwort ist ein dokumentierter Ausnahmeprozess: ein kleiner, namentlich benannter Kreis von Personen mit der Rolle Owner darf im Notfall Branch-Protection-Regeln temporaer aendern, muss dies aber in einem Incident-Ticket begruenden und die Aenderung nach Behebung des Problems sofort rueckgaengig machen.

Praktisch bewaehrt sich eine feste Checkliste fuer solche Faelle: Ausnahme im Team-Chat ankuendigen, Ticket-Referenz im Merge Request verlinken, nach dem Merge ein nachtraegliches Review durch ein zweites Teammitglied einholen und die temporaere Rechteanpassung binnen 24 Stunden zuruecksetzen. Dieser Prozess erhaelt die Sicherheit der Regel, ohne im Ernstfall zum Hindernis zu werden, und macht jede Ausnahme im Audit-Log sichtbar statt sie stillschweigend zu ermoeglichen.

7. Approval-Events nachvollziehen: wer hat wann was freigegeben

GitLab protokolliert jede Freigabe, jede Entfernung eines Approvals und jede Aenderung an Approval Rules im projektbezogenen Audit-Log (bei Premium/Ultimate-Lizenzen auch gruppenweit). Diese Historie ist mehr als eine Formalitaet: Sie erlaubt es, im Nachhinein zu klaeren, warum ein bestimmter Merge Request trotz kritischer Aenderungen nur ein statt zwei Freigaben hatte, oder ob eine Regel kurzfristig deaktiviert wurde. Fuer regulierte Branchen oder ISO-27001-Audits ist dieses Log oft ein Pflichtnachweis fuer funktionierende Change-Management-Prozesse.

Ueber die API laesst sich der Freigabestatus jedes Merge Requests auch automatisiert auswerten, etwa um ein monatliches Reporting zu erzeugen, wie viele Merge Requests ohne die geforderte Mindestanzahl an Freigaben gemerged wurden (was bei korrekt konfigurierten Regeln null sein sollte) oder wie oft die Notfall-Ausnahme tatsaechlich gezogen wurde. Ein Anstieg dieser Zahl ist meist ein Signal, dass entweder die Personaldecke im Reviewer-Pool zu duenn ist oder die Regeln an der falschen Stelle zu streng greifen.


# Freigabestatus eines Merge Requests per API abfragen
curl --header "PRIVATE-TOKEN: <token>" \
  "https://gitlab.example.com/api/v4/projects/123/merge_requests/456/approvals" \
  | jq '{approved: .approved, approved_by: [.approved_by[].user.username]}'

8. Schrittweise Einfuehrung statt Big-Bang-Umstellung

Approval Rules von heute auf morgen mit maximaler Strenge einzufuehren, fuehrt in gewachsenen Teams meist zu Frust und findigen Umgehungsversuchen. Bewaehrt hat sich ein dreistufiges Vorgehen: Zunaechst wird nur eine einzige, allgemeine Regel mit einer Mindestfreigabe fuer das gesamte Repository aktiviert, ohne CODEOWNERS-Differenzierung. Nach zwei bis drei Wochen Gewoehnung folgt die Aufteilung in fachliche Bereiche per CODEOWNERS, sodass Teams gezielt fuer ihre eigenen Module verantwortlich werden.

Erst in der dritten Stufe werden die haerteren Schalter wie Prevent approval by author und erhoehte Mindestanzahlen fuer sicherheitskritische Pfade aktiviert, begleitet von einer kurzen Team-Kommunikation, warum diese Aenderung sinnvoll ist. Dieses stufenweise Vorgehen erzeugt Akzeptanz, weil Entwickler die Regeln als Unterstuetzung statt als buerokratische Huerde erleben, und reduziert die Zahl der Ausnahmeantraege in der Einfuehrungsphase spuerbar.

9. Haeufige Fehler bei der Konfiguration und wie man sie vermeidet

Ein wiederkehrender Fehler ist, Approval Rules zu definieren, ohne den Ziel-Branch tatsaechlich als Protected Branch zu markieren. Ohne diesen Schutz lassen sich Aenderungen weiterhin per direktem Push umgehen, unabhaengig davon, wie streng die Merge-Request-Regeln konfiguriert sind. Ebenso haeufig ist eine CODEOWNERS-Datei mit ueberlappenden, widerspruechlichen Pfadmustern, bei denen am Ende niemand mehr genau weiss, welche Gruppe fuer welchen Ordner tatsaechlich verantwortlich ist.

Die folgende Tabelle fasst die wichtigsten Stellschrauben zusammen und zeigt, welches Verhalten sie jeweils absichern. Sie eignet sich als Checkliste fuer ein Konfigurations-Review, bevor Approval Rules produktiv fuer ein kritisches Repository scharf geschaltet werden.

Einstellung Schuetzt gegen Empfohlen fuer Ort in GitLab
CODEOWNERS-Datei Reviews durch fachfremde Personen Alle Projekte mit mehreren Teams .gitlab/CODEOWNERS
Approvals required >= 2 Einzelmeinung als einzige Kontrollinstanz Zahlungs-, Auth- und Security-Code Settings > Merge request approvals
Prevent approval by author Selbstfreigabe durch den MR-Ersteller Alle geschuetzten Branches Settings > Merge request approvals
Prevent approvals by commit authors Nachtraegliches, ungeprueftes Nachschieben von Code Alle geschuetzten Branches Settings > Merge request approvals
Disable overriding rules per MR Aufweichen der Regeln durch Maintainer im Einzelfall Kritische und regulierte Repositories Settings > Merge request approvals

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

Approval Rules: Das Wichtigste auf einen Blick

CODEOWNERS

Bereichsbezogene Pflichtpruefer statt globaler Ein-Groesse-fuer-alle-Regel.

Mindestanzahl

Je nach Kritikalitaet ein oder zwei unabhaengige Freigaben pro Regelgruppe.

Schutz vor Umgehung

Prevent-Schalter fuer Selbstfreigabe und nachtraegliche Commits aktivieren.

Notfallprozess

Dokumentierte, zeitlich begrenzte Ausnahme statt dauerhaft aufgeweichter Regel.

11. FAQ: Approval Rules: Das Wichtigste auf einen Blick

1Was ist der Unterschied zwischen Branch Protection und Approval Rules?
Branch Protection verhindert direkten Push in einen Branch und erzwingt Merge Requests. Approval Rules legen zusaetzlich fest, wie viele Personen aus welchen Gruppen einen Merge Request freigeben muessen, bevor er gemerged werden darf. Beide Mechanismen greifen erst gemeinsam vollstaendig.
2Kann ich CODEOWNERS auch ohne GitLab Premium nutzen?
Die CODEOWNERS-Datei selbst funktioniert in der GitLab Free-Stufe, allerdings ist die automatische Ableitung von Approval Rules mit erzwungener Mindestanzahl und Code-Owner-Pflichtfreigabe fuer geschuetzte Branches eine Premium-Funktion.
3Wie verhindere ich, dass Entwickler sich gegenseitig ungeprueft durchwinken?
Kombiniere eine ausreichende Mindestanzahl an Freigaben mit CODEOWNERS-Zuordnung auf Teamebene und aktiviere regelmaessige Stichproben-Audits der Approval-Historie, um Muster wie wechselseitige Freigaben ohne inhaltliche Kommentare zu erkennen.
4Was passiert, wenn ein Code-Owner im Urlaub ist?
Definiere Code-Owner immer als Gruppe statt als einzelne Person, damit mehrere Teammitglieder freigabeberechtigt sind. Zusaetzlich sollte ein dokumentierter Eskalationsweg fuer den Fall existieren, dass eine ganze Gruppe kurzfristig nicht verfuegbar ist.
5Sollte jede Aenderung an .gitlab-ci.yml eine eigene Approval Rule bekommen?
Ja, das ist sinnvoll, da Pipeline-Aenderungen weitreichende Auswirkungen auf Deployments und Secrets-Handling haben koennen. Eine dedizierte CODEOWNERS-Zeile fuer .gitlab-ci.yml mit dem Platform-Team als Pflichtpruefer ist eine gaengige Absicherung.
6Wie viele Approval Rules sind pro Projekt sinnvoll?
In der Praxis reichen meist drei bis fuenf Regeln: eine allgemeine Standardregel und zwei bis vier spezialisierte Regeln fuer kritische Bereiche wie Zahlungen, Authentifizierung und CI/CD-Konfiguration. Zu viele Regeln erschweren die Uebersicht und die Fehlersuche bei blockierten Merge Requests.
7Kann ich Approval Rules mit externen Tools wie Jira verknuepfen?
Direkt unterstuetzt GitLab das nicht, aber ueber Webhooks und die API lassen sich Approval-Events an externe Systeme melden, etwa um automatisch ein Jira-Ticket zu aktualisieren, sobald die geforderte Freigabeanzahl erreicht ist.
8Was ist der Unterschied zwischen optionalen und erforderlichen Approvals?
Optionale Reviewer werden lediglich zur Kenntnisnahme benachrichtigt und blockieren den Merge nicht. Erforderliche Approvals aus einer Approval Rule zaehlen dagegen auf die Mindestanzahl an und muessen erfuellt sein, bevor der Merge-Button aktiv wird.
9Wie gehe ich mit sehr grossen, lange laufenden Merge Requests um?
Grosse Merge Requests sollten nach Moeglichkeit in kleinere, unabhaengig review-bare Teile aufgeteilt werden. Wo das nicht moeglich ist, hilft eine zusaetzliche Zwischenfreigabe nach thematischen Meilensteinen, damit nicht ein einzelner Reviewer wochenlang den gesamten Kontext im Kopf behalten muss.
10Muss ich Approval Rules manuell pflegen oder gibt es Vorlagen?
GitLab erlaubt es, Approval-Rule-Konfigurationen ueber Gruppeneinstellungen zentral vorzugeben und auf alle Projekte einer Gruppe zu vererben. Das reduziert manuellen Pflegeaufwand erheblich und stellt sicher, dass neue Projekte automatisch mit sinnvollen Standardregeln starten.