The npm postUpgradeTask ran `npm run format --if-present` on a tree Renovate had only lockfile-updated. `--package-lock-only` never writes node_modules, and the Renovate image ships no global prettier, so npm put a non-existent node_modules/.bin on PATH and every npm update PR failed its artifact check with `sh: 1: prettier: not found`. Run `npm ci` first so the pinned prettier and its plugins are actually present. `--ignore-scripts` keeps lifecycle scripts out of it since formatting needs none of them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011zP7KKVvLL5WoAW7a5Cdvn Signed-off-by: Peter Siegmund <peter.siegmund@entwicklung.eq-3.de>
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:00–07: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. MitinternalChecksFilter: strictentsteht in der Wartezeit gar nicht erst ein PR. - Security:
osvVulnerabilityAlertsals 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
- npm
- 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, undprettiersamt 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-presentaus und committet das Ergebnis in denselben PR. In Repos ohneformat-Skript passiert nichts. - Pinning:
prettierundprettier-plugin-*stehen mit exakter Version in derpackage.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.