# 🚀 Drone Publish Tool Ein leichtgewichtiges CI-Tool auf Basis von **Alpine Linux**, das in einer Drone CI-Pipeline automatisch: 1. Docker-Images mit **[Cosign](https://github.com/sigstore/cosign)** signiert 🔏 2. und **Releases in [Gitea](https://gitea.io/)** 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: ```bash 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. ```yaml 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: ```bash 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](https://github.com/opencontainers/image-spec/blob/main/annotations.md) 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 |