Dependency-Updates: Renovate + Dependabot
Automatische Abhängigkeits-Updates laufen über Renovate (der Update-Bot für die tägliche Arbeit). Dependabot bleibt ausschließlich als Security-Alert-Signal aktiv. Beide beißen sich nicht — es ist ein bewusstes, gängiges Muster:
Renovate für die tägliche Update-Arbeit, Dependabot als Security-Backup.
| Werkzeug | Rolle | Erzeugt PRs? |
|---|---|---|
| Renovate (Mend-App) | Version-Updates für composer, npm, GitHub-Actions und Security-Fixes | Ja — Update- und Security-PRs |
| Dependabot | Nur noch Dependabot Alerts (natives GitHub-Advisory-Signal im Security-Tab) | Nein — weder Version- noch Security-Update-PRs |
Warum die Aufteilung?
- Renovate ist flexibler (Gruppierung, Auto-Merge-Regeln, Dependency-Dashboard, Lockfile-Wartung, feinere Zeitpläne) und übernimmt sämtliche Update-PRs.
- Dependabot Alerts liefern das native GitHub-Advisory-Signal „geschenkt": man sieht Sicherheitslücken direkt im Security-Tab, ohne dass Dependabot eigene PRs aufmacht (die würden sich sonst mit Renovate doppeln).
- Renovate greift dasselbe Advisory-Signal via
vulnerabilityAlertsauf und macht daraus die eigentlichen Security-Fix-PRs — so gibt es genau einen Bot, der PRs stellt.
Konfiguration
Renovate — .github/renovate.json5
Die komplette Renovate-Konfiguration liegt kommentiert in
.github/renovate.json5.
Kernpunkte:
| Einstellung | Wert | Bedeutung |
|---|---|---|
baseBranches | ["develop"] | Update-PRs gehen gegen develop (wie zuvor bei Dependabot). main bleibt unberührt. |
schedule | before 7am on monday (Europe/Berlin) | Wöchentlich gebündelt — hält die Zahl der CI-Läufe niedrig. |
extends | config:recommended, :dependencyDashboard, :semanticCommits | Sinnvolle Defaults + Sammel-Dashboard-Issue + Conventional Commits. |
prConcurrentLimit / prHourlyLimit | 5 / 2 | Flutet die Inbox nicht (entspricht dem alten open-pull-requests-limit). |
lockFileMaintenance | monatlich, auto-merge | Hält composer.lock / package-lock.json frisch, auch ohne Constraint-Änderung. |
vulnerabilityAlerts | aktiv, Label security, „at any time" | Security-Fix-PRs laufen sofort (ignorieren den Wochen-Schedule). |
Gruppierung (weniger, gebündelte PRs — 1:1 aus der alten Dependabot-Konfig
übernommen): php dev-tooling, composer patch updates, vite tooling,
tailwind, npm patch updates, github-actions.
Commit-Scopes wie zuvor: Produktiv-composer → fix(deps), Dev-composer →
chore(deps-dev), Actions → chore(ci).
Major-Bumps sind bewusst deaktiviert (eigene Migrations-Pläne) für:
laravel/framework, laravel/fortify, laravel/socialite, laravel/reverb,
livewire/livewire, livewire/flux, livewire/flux-pro, livewire/volt,
hyperlinkgroup/linguist, tailwindcss, apexcharts, puppeteer,
html2canvas-pro, laravel-echo, pusher-js.
Auto-Merge-Policy (CI-gated)
Sichere Updates werden automatisch gemerged — aber nur, wenn die CI grün ist.
| Kategorie | Auto-Merge? |
|---|---|
| Patch-Updates (composer + npm, produktiv) | ✅ ja |
Dev-Dependencies non-major (composer require-dev, npm devDependencies) | ✅ ja |
| GitHub-Actions non-major (Digest / Pin / Patch / Minor) | ✅ ja |
| Lockfile-Wartung | ✅ ja |
| Produktiv-Minor | ❌ Review |
| Alle Major-Updates | ❌ Review (bei den gepinnten Libs zusätzlich ganz deaktiviert) |
Wie das CI-Gate funktioniert: platformAutomerge: false — Renovate merged
selbst erst, wenn alle Checks auf dem PR grün sind (linter/„quality" +
tests/„ci"). Bei rotem CI wird nicht gemerged. Es wird bewusst keine
Branch-Protection auf develop erzwungen — der eigene Push-Flow bleibt unberührt.
Actions-Rechenzeit bewusst niedrig gehalten:
- Wöchentlicher Schedule + starke Gruppierung ⇒ wenige PRs ⇒ wenige CI-Läufe.
- Auto-Merge erzeugt keine zusätzlichen PR-Läufe. Einziger Zusatz-Lauf pro
gemergtem PR: der Merge-Push auf
developtriggertlint.yml+tests.ymlwie jeder andere Push. - Stellschrauben, falls die Actions-Minuten weiter runter sollen: Schedule auf
monthlysetzen, Gruppen weiter zusammenfassen, oder intests.ymldas xdebug-Coverage auf Dependency-PRs abschalten (nicht Teil dieser Konfig).
Auto-Merge lässt sich pro Kategorie in renovate.json5 an-/abschalten (das Feld
automerge je packageRule).
Dependabot — Rest-Rolle
Es gibt keine .github/dependabot.yml mehr (die frühere Version-Update-Konfig
wurde entfernt). Dependabot ist auf Repo-Ebene folgendermaßen eingestellt:
| Repo-Setting | Zustand | Zweck |
|---|---|---|
| Dependabot alerts | AN | Security-Advisory-Signal im Security-Tab (auch Datenquelle für Renovate-vulnerabilityAlerts). |
| Dependabot security updates | AUS | Keine Dependabot-Security-PRs — Renovate übernimmt Security-Fixes. |
| Dependabot version updates | AUS | Keine dependabot.yml ⇒ keine Routine-Update-PRs. |
GitHub-Einrichtung
Diese Schritte wurden per API/Config gesetzt:
.github/renovate.json5committet..github/dependabot.ymlentfernt.- Dependabot Alerts aktiviert (
PUT /repos/:owner/:repo/vulnerability-alerts). - Dependabot Security-Updates deaktiviert (
DELETE /repos/:owner/:repo/automated-security-fixes).
Manueller Rest-Schritt: Renovate-App installieren
Renovate läuft als Mend-gehostete GitHub-App (kein self-hosted CI-Job, keine Actions-Minuten für den Bot selbst). Einmalig:
- github.com/apps/renovate öffnen → Install/Configure.
- Für das Repo
yeapea/postbox(bzw. die Organisation) freigeben. - Renovate erstellt beim ersten Lauf einen Onboarding-PR und ein
Dependency-Dashboard-Issue. Da bereits eine
renovate.json5existiert, übernimmt Renovate diese Konfig direkt (kein „Standard-Onboarding" nötig — der Onboarding-PR bestätigt nur die erkannte Config).
Flux Pro in Renovate (private Registry)
livewire/flux-pro liegt in der privaten Composer-Registry
composer.fluxui.dev. Renovate ist dafür in renovate.json5 bereits verdrahtet: ein
hostRules-Eintrag authentifiziert gegen die Registry über Renovate-Secrets
{{ secrets.FLUX_USERNAME }} / {{ secrets.FLUX_LICENSE_KEY }} — kein Klartext im
Repo (die Werte werden nicht committet, analog zur gitignoreten auth.json).
Minor/Patch laufen dann normal (CI-gated, Review — kein Auto-Merge, da
Produktiv-Dependency); Major bleibt über die Major-Ignore-Regel deaktiviert.
Ein manueller Schritt (nur im Mend-Dashboard möglich): Die Mend-gehostete
Renovate-App liest ihre Zugangsdaten ausschließlich aus den Mend-App-Einstellungen
— nicht aus dem Repo, nicht aus GitHub-Actions-/Dependabot-Secrets; verschlüsselte
Secrets in der Config sind abgekündigt, und es gibt keine API zum Skripten. Die beiden
Zugangsdaten müssen daher im Mend-Dashboard hinterlegt werden
(developer.mend.io → Organisation/Repository →
Credentials bzw. Secrets), mit denselben Werten wie die http-basic-Einträge in der
gitignoreten auth.json:
| Secret | Wert |
|---|---|
FLUX_USERNAME | Flux-Account (http-basic-username aus auth.json) |
FLUX_LICENSE_KEY | Flux-Lizenzschlüssel (http-basic-password aus auth.json) |
Alternativ bietet Mend eine host-basierte Credentials-Ablage (Host
composer.fluxui.dev + Username + Passwort direkt im Dashboard) — dann kann der
hostRules-Block in renovate.json5 entfallen. In beiden Fällen landet kein
Klartext im Repo.
Ohne diese Zugangsdaten bleibt flux-pro schlicht unaktualisiert (kein Bruch anderer Updates) — bei einer lizenzpflichtigen UI-Lib ohnehin bewusst zu handhaben.
Betrieb
- Dependency-Dashboard: Renovate legt ein Issue an, das alle erkannten und offenen Updates listet — zentrale Übersicht + Möglichkeit, einzelne Updates per Checkbox anzustoßen.
- Zeitplan ändern:
scheduleinrenovate.json5(z. B.monthlyfür noch weniger CI-Läufe). - Mehr/weniger Auto-Merge:
automergejepackageRulean-/abschalten. - Config prüfen:
npx --yes --package renovate renovate-config-validator .github/renovate.json5.
Migrations-Hinweis
Beim Umstieg blieben ggf. offene Dependabot-Version-Update-PRs auf develop
stehen (z. B. dependabot/npm_and_yarn/..., dependabot/github_actions/...). Sie
werden nicht mehr aktualisiert und können geschlossen werden — Renovate schlägt noch
relevante Updates neu vor.