← Blog
·10 blog.minutes

CI/CD-Pipelines fuer moderne Webentwicklung

Entwerfen von CI/CD-Pipelines, die Geschwindigkeit, Zuverlaessigkeit und Sicherheit in Einklang bringen - von der Trunk-basierten Entwicklung mit Feature-Flags bis zur Multi-Umgebungs-Bereitstellung mit automatisiertem Rollback.

Eine gute CI/CD-Pipeline ist der Unterschied zwischen einem Team, das zehnmal am Tag ausliefert, ohne darueber nachzudenken, und einem Team, das sich zwei Wochen auf ein Release vorbereitet, nur um es am Freitagabend zu vermasseln. In modernen Webentwicklungsteams ist CI/CD keine DevOps-Aufgabe mehr; es ist eine Kernkompetenz der Entwicklung. Jeder Entwickler sollte verstehen, wie die Pipeline funktioniert, warum sie so konfiguriert ist und wie er sie reparieren kann, wenn sie kaputt geht.

Dieser Leitfaden deckt den Aufbau einer CI/CD-Pipeline ab, die fuer moderne Webentwicklung ausgelegt ist: schnell genug, um Entwickler nicht zu bremsen, zuverlaessig genug, um selten gruene Builds zu sehen, und sicher genug, um Sie davor zu bewuahren, versehentlich Mist zu bauen. Wir werden Trunk-basierte Entwicklung, Umgebungsstrategie, Pipeline-Stufen und die Tools behandeln, die 2026 dafuer verwendet werden.

Trunk-basierte Entwicklung

Trunk-basierte Entwicklung ist die Grundlage einer schnellen CI/CD. Das Prinzip ist einfach: Jeder Entwickler merged mehrmals taeglich in den Hauptzweig. Keine langlebigen Feature-Branches, keine Merge-Hoellen nach zwei Wochen Arbeit. Feature-Flags ersetzen Branches als Mechanismus, um unfertige Arbeit von der Produktion zu isolieren. Der Hauptzweig ist immer auslieferbar.

# Every commit to main triggers the full pipeline
# Feature flags gate unfinished work

# .env or feature flag service
# Feature flag: new-checkout-flow
if flags.isEnabled("new-checkout-flow"):
  return NewCheckoutFlow()
else:
  return LegacyCheckoutFlow()

# No long-lived branches needed
# Feature is hidden behind flag until ready
# When ready: flip flag, monitor, remove old code

Der groesste Widerstand gegen Trunk-basierte Entwicklung kommt von Teams, die keine Feature-Flags haben. Ohne Flags ist unfertiger Code im Hauptzweig ein Risiko. Mit Flags ist es keine. Investieren Sie in ein Feature-Flag-System (LaunchDarkly, Unleash oder ein einfaches hausgemachtes), bevor Sie versuchen, auf Trunk-basierte Entwicklung umzustellen. Das Flags-System trennt Bereitstellung von Release - Sie koennen Code jederzeit bereitstellen, aber nur freigeben, wenn Sie bereit sind.

Pipeline-Stufen

Eine moderne CI/CD-Pipeline besteht aus mehreren Stufen, die nacheinander durchlaufen werden. Jede Stufe filtert eine andere Klasse von Fehlern heraus. Der Build stoppt an der ersten fehlgeschlagenen Stufe, um keine Rechenzeit zu verschwenden. Das Ziel ist, innerhalb von 10 Minuten vom Commit bis zur Produktion zu gelangen - nicht, weil es fancy ist, sondern weil schnelle Feedback-Schleifen die Produktivitaet verdoppeln.

# Pipeline stages (in order)
# Each stage gates the next

# Stage 1: Lint & format
- name: lint
  run: pnpm lint && pnpm format:check

# Stage 2: Type check
- name: typecheck
  run: pnpm typecheck

# Stage 3: Unit tests
- name: test
  run: pnpm test -- --coverage

# Stage 4: Build
- name: build
  run: pnpm build

# Stage 5: Integration tests
- name: integration
  run: pnpm test:e2e

# Stage 6: Deploy to staging
- name: deploy-staging
  run: ./deploy staging

# Stage 7: Deploy to production (manual approval or auto)
- name: deploy-production
  if: github.ref == 'refs/heads/main'
  run: ./deploy production

# Stage 8: Post-deploy checks
- name: smoke-tests
  run: ./smoke-test production

Jede Stufe hat einen klaren Zweck. Lint und Format fangen stilistische Fehler ab. Typecheck faengt Typfehler ab, bevor sie Laufzeitfehler werden. Unit-Tests ueberpruefen die Logik. Der Build stellt sicher, dass das Bundle produziert werden kann. Integrationstests testen das Ganze. Die Bereitstellung in der Staging-Umgebung ermoeglicht manuelle und automatische Ueberpruefungen, bevor die Produktion erreicht wird. Nach der Produktion bestaetigen Smoke-Tests, dass die Bereitstellung tatsaechlich funktioniert hat.

  • Parallele unabhaengige Stufen (Lint, Typecheck, Unit) sollten parallel laufen, nicht sequentiell, um die Gesamtzeit zu reduzieren.
  • Cachen Sie Abhaengigkeiten und Build-Artefakte zwischen den Lauufen, um keine Zeit mit dem erneuten Herunterladen von node_modules zu verschwenden.
  • Fuehren Sie teure Stufen (Integration, E2E) nur aus, wenn die billigen Stufen bestanden wurden.

Umgebungsstrategie

Mehrere Umgebungen sind notwendig, aber jede hat ihren Preis. Die klassische Drei-Umgebungen-Strategie (Entwicklung, Staging, Produktion) ist ein guter Ausgangspunkt, aber die meisten Teams brauchen mehr Nuancen. Eine Preview-Umgebung, die fuer jeden Branch oder jede PR automatisch erstellt wird, ermoeglicht es, Aenderungen zu ueberpruefen, bevor sie in den Hauptzweig gemergt werden. Dies ist besonders wertvoll fuer UI-Aenderungen, bei denen Code-Reviews allein nicht ausreichen, um visuelle Effekte zu beurteilen.

# Preview deployments — ephemeral environments per PR
name: Preview
on: pull_request

jobs:
  deploy-preview:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pnpm install
      - run: pnpm build
      - run: ./deploy preview --name pr-${{ github.event.number }}
      - run: |
          echo "Preview URL: https://pr-${{ github.event.number }}.example.com"

# Cleanup on merge or close
name: Cleanup Preview
on:
  pull_request:
    types: [closed]

jobs:
  destroy-preview:
    runs-on: ubuntu-latest
    steps:
      - run: ./destroy preview --name pr-${{ github.event.number }}

# Production rollout — gradual (canary)
- name: canary
  run: ./deploy-production --canary 10%
- name: observe
  run: ./wait-for-observability --timeout 300
- name: full-rollout
  if: success()
  run: ./deploy-production --canary 100%
- name: rollback-on-failure
  if: failure()
  run: ./rollback-production

Canary-Deployments sind der sicherste Weg, Code in Produktion zu bringen. Ein kleiner Prozentsatz des Datenverkehrs (z. B. 10 %) wird an die neue Version gesendet. Wenn Metriken waehrend eines Beobachtungszeitraums stabil bleiben, wird auf 100 % hochskaliert. Wenn Metriken abfallen, wird automatisch zurueckgesetzt. Der Schluessel sind Qualitaetsmetriken - Fehlerraten, Latenz, Geschaeftsmetriken - nicht nur der HTTP-Statuscode. Eine Seite kann mit Status 200 und trotzdem kaputt zurueckkommen.

Pipeline-Geschwindigkeit

Die Pipeline-Geschwindigkeit ist kein Luxus; sie ist eine Produktivitaetsnotwendigkeit. Entwickler, die 30 Minuten auf einen Build warten, wechseln den Kontext und verlieren den Faden. Entwickler, die 5 Minuten warten, bleiben beim Code. Die Optimierung der Pipeline-Zeit ist eine der kosteneffizientesten Investitionen, die ein Team taetigen kann. Jede Minute, die Sie aus der Pipeline entfernen, wird taeglich mit der Anzahl der Commits multipliziert.

Die groesste Beschleunigung ist das Caching. node_modules sollte zwischen den Laufzeiten zwischengespeichert werden, es sei denn, package.json hat sich geaendert. Next.js- und andere Framework-Build-Caches sollten persistieren. Docker-Images sollten Layer-Caching nutzen. Der zweitgroesste Gewinn ist die Parallelisierung: Lint und Unit-Tests benoetigen keine fertige Build-Ausgabe, also lassen Sie sie parallel laufen. Integrationstests benoetigen ein gebautes System, also warten sie.

Sicherheit in der Pipeline

CI/CD-Pipelines sind ein Hauptziel fuer Angreifer, weil sie Zugriff auf Produktionssysteme haben. Die Sicherung der Pipeline ist genauso wichtig wie die Sicherung des Anwendungscodes - ein kompromittierter CI/CD-Laeufer kann Code in Ihre Produktion einschleusen, als ob er von Ihnen waere.

  • Verwenden Sie OpenID Connect (OIDC) fuer Cloud-Anbieter-Zugriff. Keine langlebigen Secrets. Holen Sie sich ein Token pro Lauf, das nach Abschluss ablaueft.
  • Signieren Sie Build-Artefakte. Stellen Sie sicher, dass das, was Sie bauen, auch das ist, was Sie bereitstellen. Ein signiertes Artefakt kann nicht stillschweigend ersetzt werden.
  • Fuehren Sie Abhaengigkeits-Scans in der Pipeline durch. npm audit, Snyk oder Trivy sollten fehlschlagen, wenn bekannte Schwachstellen in neuen Abhaengigkeiten vorhanden sind.
  • Halten Sie CI/CD-Laufzeitsecrets kurz. Ein GitHub Actions-Token sollte nur fuer die Dauer des Laufs gueltig sein und nur auf die benoetigten Ressourcen zugreifen.

Sicherheit sollte nicht bedeuten, dass die Pipeline langsam wird. Dependency Scans sind schnell und parallelisierbar. OIDC entfernt manuelle Secret-Rotation. Signierte Artefakte sind ein einmaliger Setup-Aufwand. Die sicherste Pipeline ist diejenige, die sicherheitsrelevante Pruefungen automatisiert, anstatt auf manuelle Ueberpruefungen angewiesen zu sein.

Monitoring und Rollback

Eine gute Pipeline endet nicht mit der Bereitstellung. Sie ueberwacht die Bereitstellung und hat einen klaren Rollback-Mechanismus, wenn etwas schief geht. Das Rollback sollte automatisch sein, nicht manuell. Warten, bis jemand merkt, dass die Website kaputt ist, und dann durch die Schaltflaechen klickt, kostet Minuten, die sich wie Stunden fuer die Benutzer anfuehlen.

Automatisierte Rollbacks brauchen klare Kriterien. Wenn die Fehlerrate innerhalb von fuenf Minuten nach der Bereitstellung um 5 % steigt, rollen Sie zurueck. Wenn die p95-Latenz um 50 % steigt, rollen Sie zurueck. Diese Metriken sollten im Deployment-Tool konfiguriert sein, nicht im Kopf einer Person. Und jedes Rollback sollte eine Post-Mortem-Analyse oder zumindest eine Benachrichtigung ausloesen - Sie wollen wissen, warum es passiert ist und wie Sie es verhindern koennen.

CI/CD-Pipelines sind die essentielle Infrastruktur der modernen Webentwicklung. Eine gute Pipeline macht das Ausliefern langweilig, und Langeweile ist das Ziel. Wenn Ihre Pipeline jedes Mal Ueberraschungen bereithaelt, wenn Sie einen Commit pushen, hat sie ihren Zweck nicht erfuellt.