Jeder kennt das Problem: Das Projekt läuft, alle sind beschäftigt, und die Dependencies werden Monate lang nicht aktualisiert. Irgendwann gibt es eine kritische Sicherheitslücke in einer veralteten Library, und man muss in aller Eile patchen. Renovate Bot löst dieses Problem durch automatische, konfigurierbare Dependency-Updates als Pull Requests.
Was ist Renovate?
Renovate ist ein Open-Source-Tool von Mend (früher WhiteSource), das Repositories auf veraltete Dependencies überwacht und automatisch Pull Requests mit den Updates erstellt. Es unterstützt:
- PHP:
composer.json/composer.lock - JavaScript:
package.json,package-lock.json,yarn.lock,pnpm-lock.yaml - Docker:
Dockerfile,docker-compose.yml - GitHub Actions / GitLab CI: Workflow-Dateien
- Terraform, Kubernetes, Helm: Infrastruktur-as-Code
- Und viele mehr
Setup
GitHub App (empfohlen)
Der einfachste Weg: Die Renovate GitHub App installieren. Nach der Installation öffnet Renovate automatisch einen "Configure Renovate"-PR mit einer minimalen renovate.json.
Self-hosted (GitLab, Bitbucket, Gitea)
# Via Docker
docker run --rm \
-e RENOVATE_TOKEN=your-token \
-e RENOVATE_REPOSITORIES=org/repo \
ghcr.io/renovatebot/renovate
# Via npm
npx renovate --token=your-token org/repo
Konfiguration
Die renovate.json im Repository-Root steuert das Verhalten:
Minimale Konfiguration
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
]
}
Das ist bereits ausreichend für die meisten Projekte: config:recommended aktiviert sinnvolle Defaults wie Semantic-Commit-Messages, automatisches Rebase nach Merge und die Erkennung aller gängigen Package-Manager.
Erweiterte Konfiguration für Symfony/PHP-Projekte
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
":dependencyDashboard",
":semanticCommits"
],
"timezone": "Europe/Berlin",
"schedule": ["before 9am on Monday"],
"labels": ["dependencies", "renovate"],
"assignees": ["wunner-software"],
"packageRules": [
{
"description": "Patch-Updates für alle Packages automatisch mergen",
"matchUpdateTypes": ["patch"],
"automerge": true,
"automergeType": "pr",
"platformAutomerge": true
},
{
"description": "Symfony-Packages gruppieren",
"groupName": "Symfony",
"matchPackageNames": ["symfony/**"],
"automerge": false
},
{
"description": "PHPUnit-Packages gruppieren",
"groupName": "PHPUnit",
"matchPackageNames": ["phpunit/**", "php-mock/**"]
},
{
"description": "devDependencies automatisch mergen",
"matchDepTypes": ["devDependencies"],
"automerge": true
},
{
"description": "Major-Updates manuell reviewen",
"matchUpdateTypes": ["major"],
"automerge": false,
"labels": ["major-update"]
}
]
}
Konfiguration für monorepos
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],
"enabledManagers": ["composer", "npm", "docker-compose", "github-actions"],
"packageRules": [
{
"matchPaths": ["apps/frontend/**"],
"groupName": "Frontend dependencies",
"schedule": ["before 9am on weekdays"]
},
{
"matchPaths": ["apps/api/**"],
"groupName": "API dependencies"
}
]
}
Dependency Dashboard
Mit :dependencyDashboard in extends erstellt Renovate ein GitHub Issue als Dashboard:
## Dependency Dashboard
This issue lists Renovate updates and detected dependencies.
Click on an update to open/re-open the PR.
### Open
- [ ] chore(deps): update dependency symfony/symfony to v7.1.5
### Rate-Limited
These updates are currently rate-limited. Click on a checkbox to
force their immediate creation.
- [ ] chore(deps): update dependency phpunit/phpunit to v11.3.2
### Detected dependencies
**composer.json**
- symfony/framework-bundle `^6.4`
- ...
**package.json**
- bootstrap `^5.3.0`
- ...
Auto-Merge für Patch-Updates
Auto-Merge ist besonders nützlich für Patch-Updates (Security-Fixes, Bugfixes) ohne Breaking Changes:
{
"packageRules": [
{
"matchUpdateTypes": ["patch", "pin", "digest"],
"automerge": true,
"automergeType": "pr",
"automergeStrategy": "squash"
}
]
}
Wichtig: Auto-Merge sollte nur aktiviert werden, wenn CI/CD-Tests laufen und grün sind. Renovate wartet, bis alle Required Checks bestanden sind, bevor es merged.
Composer-spezifische Konfiguration
{
"composer": {
"ignorePlatformReqs": true
},
"packageRules": [
{
"matchManagers": ["composer"],
"matchUpdateTypes": ["major"],
"enabled": false,
"description": "Composer Major-Updates deaktivieren"
},
{
"matchPackageNames": ["phpstan/phpstan", "squizlabs/php_codesniffer"],
"groupName": "PHP Code Quality Tools",
"automerge": true
}
]
}
Erfahrungen aus der Praxis
Nach einigen Wochen mit Renovate in einem mittelgroßen Symfony-Projekt:
- Security-Patches kommen jetzt innerhalb von Stunden als PR an — mit Auto-Merge für Patches werden sie sogar automatisch deployed, sobald Tests grün sind
- Major-Updates (z.B. Symfony 6 → 7) kommen als einzelne PRs mit Changelog-Link, man kann gezielt entscheiden
- Noise-Reduktion durch Gruppenregeln: Statt 20 einzelner PRs für alle Symfony-Pakete kommt ein einziger "Update Symfony" PR
- Dependency Dashboard gibt Überblick, welche Updates pending sind
Renovate vs. Dependabot
GitHub bietet mit Dependabot eine eingebaute Alternative. Der Vergleich:
| Feature | Renovate | Dependabot |
|---|---|---|
| Konfigurierbarkeit | Sehr hoch | Begrenzt |
| Gruppierung | Ja | Begrenzt |
| Auto-Merge | Sehr flexibel | Eingeschränkt |
| Self-Hosting | Ja (Docker/npm) | Nur GitHub |
| Dashboard | Ja (Issue) | Nein |
| Unterstützte Manager | 90+ | ~25+ |
| Updates bündeln | Ja | Begrenzt |
Renovate ist deutlich mächtiger, erfordert aber mehr Konfigurationsaufwand.
Fazit
Renovate Bot ist eines der nützlichsten DevOps-Werkzeuge, die kaum Setup erfordern. Einmal konfiguriert, sorgt es dafür, dass Dependencies aktuell bleiben, Security-Fixes schnell eingespielt werden und der manuelle Aufwand minimal ist. Für PHP/Symfony-Projekte empfehle ich:
- Start mit
config:recommended schedulefür wöchentliche Updates konfigurieren- Patch-Updates mit Auto-Merge aktivieren
- Symfony und PHPUnit in Gruppen zusammenfassen
Kommentare
Kommentare werden von Remark42 bereitgestellt. Beim Laden werden Daten an unseren Kommentar-Server übertragen.