Einstieg
pinup ist ein statisches Binary. Es braucht git auf der Maschine, einen Token für die Plattform, auf die es schreibt, und eine Konfiguration in Renovates Sprache. Vier Schritte vom Download zum geplanten Job.
- Binary:
go install github.com/ohartwig/pinup/cmd/pinup@latestoder die signierten Releases (pinup-linux-amd64,-arm64,pinup-darwin-arm64,-amd64,SHA256SUMS) - Prüfen:
pinup versionsagt, was du hast
Vom Binary zum geplanten Job
Ein Plan ohne Token
Das Erste, was du startest, ist whatif: es löst die Konfiguration auf, extrahiert die Abhängigkeiten, schlägt Versionen nach und schreibt einen Plan. Es ändert nichts und braucht keinen Plattform-Token (private Registries ausgenommen).
cd ein-repository
pinup whatif --repo . --config .pinup.yaml --report plan.json
Der Plan sagt, was pinup tun würde, und für alles, was es nicht tun würde, warum: jedes gehaltene Update trägt seinen Grund, seine Thaw-Zeit und die Regel, die es hält. --now 2026-01-01T00:00:00Z plant zu einem anderen Zeitpunkt; so prüfst du einen Schedule oder ein Release-Alter, ohne zu warten.
Ein Lauf gegen ein Projekt
run tut, was whatif tut, und pusht dann die Branches, öffnet oder aktualisiert die Merge Requests und schreibt das Dashboard-Issue. Dafür braucht es die Plattform und einen Token:
export PINUP_GITLAB_URL=https://gitlab.example.org
export PINUP_GITLAB_TOKEN=glpat-… # api, write_repository
export PINUP_GIT_NAME="Dependency Bot" PINUP_GIT_EMAIL=bot@example.org
export PINUP_SIGNING_FORMAT=none # oder openpgp / ssh mit PINUP_SIGNING_KEY
pinup run --project gruppe/projekt --config 'local>gruppe/runner-config' --report plan.json
--dry-run hört nach dem Plan auf, mit der Sicht der Plattform auf die vorhandenen Merge Requests. --repo . läuft gegen einen Checkout statt zu klonen. Auf GitHub liest dasselbe Kommando PINUP_GITHUB_TOKEN und --project owner/repository.
--config ist eine Datei oder ein local>-Preset, das die Plattform liefert: eine default.json in einem Runner-Projekt, die jede Konfigurationsdatei der Repositories per extends einbindet. Die Repositories behalten ihre Dateien; pinup beantwortet den Namen des Runners aus der Datei, mit der es gestartet wurde, ohne Fetch.
Jedes Projekt, das der Token sieht
pinup run --autodiscover '["gruppe/**", "!gruppe/archiv/**"]' --config … --report 'reports/%s.json'
Die Liste ist jedes nicht archivierte Projekt, das der Token sehen kann, gefiltert durch die Globs (! negiert); acht Projekte laufen gleichzeitig, jedes in seinem eigenen Clone. Ein %s in --report wird zum Projektpfad.
Ein CI-Job
Die Form eines geplanten Jobs auf GitLab: das Toolchain-Image trägt pinup und was die Lock-Refreshes brauchen (composer, npm, go), der Token ist eine maskierte Variable, der Plan ein Artefakt.
pinup:scan:
image: ghcr.io/ohartwig/pinup-toolchain:0
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
variables:
PINUP_CACHE: .pinup/cache.db
cache:
key: pinup-$CI_JOB_NAME
paths: [.pinup/cache.db]
script:
- pinup run --autodiscover '["gruppe/**"]' --config 'local>gruppe/runner' --report 'reports/%s.json'
artifacts:
paths: [reports/]
when: always
PINUP_CACHE hält Release-Listen, First-Seen-Einträge, Advisories und Release-Notes zwischen den Läufen: ein Release, dessen Registry keinen Zeitstempel veröffentlicht, bekommt sein Alter davon, wann dieser Cache es zuerst gesehen hat. Deshalb warnt ein Lauf mit leerem Cache bei minimumReleaseAge, statt ihm zu vertrauen. Vollständige Dateien für GitLab und GitHub Actions liegen unter docs/examples.
Weiter
Konfiguration
Renovates Sprache, die drei Schichten, die Merge-Semantik, jeder unterstützte Schlüssel, die Umgebung.