3 Commits
Author SHA1 Message Date
Peter SiegmundandClaude Opus 5 4f360565ec Pin the prettier toolchain
Prettier's output depends on its version. When prettier-plugin-tailwindcss
went from 0.8.0 to 0.8.1 it started sorting class names differently, and all
27 Svelte files in hamer/website silently drifted out of format. The bump
arrived through lockFileMaintenance, which only touches the lock file, so
package.json never showed it.

rangeStrategy: pin writes the exact version into package.json. Lock file
maintenance can no longer move it unseen, and every bump is visible in the
diff.

The reformatting itself is already handled by the npm-wide postUpgradeTasks
rule, so this only adds the pinning and the grouping. The group is not
automerged: when the bot lacks the command allowlist the reformatting is
skipped silently, and an unattended merge would bring the drift straight
back.

The README documents both rules and the RENOVATE_ALLOWED_COMMANDS value the
self-hosted bot needs, which was not written down anywhere yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ghd74zZHdKuvt9pv7Z7Hk
Signed-off-by: Peter Siegmund <peter.siegmund@entwicklung.eq-3.de>
2026-07-28 20:40:35 +02:00
Peter Siegmundandmars3142 d8542a5dfe feat: automerge security (vulnerability) updates on green CI
Security PRs raised via vulnerabilityAlerts had no automerge, so they
sat open until merged by hand — e.g. blog-svelte #35 (sharp) stayed open
even though CI was green. These are exactly the updates that should land
fastest, and platformAutomerge still gates them on the required checks.

Add automerge to the vulnerabilityAlerts block. It overrides the per-repo
group rules (e.g. the ungrouped 'svelte + build toolchain'), because
Renovate splits vulnerability updates into their own branches anyway.

Signed-off-by: Peter Siegmund <peter.siegmund@entwicklung.eq-3.de>
2026-07-28 18:39:23 +00:00
Peter Siegmund 200f660205 feat: run prettier after npm updates so format bumps stay green
A prettier version bump changes prettier's canonical output, so files
that were correctly formatted under the old version now fail
`prettier --check` in CI — the update PR goes red and never automerges.
This happened on castaway with prettier 3.8.3 -> 3.9.6 (two files
reformatted: a union type collapsed to one line, a Svelte closing tag
pulled onto the attribute line).

Add a npm-scoped postUpgradeTasks that runs `npm run format` once per
branch after the upgrade and commits the result. `--if-present` makes it
a no-op in npm repos without a format script; matchManagers npm keeps it
away from the gradle/maven and firmware repos that share this preset.

Requires the self-hosted Renovate instance to whitelist the command via
allowedCommands (e.g. RENOVATE_ALLOWED_COMMANDS='^npm run format') — that
is a global/self-hosted-only option and cannot be set from this preset.

Signed-off-by: Peter Siegmund <peter.siegmund@entwicklung.eq-3.de>
2026-07-25 01:59:24 +02:00
2 changed files with 24 additions and 17 deletions
+11 -9
View File
@@ -25,8 +25,8 @@ In jedem überwachten Repo genügt eine `renovate.json` mit:
- CI actions
- Lockfile-Maintenance
- **Nur gruppiert, kein Automerge:** Svelte-/Frontend-Toolchain, Spring/Kotlin. Diese PRs schaut man sich an.
- **Prettier-Toolchain:** `prettier` und `prettier-plugin-*` gruppiert, exakt gepinnt (`rangeStrategy: pin`) und mit automatischer Neuformatierung im selben PR. Siehe unten.
- **Major-Updates:** kein PR ohne Freigabe per Checkbox im Dependency Dashboard.
- **Formatierung:** nach npm-Updates läuft `npm run format --if-present`, und `prettier` samt Plugins ist exakt gepinnt. Siehe unten.
## Abweichen pro Repo
@@ -43,19 +43,21 @@ Alles hinter dem `extends` überschreibt das Preset für dieses eine Repo:
Der Renovate-User braucht Merge-Rechte, und die CI-Jobs müssen in der Branch Protection des Ziel-Branches als *required status checks* eingetragen sein. Ohne required checks würde Giteas Auto-Merge sofort mergen, ohne auf CI zu warten.
## Voraussetzung für die Prettier-Neuformatierung
## Formatierung
Prettiers Ausgabe hängt an der Version. Ein Sprung von `prettier-plugin-tailwindcss` 0.8.0 auf 0.8.1 sortiert Klassen anders und lässt jede Svelte-Datei als unformatiert gelten — ohne dass sich `package.json` ändert, weil `lockFileMaintenance` nur das Lockfile anfasst. Genau das ist im Repo `hamer/website` passiert: 27 Dateien wichen ab, gemerkt hat es niemand, weil dort kein Lint-Gate lief.
Prettiers Ausgabe hängt an der Version. Als `prettier-plugin-tailwindcss` von 0.8.0 auf 0.8.1 sprang, sortierte es Klassennamen anders und liess in `hamer/website` alle 27 Svelte-Dateien als unformatiert gelten. Gemerkt hat es wochenlang niemand, weil dort kein Lint-Gate lief und `package.json` unverändert blieb — der Sprung kam über `lockFileMaintenance`, das nur das Lockfile anfasst.
Dagegen wirken zwei Dinge im Preset:
Zwei Regeln wirken dagegen:
- `rangeStrategy: "pin"` schreibt die exakte Version in die `package.json`. Damit kann Lockfile-Maintenance sie nicht mehr unbemerkt verschieben, und jeder Sprung ist im Diff sichtbar.
- `postUpgradeTasks` lässt Renovate nach dem Upgrade `npx prettier --write .` laufen und die Änderung in denselben PR committen.
- **Nachformatieren:** Nach npm-Updates führt Renovate `npm run format --if-present` aus und committet das Ergebnis in denselben PR. In Repos ohne `format`-Skript passiert nichts.
- **Pinning:** `prettier` und `prettier-plugin-*` stehen mit exakter Version in der `package.json` (`rangeStrategy: "pin"`). Damit kann Lockfile-Maintenance sie nicht mehr unbemerkt verschieben, und jeder Sprung ist im Diff sichtbar. Die Gruppe ist bewusst **nicht** automerged: Fehlt die unten beschriebene Freigabe, wird das Nachformatieren stillschweigend übersprungen, und ein unbeaufsichtigter Merge würde die Drift wieder einschleppen.
**`postUpgradeTasks` läuft nur, wenn die Kommandos im Bot freigegeben sind.** Das ist eine Self-Hosted-Einstellung und wird in der Repo-Konfiguration ignoriert. Beim Container-Betrieb gehört sie in die Umgebung des Renovate-Containers:
### Voraussetzung: Kommando-Freigabe im Bot
`postUpgradeTasks` läuft nur, wenn das Kommando im Bot freigegeben ist. Das ist eine Self-Hosted-Einstellung und wird in der Repo-Konfiguration **ignoriert**. Beim Container-Betrieb gehört sie in dessen Umgebung:
```yaml
- RENOVATE_ALLOWED_COMMANDS=["^npm ci --ignore-scripts$","^npx prettier --write \\.$"]
- 'RENOVATE_ALLOWED_COMMANDS=["^npm run format --if-present$"]'
```
Die Einträge sind reguläre Ausdrücke, gegen die das jeweilige Kommando geprüft wird. Fehlt die Variable, führt Renovate die Kommandos still nicht aus — der PR kommt dann ohne Neuformatierung, und das Lint-Gate im Ziel-Repo schlägt an. Das ist der gewollte Rückfall: lieber ein roter PR als eine unbemerkte Drift.
Die Einträge sind reguläre Ausdrücke, gegen die das jeweilige Kommando geprüft wird. Fehlt die Variable, überspringt Renovate den Schritt ohne Fehler — im Log erscheint eine `WARN`-Zeile, dass das Kommando nicht auf der Liste steht.
+13 -8
View File
@@ -10,7 +10,8 @@
"osvVulnerabilityAlerts": true,
"vulnerabilityAlerts": {
"minimumReleaseAge": null,
"schedule": ["at any time"]
"schedule": ["at any time"],
"automerge": true
},
"lockFileMaintenance": {
"enabled": true,
@@ -18,6 +19,15 @@
"automerge": true
},
"packageRules": [
{
"description": "Nach npm-Updates Prettier laufen lassen: Formatierungs-Bumps (z.B. prettier selbst) formatieren bestehende Dateien um, sonst schlaegt prettier --check in der CI fehl. --if-present no-op't in Repos ohne format-Script. Benoetigt allowedCommands in der self-hosted Renovate-Config.",
"matchManagers": ["npm"],
"postUpgradeTasks": {
"commands": ["npm run format --if-present"],
"fileFilters": ["**/*"],
"executionMode": "branch"
}
},
{
"description": "npm devDependencies (non-major) gesammelt, automerge bei gruener CI",
"matchManagers": ["npm"],
@@ -65,17 +75,12 @@
"groupName": "spring + kotlin"
},
{
"description": "Prettier und seine Plugins zusammen und exakt gepinnt. Die Formatierung haengt an der Version: ein Sprung im Lockfile aendert die Ausgabe, ohne dass package.json es zeigt, und das Repo driftet unbemerkt ab. postUpgradeTasks formatiert im selben PR nach.",
"description": "Prettier und seine Plugins exakt pinnen. Die Formatierung haengt an der Version: kommt der Sprung ueber lockFileMaintenance, aendert sich die Ausgabe, ohne dass package.json es zeigt - genau so sind in hamer/website 27 Dateien unbemerkt abgedriftet. Das Nachformatieren erledigt die npm-Regel weiter oben.",
"matchManagers": ["npm"],
"matchPackageNames": ["prettier", "prettier-plugin-**"],
"groupName": "prettier toolchain",
"rangeStrategy": "pin",
"automerge": false,
"postUpgradeTasks": {
"commands": ["npm ci --ignore-scripts", "npx prettier --write ."],
"fileFilters": ["**/*"],
"executionMode": "branch"
}
"automerge": false
},
{
"description": "Major-Updates nur nach Freigabe im Dependency Dashboard",