178 lines
5.7 KiB
Markdown
178 lines
5.7 KiB
Markdown
# 🚀 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 |
|