Konfiguration
pinup liest Renovates Konfigurationssprache. Ein Repository mit renovate.json behält sie. Der Wechsel von Renovate ändert kein Byte in einem Repository.
- Drei Schichten: die Konfiguration des Laufs, die Datei des Repositories, die Presets
- Merge-Semantik: Renovates, gemessen dagegen
- Schlüssel:
pinup migratestuft jeden ein
Drei Schichten
Die Konfiguration des Laufs
--config: eine Datei oder ein local>-Preset von der Plattform (local>gruppe/runner, local>gruppe/runner:release-fast). Das ist die Datei des Estates: Regeln, Custom Manager, Presets.
Die Datei des Repositories
PINUP_RUNNER_PROJECT nennt das Runner-Projekt, wenn --config eine Datei ist
Genau eine von .pinup.yaml, .pinup.yml, .pinup.json, .pinup.jsonc, renovate.json, renovate.json5, .renovaterc und .renovaterc.json. Zwei davon sind ein Fehler, keine stille Wahl: die unterlegene würde wochenlang bearbeitet, ohne zu wirken. Deshalb ist die Liste auch keine Rangfolge. Ihr extends darf die Datei des Laufs als local><runner-projekt> nennen; pinup beantwortet den Namen aus der Datei, mit der es gestartet wurde, ohne Fetch, und auch den alten Namen des Projekts, nachdem die Datei umgezogen ist. So wechselt ein Estate seinen Runner, ohne die Repositories anzufassen.
Presets
Renovates eingebaute Namen (config:recommended, :disableDependencyDashboard …) kommen aus pinups eigener Preset-Bibliothek, geschrieben aus beobachtetem Verhalten, nicht aus Renovates Quelltext. local>-Presets anderer Projekte werden von der Plattform geholt.
Merge-Semantik
Die Regeln sind Renovates, gemessen dagegen:
- Objekte mergen tief, Arrays ersetzen,
nulllöscht einen Schlüssel. packageRuleshängen sich über alle Schichten aneinander und gelten in Array-Reihenfolge. Für eine Abhängigkeit gilt jede passende Regel, spätere gewinnen pro Schlüssel.- Regeln laufen zweimal, wie in Renovate: einmal pro Abhängigkeit vor dem Lookup (Regel kann deaktivieren, Versioning und Registries ändern), einmal pro Update, wenn
matchUpdateTypesundmatchEffectivebekannt sind. - Ein Matcher auf ein unbekanntes Feld passt nicht. Eine
matchUpdateTypes-Regel schweigt vor dem Lookup, einematchEffective-Regel, bevor ein Analyzer lief.
Jeder aufgelöste Wert behält seine ganze Herkunftskette. pinup print-config --config … --explain packageRules[25].automerge zeigt jede Quelle, die einen Pfad gesetzt hat, Gewinner zuletzt. Ein gehaltenes Update im Plan nennt die Regel genauso.
Die Schlüssel
pinup migrate --config … stuft jeden Schlüssel ein. Unterstützt heißt: der Schlüssel tut, was er in Renovate tut, gemessen. Teilweise nennt die Differenz. Nicht unterstützt heißt: nichts liest ihn, und der Lauf sagt es.
Unterstützt
$schema, addLabels, additionalBranchPrefix, allowedCommands, allowedVersions, automerge, branchPrefix, branchTopic, commitMessageAction, commitMessageExtra, commitMessageLowerCase, commitMessagePrefix, commitMessageSuffix, commitMessageTopic, customDatasources, customManagers, dependencyDashboard, dependencyDashboardApproval, dependencyDashboardTitle, description, enabled, enabledManagers, extends, extractVersion, fetchChangeLogs, groupName, groupSlug, ignoreDeps, ignorePaths, ignoreUnstable, internalChecksFilter, labels, lockFileMaintenance, matchCurrentValue, matchDatasources, matchDepNames, matchDepTypes, matchFileNames, matchManagers, matchPackageNames, matchUpdateTypes, minimumReleaseAge, minimumReleaseAgeBehaviour, osvVulnerabilityAlerts, packageRules, pinDigests, platformAutomerge, postUpgradeTasks, prBodyDefinitions, prBodyNotes, prConcurrentLimit, prHourlyLimit, rangeStrategy, registryUrls, schedule, semanticCommitScope, semanticCommitType, semanticCommits, separateMajorMinor, timezone, versioning, vulnerabilityAlerts – und pinups eigene analyze, matchEffective, trustEffective.
Teilweise
matchCurrentVersion– als Version gematcht, nicht als RangematchSourceUrls– die URL, wie die Datenquelle sie meldetmatchJsonata– nurisLockfileUpdateundsourceUrlcommitBody– gelesen, nicht templatisiertprCreation– nurimmediate; der Not-Pending-Deadlock ist per Design wegrebaseWhen– ein Branch mit fremden Commits bleibt unberührt, sonst Rebase bei KonfliktseparateMinorPatch,separateMultipleMajor,separateMultipleMinor– in die Template-Variablen gelesen;separateMajorMinorentscheidetpostUpdateOptions–gomodTidytut der gomod-Lock-Refresh ohnehin, der Rest wird nicht gelesenexecutionTimeout– entscheidet der Runner (PINUP_EXECUTION_TIMEOUT), nie ein Repository
Nicht unterstützt
matchCategories– kein Kategorie-Modell; die Regel feuert nie, undmigratesagt es
Ein Schlüssel, der hier nicht steht, wird nicht gelesen; migrate listet ihn als nicht unterstützt.
pinups eigene Schlüssel
| Schlüssel | Wo | Bedeutung |
|---|---|---|
analyze | Regel | fragt einen Analyzer, was sich bei den Updates dieser Abhängigkeit wirklich geändert hat; standardmäßig aus, weil er beide Versionen holt |
matchEffective | Regel | matcht das Label des Analyzers: patch, minor, major, breaking-values; feuert nie, solange das Label unbekannt ist |
trustEffective | Regel | lässt einen Automerge stehen, den eine matchEffective-Regel eingeschaltet hat, obwohl das deklarierte Label strenger ist; ohne ihn gewinnt das strengere Label |
Custom Manager
customManagers mit customType: regex arbeiten wie in Renovate: RE2-Ausdrücke mit benannten Gruppen (depName, currentValue, currentDigest, datasource, versioning, registryUrl, packageName, extractVersion), die *Template-Schlüssel mit einer Handlebars-Teilmenge ({{{x}}}, {{#if}}/{{else}}, {{#if (equals a "b")}}), matchStringsStrategyany und recursive. Eine eingefangene Gruppe schlägt ihr Template. # renovate: und # pinup: werden beide gelesen.
Umgebung
| Variable | Bedeutung |
|---|---|
PINUP_PLATFORM | gitlab (Standard) oder github; ein GitHub-Token ohne GitLab-Instanz in der Umgebung heißt github |
PINUP_GITLAB_URL / CI_SERVER_URL | die GitLab-Instanz |
PINUP_GITLAB_TOKEN / GITLAB_TOKEN | Personal Access Token (api, write_repository); CI_JOB_TOKEN, wenn keiner gesetzt ist (nur lesend) |
PINUP_GITHUB_URL / GITHUB_SERVER_URL | der GitHub-Host; github.com, wenn leer |
PINUP_GITHUB_TOKEN / GITHUB_TOKEN | Token mit repo, oder fine-grained mit Contents, Pull Requests und Issues read/write |
PINUP_REGISTRY_HOST / CI_REGISTRY | die Container-Registry des Estates; nur dort wird der Token gegen einen Pull-Token getauscht |
GITHUB_COM_TOKEN | für github-*-Lookups und Release-Notes, gebunden an api.github.com |
PINUP_GIT_NAME, PINUP_GIT_EMAIL | wer committet |
PINUP_SIGNING_FORMAT, PINUP_SIGNING_KEY | openpgp oder ssh und der Schlüssel; unsigniert nur mit dem ausdrücklichen Wort none |
PINUP_CACHE | der Lookup-Cache (bbolt) |
PINUP_ALLOWED_COMMANDS | JSON-Array verankerter Muster, denen ein postUpgradeTasks-Kommando entsprechen muss; Sache des Runners, nie eines Repositories |
PINUP_PLUGIN_ENV | Variablen, die ein Task neben PATH, LANG, TZ sehen darf |
PINUP_TASK_NETRC | eine .netrc, die in das eigene HOME jedes Tasks geschrieben wird; nie als Variable |
PINUP_EXECUTION_TIMEOUT | Minuten pro Task |
PINUP_RUNNER_PROJECT | das Projekt, dessen Konfiguration die Repositories einbinden |
PINUP_APK_VIEWS | apk-Indexe, die nativ bedient werden, neben dem öffentlichen Wolfi-Repository |
Konfiguration prüfen: pinup advise
pinup advise löst eine Konfiguration so auf, wie ein Lauf es tut, und sagt, was sich ändern sollte. Jeder Befund trägt seinen Pointer, die Schicht, die den Wert geschrieben hat – Datei, Preset oder Default –, und, wo die Datei den Wert selbst setzt, einen Fix.
pinup advise --config renovate.json --runner 'local>gruppe/pinup-runner'
pinup advise --config renovate.json --plan plan.json # dazu, was die Läufe gefunden haben
pinup advise --config renovate.json --fix --out fixed.json| Kategorie | Was sie findet |
|---|---|
compat | Schlüssel, die pinup nicht liest; Regeln, die nie feuern; eine Regex mit Lookaround; ein Zeitplan, der nicht parst |
hygiene | ein Wert, den ein Preset schon setzt; ein Preset, das zweimal eingebunden ist; eine Regel, die eine spätere komplett überdeckt |
performance | ein ignorePaths, das die geerbte Liste ersetzt statt ergänzt; ein Lock-Refresh ohne Zeitfenster |
security | ein Automerge, das Major-Updates einschließt; eine Registry über HTTP; Advisories abgeschaltet |
Mit --plan kommen die Läufe dazu: Regeln, die keine Abhängigkeit erreicht hat, Manager ohne Funde, ein Repository, dessen Updates alle eine Einstellung hält.
--fix wendet die Fixes byte-genau auf JSON, JSONC und JSON5 an. Kommentare, Reihenfolge und Formatierung bleiben. Geschrieben wird erst nach einem Gate: die Datei wird vorher und nachher aufgelöst, und jede Zeile, die sich unterscheidet, muss unter einem Pointer liegen, den ein Fix angemeldet hat. Ein Fix ohne Anmeldung muss die Auflösung unverändert lassen. Ohne --out oder --write ist es ein Probelauf. --skip hält Checks zurück, die eine Entscheidung brauchen. Eine YAML-Datei wird berichtet, nicht umgeschrieben.
Alle Checks mit ID, Schwere und Fix stehen in docs/commands.md im Repository.
Weiter
Manager, Datenquellen, Versionierungen
Welche Dateien gelesen werden, welche Registries gefragt werden, wie Versionen geordnet werden.