Der Plan
Jeder Lauf erzeugt einen maschinenlesbaren Plan, bevor er etwas schreibt: whatif hört dort auf, run macht weiter. Der Plan ist das Rückgrat, kein Debug-Flag. Der Vergleichsjob, das Dashboard, der Merge-Request-Text und der Estate-Bericht lesen ihn.
- Ein Plan erklärt, warum nichts passiert. Jedes gehaltene Update trägt seinen Grund, wann der Halt endet und welche Regel ihn gesetzt hat.
- Nichts hinter dem Plan erfindet eine Änderung. Branches tragen Byte-Range-Edits und Tasks; Apply verbraucht die, nie eine Abhängigkeit.
- Format: JSON,
--report <pfad>,%sfür den Projektpfad,schemaVersion1
Die Felder
Oben
| Feld | Bedeutung |
|---|---|
pinupVersion, generatedAt | welches pinup wann geplant hat |
repo.path | das Projekt |
limits | prHourlyLimit, prConcurrentLimit wie aufgelöst; der Runner setzt sie durch |
dashboard | ob das Dashboard-Issue geführt wird, und sein Titel |
deps, updates, branches, warnings, stats | siehe unten |
deps
Ein Eintrag pro Abhängigkeit pro Datei: manager, file, depName, packageName, currentValue, currentDigest, lockedVersion, datasource, versioning, registryUrls, die Werte aus dem Vor-Lookup-Regelpass (rangeStrategy, minimumReleaseAge, pinDigests), der locus (Byte-Offsets von Wert und Digest) und bei Custom Managern der Index und die captures. Eine nicht nachgeschlagene Abhängigkeit sagt warum in skipReason; eine von einer Regel deaktivierte nennt die Regel in disabled.
updates
Ein Eintrag pro Bewegung: dep, newValue (die geschriebenen Bytes), newVersion, newDigest, updateType (major, minor, patch, digest, pin, pinDigest, rollback, lockFileMaintenance, majorAvailable), declared und effective, analyzer und evidence, releaseTime mit timeSource, securityFix – und:
blocks: jeder Grund, aus dem das Update gehalten wird –reason,origin(configoderpackageRules[N]),until,note. Gründe:minimumReleaseAge,schedule,dependencyDashboardApproval,disabled,allowedVersions,internalChecksFilter,hourlyLimit,concurrentLimit,rollingMajor,pluginRequired,taskRefused,nothingToRefresh,publishFailed.suppressedBy: der erste Grund, für Leser, die ein Wort brauchen.notes,compareUrl: die Release-Notes zwischen den Versionen und die Compare-Seite der Forge.
branches
Ein Eintrag pro Branch: name (Renovate-kompatibel), title, groupName, updateKeys, edits (Datei, Byte-Range, alte und neue Bytes, Manager), tasks (Lock-Refreshes und Post-Upgrade-Kommandos mit ihrem Scope), automerge, labels, schedule, existing (der offene Merge Request) und suppressedBy mit heldWith, wo der Branch als Ganzes gehalten wird.
warnings
stage (config, extract, lookup, analyze, apply, publish, cache), file, msg. Eine unerreichbare Datenquelle, ein Preset, das zu nichts auflöst, ein Task, dessen Ausgabe seinen Scope verlassen hat, ein zu junger Cache: Warnungen, nie ein gescheiterter Lauf für den Rest des Repositories.
Einen Plan lesen
# jedes gehaltene Update mit seinem Grund
jq -r '.updates[] | select(.blocks) | "\(.dep.depName) \(.dep.currentValue) -> \(.newValue): \(.blocks[0].reason) (\(.blocks[0].origin.source))"' plan.json
# die Branches, die jetzt geschrieben würden
jq -r '.branches[] | select(.suppressedBy == null) | .name' plan.jsonWeiter
Effective-Label
Das zweite Label auf jedem Update: der Helm-Chart-Analyzer, die Sicherheitsregel, matchEffective und trustEffective.