Zum Inhalt springen

Plugin: publisher-docker

@semrel/publisher-docker taggt und pusht ein Image, das bereits in einem Docker-kompatiblen Daemon vorhanden ist. Der kanonische typisierte Name ist erforderlich: @semrel/updater-docker behält die historischen untypisierten Docker-Aliase.

Sobald das erste Plugin-Release verfügbar ist:

Terminal-Fenster
semrel plugin install @semrel/publisher-docker

semrel plugin install lädt die Binärdatei nach .semrel/plugins/ herunter und aktualisiert .semrel.lock. Committe .semrel.lock, um die Version für dein Team festzuschreiben.

Führe semrel und das Plugin auf dem Host aus, der das gebaute Image besitzt. Das Plugin benötigt:

  • eine docker-CLI auf PATH;
  • einen erreichbaren Docker-kompatiblen Daemon, der das Quell-Image enthält;
  • vor der Ausführung konfigurierte Registry-Authentifizierung, zum Beispiel über docker login oder einen CI-Credential-Helper.

Das Plugin nimmt keine Zugangsdaten entgegen und führt keinen Login aus. Wenn semrel in einem Container läuft, stelle die Docker-CLI bereit, mounte den Daemon-Socket ausdrücklich und mounte die passende Docker-Authentifizierungskonfiguration. Zugriff auf den Docker-Daemon-Socket entspricht praktisch Root-Zugriff auf den Host. Stelle ihn nur vertrauenswürdigen Jobs und Containern bereit.

Baue das Image und authentifiziere dich, bevor semrel läuft:

Terminal-Fenster
docker build --tag acme-api:build .
printf '%s' "$GHCR_TOKEN" |
docker login ghcr.io --username "$GHCR_USER" --password-stdin
semrel release

Konfiguriere die Release-Phase:

version: 1
plugins:
- uses: @semrel/publisher-docker
phase: release
args:
image: acme-api:build
ref: ghcr.io/acme/api:{version}

Referenzen mit Registry-Ports werden unterstützt:

ref: registry.example:5000/team/api:{version}

Semrel bildet args.image und args.ref auf die Umgebung des Plugin-Subprozesses ab.

Konfiguration / VariableErforderlichStandardBeschreibung
image / SEMREL_PLUGIN_IMAGEjaVorhandene lokale Image-Referenz oder Image-ID.
ref / SEMREL_PLUGIN_REFjaGetaggte Zielreferenz mit {version}. Digest-Ziele werden abgelehnt.
SEMREL_VERSIONeine VersionsvariableRelease-Version. Hat Vorrang vor SEMREL_NEXT_VERSION.
SEMREL_NEXT_VERSIONFallbackWird nur verwendet, wenn SEMREL_VERSION leer ist.
SEMREL_DRY_RUNneinfalsetrue oder 1 inspiziert und plant ohne Tag oder Push.

Ein führendes v wird aus der Release-Version entfernt. SemVer-Build-Metadaten verwenden +, das in einem Docker-Tag ungültig ist. Deshalb wird + als _ kodiert. v1.4.0+build.7 wird beispielsweise zum Tag 1.4.0_build.7.

Leere Werte, CR/LF oder andere Steuerzeichen, nicht aufgelöste Platzhalter, Digest-Ziele, Ziele ohne expliziten Tag und ungültige Docker-Referenzen werden vor jeder Mutation abgelehnt.

Bei jedem Aufruf:

  1. inspiziert das Plugin das Quell-Image;
  2. inspiziert es das Ziel und entscheidet, ob dessen Tag erstellt, ersetzt oder beibehalten werden muss;
  3. taggt es nur bei Bedarf;
  4. inspiziert es das Ziel erneut und prüft, dass es das Quell-Image bezeichnet;
  5. führt es genau einen docker image push aus;
  6. meldet es eine vertrauenswürdige unveränderliche repository@sha256:...-Referenz aus dem Push oder dem passenden RepoDigests-Eintrag.

Beispielausgabe:

publisher-docker: published ghcr.io/acme/api:1.4.0 as ghcr.io/acme/api@sha256:...

Docker-Befehlsdiagnosen werden bereinigt statt wörtlich übernommen, damit Daemon- oder Registry-Fehler keine Zugangsdaten offenlegen.

Ein direkter Plugin-Dry-Run benötigt weiterhin Docker-CLI, Daemon und Quell-Image. Er inspiziert Quelle und Ziel und meldet, ob der Tag erstellt, ersetzt oder beibehalten würde. Er taggt und pusht nie und erstellt daher weder einen lokalen Ziel-Tag noch ein entferntes Manifest.

Terminal-Fenster
SEMREL_PLUGIN_IMAGE=acme-api:build \
SEMREL_PLUGIN_REF='ghcr.io/acme/api:{version}' \
SEMREL_VERSION=v1.4.0 \
SEMREL_DRY_RUN=true \
semrel-plugin-publisher-docker

Das MVP baut keine Images, meldet sich nicht an, signiert nicht, wiederholt keine Pushes, wendet keine Tag-Richtlinien an, erstellt keine Channel-Tags und setzt keine Multi-Plattform-Images/-Manifeste zusammen.