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 und mit
overrideDatasource,overridePackageNameundextractVersionbestimmen, wo nachgeschlagen wird), einmal pro Update, wennmatchUpdateTypesundmatchEffectivebekannt 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, overrideDatasource, 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 templatisiertoverridePackageName– ein fester Name; Renovates Templates werden nicht ausgewertetprCreation– 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; die withdrawn.json an ihrer Wurzel wird mitgelesen |
PINUP_WITHDRAWN_IMAGES | https-URL der Liste zurückgezogener Image-Versionen; eine Abhängigkeit auf einer davon wird wie ein Sicherheitsfix auf den Ersatz gehoben |
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 --plan plan.json --repo . # dazu gepinnte Versionen, die nichts aktualisiert
pinup advise --config renovate.json --fix --out fixed.json
pinup advise --init --out .pinup.jsonc # ein erster Vorschlag für ein Repository ohne Konfiguration| 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 |
coverage | eine Annotation, die keine Abhängigkeit mehr trägt; ein Manifest mit Ranges ohne Lock; mit --repo gepinnte Versionen, die kein Manager liest |
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. Mit --repo kommt der Checkout dazu. Eine Version, die bewusst steht, markiert pinup: coverage-ignore auf ihrer Zeile oder der darüber.
--init ist für ein Repository ohne Konfiguration. Es liest den Checkout offline, ohne Token und ohne Lookup. Vorgeschlagen wird die kleinste passende .pinup.jsonc: config:recommended, drei Tage Mindestalter und Advisories, nur die Manager, die etwas gefunden haben, und für jede gepinnte Version ohne Manager die Annotation darüber. Bevor etwas ausgegeben wird, läuft der Vorschlag selbst durch advise. Findet advise etwas, scheitert der Befehl.
--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.