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
2026-07-28 20:40:35 +02:00
2026-07-28 20:40:35 +02:00

renovate-config

Gemeinsames Renovate-Preset für alle Repos auf git.mars3142.dev.

Verwendung

In jedem überwachten Repo genügt eine renovate.json mit:

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": ["local>mars3142/renovate-config"]
}

local> löst gegen diese Gitea-Instanz auf und lädt die default.json aus diesem Repo.

Was das Preset macht

  • Schedule: PRs nur Montag nachts (00:0007:00, Europe/Berlin), max. 5 offene PRs gleichzeitig.
  • Release-Age: Updates müssen 3 Tage alt sein (minimumReleaseAge). Fängt zurückgezogene und kompromittierte Releases ab. Mit internalChecksFilter: strict entsteht in der Wartezeit gar nicht erst ein PR.
  • Security: osvVulnerabilityAlerts als CVE-Kanal (Gitea hat kein Dependabot). Security-Updates umgehen Wartezeit und Schedule.
  • Automerge (via platformAutomerge, mergt sobald die required checks grün sind):
    • npm devDependencies, minor + patch, als eine gesammelte PR
    • CI actions
    • Lockfile-Maintenance
  • Nur gruppiert, kein Automerge: Svelte-/Frontend-Toolchain, Spring/Kotlin. Diese PRs schaut man sich an.
  • 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

Alles hinter dem extends überschreibt das Preset für dieses eine Repo:

{
  "extends": ["local>mars3142/renovate-config"],
  "schedule": ["at any time"]
}

Voraussetzung für Automerge

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.

Formatierung

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.

Zwei Regeln wirken dagegen:

  • 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.

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:

- '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, überspringt Renovate den Schritt ohne Fehler — im Log erscheint eine WARN-Zeile, dass das Kommando nicht auf der Liste steht.

S
Description
Gemeinsames Renovate-Preset fuer alle Repos (Schedule, Gruppierung, Automerge, Release-Age)
Readme
51 KiB