Files
drone-publish-tool/README.md
Patrick Gniza 344afb8c81
Some checks failed
continuous-integration/drone Build encountered an error
first commit
2025-11-08 16:56:11 +01:00

178 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🚀 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 |