Patrick Gniza 668836a8fa
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
drone.yml update
2025-11-08 17:20:20 +01:00
2025-11-08 17:20:20 +01:00
2025-11-08 16:56:11 +01:00
2025-11-08 16:56:11 +01:00
2025-11-08 16:56:11 +01:00
2025-11-08 16:56:11 +01:00
2025-11-08 16:56:11 +01:00
2025-11-08 16:56:11 +01:00

🚀 Drone Publish Tool

Ein leichtgewichtiges CI-Tool auf Basis von Alpine Linux, das in einer Drone CI-Pipeline automatisch:

  1. Docker-Images mit Cosign signiert 🔏
  2. und Releases in Gitea erstellt 🏷️

Das Tool vereinfacht den gesamten Veröffentlichungsprozess — von der Signierung bis zum Release —
und funktioniert sowohl innerhalb von Drone als auch manuell.


🧩 Features

  • Automatisches Signieren von Container-Images via Cosign
  • Automatische Release-Erstellung in Gitea
  • Vollständig über Umgebungsvariablen steuerbar (ideal für Drone Secrets)
  • Kompatibel mit privaten Docker-Registries (z. B. Zot, Harbor, etc.)
  • Minimal, sicher, portabel basiert auf Alpine Linux

⚙️ Voraussetzungen

  1. Drone CI ist mit Gitea verbunden (z. B. via OAuth oder Token).
  2. Dein Docker-Image ist bereits gebaut und in der Registry verfügbar.
  3. Du hast die unten genannten Secrets in Drone hinterlegt.
  4. Für die Signierung ist ein Cosign-Schlüssel vorhanden (siehe unten).

🔐 Erforderliche Secrets

Secret Name Beschreibung Beispielwert
REGISTRY_URL Basis-URL deiner Registry registry.example.com
DOCKER_USER Benutzername für Registry-Login ci-user
DOCKER_PASS Passwort oder Token für Registry changeme123
COSIGN_KEY Inhalt des privaten Cosign-Schlüssels (nicht der Pfad!) -----BEGIN ENCRYPTED PRIVATE KEY-----...
COSIGN_PASSWORD Passwort für den Cosign-Schlüssel (kann leer sein) (leer)
GITEA_URL Basis-URL deines Gitea-Servers https://gitea.example.com
GITEA_TOKEN Personal Access Token für Gitea API ghp_abc123tokenxyz

🔑 Cosign-Schlüssel erzeugen

Falls du noch keinen Cosign-Schlüssel hast, kannst du ihn einfach per Docker erzeugen:

docker run --rm -v $(pwd):/keys \
  -e COSIGN_PASSWORD="meinpasswort" \
  gcr.io/projectsigstore/cosign:latest generate-key-pair

Danach findest du zwei Dateien:

  • 🗝️ cosign.key → Privater Schlüssel (als Secret COSIGN_KEY in Drone hinterlegen)
  • 🔓 cosign.pub → Öffentlicher Schlüssel (optional in Zot für Signaturprüfung hinterlegen)

Beispiel: Verwendung in Drone CI

Nach erfolgreichem Build kann das Tool als separater Step eingebunden werden,
um das erstellte Image zu signieren und in Gitea automatisch als Release zu veröffentlichen.

kind: pipeline
type: docker
name: release

steps:
  - name: build
    image: docker:26
    privileged: true
    environment:
      REGISTRY_URL:
        from_secret: REGISTRY_URL
      DOCKER_USER:
        from_secret: DOCKER_USER
      DOCKER_PASS:
        from_secret: DOCKER_PASS
    volumes:
      - name: docker_sock
        path: /var/run/docker.sock
    commands:
      - docker login $REGISTRY_URL -u "$DOCKER_USER" -p "$DOCKER_PASS"
      - docker build -t $REGISTRY_URL/public/myapp:$DRONE_BUILD_NUMBER .
      - docker push $REGISTRY_URL/public/myapp:$DRONE_BUILD_NUMBER
      - echo "IMAGE_FULL=$REGISTRY_URL/public/myapp:$DRONE_BUILD_NUMBER" >> build.env
      - echo "VERSION_TAG=v$DRONE_BUILD_NUMBER" >> build.env

  - name: publish
    image: registry.example.com/public/drone-publish-tool:latest
    environment:
      COSIGN_KEY:
        from_secret: COSIGN_KEY
      COSIGN_PASSWORD:
        from_secret: COSIGN_PASSWORD
      GITEA_URL:
        from_secret: GITEA_URL
      GITEA_TOKEN:
        from_secret: GITEA_TOKEN
      REGISTRY_URL:
        from_secret: REGISTRY_URL
      DOCKER_USER:
        from_secret: DOCKER_USER
      DOCKER_PASS:
        from_secret: DOCKER_PASS
    commands:
      - . build.env
      - export GITEA_REPO="$DRONE_REPO_OWNER/$DRONE_REPO_NAME"
      - /usr/local/bin/entrypoint.sh

volumes:
  - name: docker_sock
    host:
      path: /var/run/docker.sock

💡 Hinweis:
IMAGE_FULL und VERSION_TAG werden aus dem Build-Step übernommen,
damit das Tool weiß, welches Image signiert und welcher Release erstellt werden soll.


🧰 Beispiel: Manuelle Nutzung

Du kannst das Tool auch außerhalb von Drone direkt ausführen,
z. B. zum Testen oder für manuelle Releases:

docker run --rm \
  -e IMAGE_FULL=registry.example.com/public/myapp:v42 \
  -e VERSION_TAG=v42 \
  -e COSIGN_KEY="$(cat cosign.key)" \
  -e COSIGN_PASSWORD="" \
  -e GITEA_URL=https://gitea.example.com \
  -e GITEA_TOKEN=ghp_abc123tokenxyz \
  -e GITEA_REPO=patrick/myapp \
  registry.example.com/public/drone-publish-tool:latest

Damit signierst du das Image myapp:v42 und erzeugst gleichzeitig ein Release in Gitea.
Das funktioniert auch ohne Drone CI ideal zum Testen oder Troubleshooting.


📦 Image-Metadaten (OCI Labels)

Das Tool bringt vollständige OCI Labels mit,
damit es in Registries wie Zot oder Harbor korrekt beschrieben angezeigt wird:

Label Beschreibung
org.opencontainers.image.title Drone Publish Tool
org.opencontainers.image.description Automatisiertes Drone CI Tool zum Signieren und Erstellen von Gitea-Releases
org.opencontainers.image.version 1.0.0
org.opencontainers.image.vendor Buchhorster IT
org.opencontainers.image.source https://gitea.buchhorster.de/patrick/drone-publish-tool
org.opencontainers.image.licenses MIT

🧾 Lizenz

MIT License
© 2025 Patrick Buchhorst / Buchhorster IT


🧩 Changelog

Version Änderungen
1.0.0 Erste Version mit Image-Signing (Cosign) und Gitea-Release-Funktion
Description
Automatisiertes Drone CI Tool zum Signieren (Cosign) und Erstellen von Gitea-Releases
Readme 55 KiB
Release v32 Latest
2025-11-08 18:38:34 +00:00
Languages
Shell 52.6%
Makefile 24.6%
Dockerfile 22.8%