# renovate-config Gemeinsames Renovate-Preset für alle Repos auf git.mars3142.dev. ## Verwendung In jedem überwachten Repo genügt eine `renovate.json` mit: ```json { "$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. 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: ```json { "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: ```yaml - '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.