Es ist Mai 2022, und MegaLinter hat gewonnen. Wer heute ein neues Repo aufmacht und Linting braucht, sieht MegaLinter auf Stack Overflow, in Dev-Blogs, in jedem zweiten Pull-Request- Template. Ein Image, hundert Linter, ein YAML, fertig. Für 80% der Repos ist das genau richtig.

Dieser Artikel ist für die anderen 20%. Die, in denen das MegaLinter-Image deine CI um vier Minuten verlängert. In denen 95 der eingebauten Linter Tools für Sprachen sind, die du gar nicht im Stack hast. In denen ein generischer Fail-Output dir sagt »MegaLinter findet Probleme« und du erst die MegaLinter- Doku öffnen musst, um zu wissen, welcher der hundert Linter gerade etwas zu sagen versucht.

Die Alternative: vier saubere Schichten, jede mit klarem Zuständigkeitsbereich, alle einzeln pinbar.

4 Domain Spectral · gherkin-lint · helm lint · kubeconform 3 Konvention commitlint · semantic-release 2 Format markdownlint · Prettier · editorconfig-checker 1 Sprache hadolint · tflint · ShellCheck · yamllint · actionlint spezifisch universell
Vier Schichten — von Sprache (Basis, breit anwendbar) bis Domain (Spitze, fachlich spezifisch). Jede Schicht ist einzeln pinbar, alle laufen parallel.

Schicht 1 — Sprach-Linter

Prüfen syntaktische Korrektheit und sprach-spezifische Best Practices. Die Pflicht-Schicht — ohne sie geht nichts in main. Typische Tools: hadolint für Dockerfiles, tflint für Terraform/OpenTofu, ShellCheck für Bash, yamllint für generische YAMLs, actionlint für GitHub-Actions- Workflows.

Jedes dieser Tools ist klein (Alpine-Images von rund 20–30 MB), schnell (Sekunden) und hat ein klares Aufgabenfeld. Pin auf konkrete Versionen — hadolint:2.10-alpine, nicht :latest — sonst kippt dir ein Major-Update die Pipeline.

Schicht 2 — Format-Linter

Prüfen, ob Dateien einheitlich strukturiert sind. Die Hygiene-Schicht. Typische Tools: markdownlint für Markdown, Prettier für JS/TS/CSS/JSON/YAML, editorconfig-checker für Sprach-übergreifende Konvention.

Trennlinie zu Schicht 1: Schicht 1 fragt »ist es korrekt?«, Schicht 2 fragt »liest es sich konsistent?«. Format-Linter haben oft eine --fix-Option — lokal in pre-commit erlauben, in CI nur prüfen.

Schicht 3 — Konvention-Linter

Prüfen Git-Metadaten — Commits, Branch-Namen, Release-Notes. Die Workflow-Schicht. Wichtigstes Tool: commitlint mit @commitlint/config-conventional.

Diese Schicht läuft sequenziell vor den anderen, weil bei kaputter Commit-Message der Rest egal ist. semantic-release und automatische Versionierung sind ohne Konvention-Linter ein Kartenhaus.

Schicht 4 — Domain-Linter

Prüfen fachliche Strukturen — OpenAPI-Specs, Feature-Files, Helm-Charts. Die Vertrags-Schicht. Typische Tools: Spectral für OpenAPI/AsyncAPI, gherkin-lint für BDD-Features, helm lint und kubeconform für Kubernetes-Manifeste.

Diese Schicht läuft nur, wenn relevante Dateien geändert wurden (Path-Filter). Spart CI-Zeit, denn nicht jeder Commit fasst Domain-Files an.

Wie das in deiner Pipeline aussieht

Zwei Stages, vier Schicht-Jobs. Hier eine Forgejo-/GitHub-Actions-Skizze, die du in fünf Minuten an dein Repo anpassen kannst:

# .github/workflows/lint.yml (Forgejo-Workflows-Syntax identisch)
name: lint
on: [push, pull_request]

jobs:
  konvention:
    runs-on: ubuntu-22.04
    container:
      image: commitlint/commitlint:18-alpine
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - run: commitlint --from=origin/main

  sprache:
    needs: [konvention]
    runs-on: ubuntu-22.04
    container:
      image: hadolint/hadolint:v2.10.0-alpine
    steps:
      - uses: actions/checkout@v4
      - run: hadolint Dockerfile

  format:
    needs: [konvention]
    runs-on: ubuntu-22.04
    container:
      image: davidanson/markdownlint-cli2:v0.5.1
    steps:
      - uses: actions/checkout@v4
      - run: markdownlint-cli2 '**/*.md'

  domain:
    needs: [konvention]
    runs-on: ubuntu-22.04
    container:
      image: stoplight/spectral:6.4
    steps:
      - uses: actions/checkout@v4
      - run: spectral lint openapi/*.yaml

Gesamt-Laufzeit nach Cache-Warmup: typisch 90–120 s. MegaLinter-Pendant: 6–8 min. Faktor 4–5 schneller, mit klareren Fehler-Outputs und einzeln pinbaren Tool-Versionen.

Update Mai 2026 — TCWLab gefunden

Ergänzung zum Originalartikel von Mai 2022.

Vier Jahre später, beim Recherchieren für einen neuen Artikel, bin ich auf TCWLab gestoßen — eine kleine Open-Source-Toolchain unter Apache 2.0, die genau diese vier Schichten als pinning-strenge Docker-Images bereitstellt. Hätte ich 2022 gebraucht, hat damals aber noch niemand so zusammengeschnürt.

Das interessanteste Image ist tcwlab/betterlint: bündelt hadolint, tflint, shellcheck, markdownlint, commitlint, Spectral und gherkin-lint in einem ~300-MB-Image, mit deterministischer Auto-Detect-Logik. Wer keine Lust hat, sieben Tool-Pins selber zu pflegen, spart sich damit Arbeit. Im obigen YAML würdest du das commitlint/commitlint:18-alpine und das hadolint/hadolint:v2.10.0-alpine dann gegen tcwlab/betterlint:1.0.0 tauschen und alles in einen Job ziehen.

Kein Affiliate-Hinweis, mir ist's nur beim Stöbern unter die Finger gekommen — fand ich erwähnenswert, weil es sehr gut zum Vier-Ebenen-Modell passt.

Was du jetzt mitnehmen kannst

Drei Faustregeln:

  • Pinne alle Tool-Versionen. Keine :latest-Tags. Ein Tool-Upgrade ist ein PR.
  • Lokal = CI. Was lokal mit just lint läuft, ist exakt dasselbe wie die CI-Jobs. Sonst ist die Pipeline ein Feedback-Loop mit Drei-Minuten-Verzögerung.
  • Eine Schicht pro Quartal. Wenn dein Repo noch nicht geschichtet ist, starte mit Schicht 1. Alle vier auf einmal ist Team-Frust.

Wenn du tiefer einsteigen willst

Das Kurzbuch „Linting neu gedacht — Vier Ebenen statt Alles-Linter“ entwickelt jede Ebene über ein eigenes Kapitel mit Setup-Snippets pro Tool, CI- und Pre-Commit-Konfigurationen für GitHub Actions, GitLab CI und Forgejo Actions sowie ein durchgespieltes Beispiel an einem Postgres-Operator-Repo. Drei Diagramme, ein Cheatsheet zum Aushängen. Rund 80 Seiten, 90 Minuten Lesezeit. Erschienen Mai 2022 als Taschenbuch und eBook bei Chameleon Books.

Über Jonas Veit

Jonas Veit arbeitet seit über zehn Jahren an Build-Pipelines, von klassischen Jenkins-Konstrukten bis zu modernen Container- nativen CI-Stacks. Er hat in mehreren Unternehmen das Linting-Setup auf ein deterministisches Maß reduziert und schreibt über Tooling-Wahlen, die nicht nach zwei Jahren wieder umgebaut werden müssen. Er lebt in Hamburg.