Nachdem wir die fundamentalen Git-Konzepte und allgemeinen Best Practices behandelt haben, wenden wir uns nun GitLab als konkreter Plattform zu. Dieses Kapitel fokussiert auf Merge Requests – GitLabs Mechanismus für Code Review und Integration – und die spezifischen Features, die GitLab für Qualitätssicherung und Kollaboration bietet.
Merge Requests (MRs) sind GitLabs Äquivalent zu GitHubs Pull Requests. Die Konzepte sind identisch, aber GitLab bietet zusätzliche Integrationsmöglichkeiten mit CI/CD, Security-Scanning und Approval-Workflows, die wir im Detail betrachten werden.
Bisher haben wir Git als verteiltes Versionskontrollsystem behandelt – ein Tool, das lokal und auf jedem Server läuft. GitLab ist eine Plattform um Git herum, die zusätzliche Funktionen bietet:
Git selbst kennt keine “Merge Requests”. Das ist eine Abstraktion der Hosting-Plattform. Technisch ist ein Merge Request eine Kombination aus: - Einem Branch (der zu mergende Code) - Metadaten (Beschreibung, Assignees, Labels) - Diskussionen (Kommentare, Reviews) - CI/CD Pipelines (automatisierte Checks) - Approval-State (wer hat genehmigt)
Alles außer dem Branch ist GitLab-spezifisch und liegt nicht in
.git/, sondern in GitLabs Datenbank.
Der typische Workflow:
# 1. Feature-Branch erstellen
git checkout -b feature/payment-gateway
# 2. Entwickeln, committen
git add .
git commit -m "feat(payment): add Stripe integration"
# 3. Branch pushen
git push origin feature/payment-gatewayNach dem Push zeigt GitLab automatisch einen Link zum Erstellen eines Merge Requests:
remote:
remote: To create a merge request for feature/payment-gateway, visit:
remote: https://gitlab.com/myproject/-/merge_requests/new?merge_request[source_branch]=feature/payment-gateway
Alternativ: Direkt in der GitLab-Weboberfläche unter “Merge Requests” → “New merge request”.
Ein vollständiger Merge Request besteht aus:
Header: - Titel: Klar, beschreibend
(oft aus erstem Commit übernommen) - Source Branch: Der
Branch mit Änderungen (feature/payment-gateway) -
Target Branch: Wohin mergen (main,
develop)
Body: - Beschreibung:
Markdown-formatiert, erklärt “Warum” und “Was” -
Issue-Verlinkung: Closes #123,
Related to #456 - Checklists:
- [ ] Tests added, - [ ] Docs updated
Sidebar: - Assignee: Wer ist
verantwortlich - Reviewers: Wer soll reviewen -
Labels: bug, feature,
high-priority - Milestone: Sprint,
Release-Version - Approval Status: X von Y
Approvals
Tabs: - Overview: Beschreibung, Diskussion - Commits: Alle Commits im Branch - Changes: Unified Diff, Side-by-Side View - Pipelines: CI/CD Status - Security: SAST, DAST, Dependency Scan Ergebnisse
.gitlab/merge_request_templates/Default.md:
## Problem
<!-- Welches Problem löst dieser MR? -->
## Solution
<!-- Wie wird das Problem gelöst? -->
## Changes
<!-- Technische Änderungen, kurz aufgelistet -->
-
-
## Testing
<!-- Wie wurde getestet? -->
- [ ] Unit Tests
- [ ] Integration Tests
- [ ] Manual Testing
## Screenshots / Videos
<!-- Falls UI-Änderungen -->
## Checklist
- [ ] Tests hinzugefügt/aktualisiert
- [ ] Dokumentation aktualisiert
- [ ] Keine Breaking Changes (oder dokumentiert)
- [ ] CI Pipeline grün
- [ ] Ready for Review
Closes #Bei MR-Erstellung wird dieses Template automatisch eingefügt. Fördert Konsistenz und Vollständigkeit.
Der mächtigste Aspekt von GitLab MRs: automatisierte CI/CD Pipelines laufen bei jedem Push.
In .gitlab-ci.yml können Pipeline-Jobs spezifisch für
MRs konfiguriert werden:
stages:
- build
- test
- security
- deploy
# Läuft bei allen Commits
build:
stage: build
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
# Läuft bei allen Commits
test:
stage: test
script:
- npm test
coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
# Nur in Merge Requests
test:integration:
stage: test
script:
- npm run test:integration
only:
- merge_requests
# Security Scanning nur in MRs
security:sast:
stage: security
image: returntocorp/semgrep
script:
- semgrep --config auto --json -o sast-report.json
artifacts:
reports:
sast: sast-report.json
only:
- merge_requests
# Deploy Preview nur in MRs
deploy:preview:
stage: deploy
script:
- deploy.sh $CI_MERGE_REQUEST_IID
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_COMMIT_REF_SLUG.preview.example.com
on_stop: stop_preview
only:
- merge_requests
stop_preview:
stage: deploy
script:
- cleanup.sh $CI_MERGE_REQUEST_IID
when: manual
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
only:
- merge_requestsGitLab stellt Umgebungsvariablen für MR-Kontext bereit:
print_mr_info:
script:
- echo "MR IID: $CI_MERGE_REQUEST_IID"
- echo "MR Title: $CI_MERGE_REQUEST_TITLE"
- echo "Source Branch: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"
- echo "Target Branch: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
- echo "Author: $GITLAB_USER_EMAIL"
only:
- merge_requestsNützlich für dynamische Preview-URLs, Benachrichtigungen, Kontext-spezifische Deployments.
GitLab kann MRs nur mergen lassen, wenn Pipeline erfolgreich:
Projekt-Einstellungen → Merge Requests → Merge Checks: - ☑ Pipelines must succeed - ☑ All threads must be resolved - ☑ Status checks must pass
Pipeline fehlgeschlagen → Merge-Button disabled. Erzwingt Qualität.
GitLab kann Code Quality Metriken aus der Pipeline extrahieren:
code_quality:
stage: test
image: docker:stable
services:
- docker:dind
script:
- docker run --rm
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
codeclimate/codeclimate analyze -f json > code-quality.json
artifacts:
reports:
codequality: code-quality.jsonGitLab zeigt Code Quality-Änderungen direkt im MR:
Code Quality
3 issues found (-2 from target branch)
▲ Complexity increased in calculateTotal() (from 5 to 12)
▼ Duplication removed in UserService
✓ ESLint violations reduced by 5
Reviewer sehen auf einen Blick, ob Code-Qualität besser oder schlechter wurde.
GitLab bietet Approval Rules: Definiere, wer wieviele Approvals geben muss, bevor ein MR merged werden kann.
Projekt-Einstellungen → Merge Requests → Approval Rules:
Rule: Default
Approvals required: 2
Eligible Approvers: All project members
Jeder MR braucht 2 Approvals von beliebigen Projekt-Mitgliedern.
.gitlab/CODEOWNERS:
# Backend Team muss Backend-Änderungen approven
/backend/** @backend-team
# Frontend Team muss Frontend-Änderungen approven
/frontend/** @frontend-team
# Security Team muss Auth-Änderungen approven
/backend/auth/** @security-team
# Tech Lead muss CI/CD-Änderungen approven
.gitlab-ci.yml @tech-lead
Approval Rule:
Rule: Code Owners
Approvals required: 1 per code owner
Code Owner Approval: Required
Ein MR, der /backend/auth/ ändert, braucht Approval von:
1. Jemand aus @backend-team 2. Jemand aus
@security-team
Projekt-Einstellungen → Merge Requests → Approval Rules → Add approval rule:
Rule Name: High Risk Changes
Target Branch: main
Files: *.sql, database/migrations/*
Approvals required: 3
Eligible Approvers: @database-admins
MRs mit Database-Migrations brauchen 3 Approvals von Database-Admins. Automatisch detektiert.
Rule: Security Review
Approvals required: 1
Eligible Approvers: @security-team
Trigger: On Security Vulnerability found
Wenn SAST/DAST/Dependency Scan Vulnerabilities findet → Security Team muss approven.
GitLab bietet mehrere View-Modi für Diffs:
Inline View: Alte und neue Version untereinander
- const timeout = 30
+ const timeout = 60Side-by-Side View: Alte und neue Version nebeneinander (besser für große Änderungen)
Kommentare: Click auf Zeile → Kommentar schreiben - Single Line Comments: Kommentar zu einer Zeile - Multi Line Comments: Kommentar zu Bereich (Zeile X bis Y) - Discussions: Threads mit Replies - Resolvable Threads: “Resolve”-Button, Tracking von offenen Punkten
Reviewer können direkte Code-Änderungen vorschlagen:
```suggestion
const timeout = 60;
`` `Author kann Suggestion mit einem Click übernehmen → automatisch committed. Beschleunigt Review-Zyklen.
GitLab zeigt Review-Status prominent:
Reviews
✓ Approved by @jane (2 hours ago)
⏳ Pending from @bob
⏳ Pending from @alice
Discussions
5 threads (2 unresolved)
Klar ersichtlich, wer noch reviewen muss, welche Diskussionen offen sind.
In Kommentaren können Quick Actions genutzt werden:
/approve - MR approven
/unapprove - Approval zurückziehen
/assign @user - User assignen
/unassign @user - User unassignen
/label ~bug - Label hinzufügen
/unlabel ~bug - Label entfernen
/milestone %v1.0 - Milestone setzen
/merge - Auto-merge aktivieren (wenn Checks passen)
/draft - Als Draft markieren
/ready - Draft-Status entfernen
Schnelle Aktionen ohne UI-Navigation.
GitLab bietet integrierte Security-Scanner (Ultimate-Tier oder via Open-Source-Tools).
Analysiert Source Code auf bekannte Vulnerabilities:
include:
- template: Security/SAST.gitlab-ci.yml
# Auto-detektiert Sprache (JavaScript, Python, Go, etc.)
# Läuft automatisch in MRsGitLab zeigt Ergebnisse im MR:
Security Scanning
1 new vulnerability (1 high, 0 medium, 0 low)
HIGH: SQL Injection in UserController.getUser()
File: backend/controllers/UserController.js:45
CWE-89: SQL Injection
Recommendation: Use parameterized queries
Security Team kann dann gezielt reviewen.
Scannt Dependencies auf bekannte CVEs:
include:
- template: Security/Dependency-Scanning.gitlab-ci.ymlZeigt verwundbare Packages:
Dependency Scanning
3 vulnerabilities detected
HIGH: lodash 4.17.20 (CVE-2021-23337)
Update to: 4.17.21
MEDIUM: express 4.17.1 (CVE-2022-24999)
Update to: 4.18.2
Testet laufende Applikation (in Preview-Environment):
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_WEBSITE: https://$CI_COMMIT_REF_SLUG.preview.example.comFindet Runtime-Vulnerabilities (XSS, CSRF, etc.).
GitLab aggregiert alle Security-Findings:
Security & Compliance → Vulnerability Report: - Alle Vulnerabilities aus SAST, DAST, Dependency Scanning - Status: New, Confirmed, Dismissed, Resolved - Assignees für Remediation - Tracking über Zeit
Aktiviere Auto-Merge auf einem MR:
✓ All checks passed
✓ 2 Approvals received
✓ No unresolved threads
[Enable Auto-Merge]
MR wird automatisch gemerged, sobald alle Bedingungen erfüllt. Nützlich, wenn man auf letzte Pipeline wartet.
Problem: Mehrere MRs gleichzeitig ready. Alle sind gegen
main getestet. Aber nach erstem Merge ist main
anders → andere MRs könnten nun Probleme haben.
Merge Trains: GitLab mergt MRs sequenziell, testet jeden gegen den vorherigen.
Merge Train:
1. MR #123 → Testing against main
2. MR #124 → Testing against main + MR #123
3. MR #125 → Testing against main + MR #123 + MR #124
Wenn MR #123 fehlschlägt, wird er aus Train entfernt, #124 und #125
bleiben. Verhindert kaputte main-Historie.
MRs als “Draft” oder “WIP” markieren:
Methode 1: Titel beginnt mit Draft:
oder WIP:
Draft: Add payment gateway integration
Methode 2: Quick Action /draft
Effekte: - Badge “Draft” deutlich sichtbar - Merge-Button disabled - Signalisiert: “Noch nicht fertig, aber Feedback willkommen”
Nutzung: Früh öffnen für Visibility, Diskussion,
frühe Reviews. Wenn fertig: /ready → Draft-Status
entfernt.
MRs können abhängig voneinander sein:
In MR-Beschreibung:
## Dependencies
Depends on !123
Blocks !125GitLab zeigt abhängige MRs prominent. Hilft, Merge-Reihenfolge zu planen.
Review Apps deployen jeden MR in eigene Environment:
deploy_review:
stage: deploy
script:
- kubectl apply -f k8s/review-app.yml
- kubectl set image deployment/review-app-$CI_MERGE_REQUEST_IID app=myapp:$CI_COMMIT_SHA
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_COMMIT_REF_SLUG.review.example.com
on_stop: stop_review
only:
- merge_requests
stop_review:
stage: deploy
script:
- kubectl delete namespace review-app-$CI_MERGE_REQUEST_IID
when: manual
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
only:
- merge_requestsIm MR:
Environments
✓ review/feature-payment-gateway
https://feature-payment-gateway.review.example.com
[View Deployment] [Stop Environment]
Reviewer (und Product Owner, Designer, etc.) können MR live testen. Drastisch besseres Feedback als nur Code-Review.
Für Automatisierung bietet GitLab REST API für MRs:
# MR erstellen via API
curl --request POST \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
--form "source_branch=feature/new-api" \
--form "target_branch=main" \
--form "title=Add new API endpoint" \
--form "description=Implements REST endpoint for user search" \
"https://gitlab.com/api/v4/projects/$PROJECT_ID/merge_requests"
# MR approven
curl --request POST \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"https://gitlab.com/api/v4/projects/$PROJECT_ID/merge_requests/$MR_IID/approve"
# MR mergen
curl --request PUT \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"https://gitlab.com/api/v4/projects/$PROJECT_ID/merge_requests/$MR_IID/merge"Nützlich für Bot-Automatisierungen, Custom Workflows, Integration mit externen Tools.
Erstelle Templates für konsistente MRs: -
.gitlab/merge_request_templates/Feature.md -
.gitlab/merge_request_templates/Bugfix.md -
.gitlab/merge_request_templates/Hotfix.md
Labels organisieren MRs: - type::feature,
type::bug, type::refactor -
priority::high, priority::medium,
priority::low - status::needs-review,
status::changes-requested, status::approved -
workflow::blocked, workflow::ready
MRs zu Milestones zuordnen: - Sprint 23 -
v2.1.0 - Q1 2024
Gibt Überblick, was in welchem Release kommt.
Nutze Discussions für wichtige Punkte, Comments für FYI.
Projekt-Einstellungen → Merge
Requests → Merge Method: - Merge
Commit: Behält alle Commits (verzweigte Historie) -
Merge Commit with Semi-linear History: Rebase auf
Target, dann Merge (cleaner) - Fast-Forward Merge: Nur
wenn möglich (lineare Historie) - Squash Commit: Alle
Commits zu einem (sauberste Historie auf main)
Team-Entscheidung. Viele Teams nutzen Squash für
main-Sauberkeit.
GitLab Merge Requests sind mehr als Git-Merges mit UI. Sie sind ein vollständiges Kollaborationssystem:
Code Review: Inline Comments, Suggestions, Discussions, Approvals
Automatisierung: CI/CD Pipelines, Security Scans, Code Quality Checks
Governance: Approval Rules, Code Owners, Merge Checks
Visibility: Review Apps, Preview Environments, Status Tracking
Integration: Issue Tracking, Milestones, Labels, API
Die Kombination dieser Features macht Code Review von manuellem Prozess zu automatisiertem, durchgesetztem Workflow. Qualität wird nicht gehofft, sondern erzwungen.
Im Gegensatz zu reinem Git, wo jeder direkt zu main
pushen könnte, etabliert GitLab Governance-Schichten: 1. Branch
Protection (niemand pusht direkt zu main) 2. MR-Pflicht
(alle Änderungen gehen durch MR) 3. Approval Rules (mindestens N Reviews
nötig) 4. Pipeline Checks (Tests, Linting, Security müssen passen) 5.
Manual Approval (für kritische Änderungen)
Das ist nicht Bürokratie. Das ist Engineering Discipline, die Scale ermöglicht. Ein Team, das diese Praktiken nutzt, kann schneller wachsen, Qualität halten, und Vertrauen in Deployments haben.
GitLab ist die Plattform, die Git’s technische Leistungsfähigkeit mit organisatorischen Prozessen verbindet. Master Merge Requests, und Code Review wird von Bottleneck zu Enabler.