Doku/Release: kein ATN-Signieren (Thunderbird braucht keine Signatur); release.sh baut sauberes XPI; Auto-Update verlangt anonymen Gitea-Zugriff

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sylyx 2026-06-16 10:50:31 +02:00
parent dad16d6ba2
commit 23909dceeb
2 changed files with 66 additions and 46 deletions

View File

@ -74,11 +74,15 @@ Gegen den **Test-Schrank `LL_TEST_BELEGE`** ablegen, dann per DocuWare-MCP gegen
- Anhänge erscheinen als eigene Dokumente
- Aufräumen: `docuware_delete_document` (nur im Test-Schrank!)
## Verteilung & automatische Updates (eigenes Gitea, nicht öffentlich)
## Verteilung & automatische Updates (eigenes Gitea)
Das Add-on wird **nicht** öffentlich auf addons.thunderbird.net gelistet, sondern
über AMO als **„Selbstständig" (self-distribution)** signiert und über dein eigenes
Gitea verteilt + aktualisiert.
Das Add-on wird **nicht** auf addons.thunderbird.net gelistet, sondern als **unsigniertes
XPI** über dein eigenes Gitea verteilt + aktualisiert.
> **Kein Signieren nötig.** Thunderbird verlangt für self-distributed Add-ons keine
> Mozilla-Signatur, und addons.thunderbird.net (ATN) zeichnet Thunderbird-Add-ons ohnehin
> nicht gegen (jede hochgeladene Version bleibt `signed=false`, `web-ext sign` schlägt mit
> „no signed files were found" fehl). Wir bauen das XPI also lokal und verteilen es direkt.
> Im XPI und in `updates.json` stehen **keine** Zugangsdaten. Das DocuWare-Passwort
> wird ohnehin nirgends gespeichert (nur Sitzungs-Token im Speicher) und nie mitverteilt.
@ -87,21 +91,34 @@ Gitea verteilt + aktualisiert.
1. In `manifest.json``applications.gecko.update_url` die Domain `GITEA.EXAMPLE.DE`
durch deine (HTTPS-)Gitea-Adresse ersetzen. **HTTPS ist Pflicht** (TB lehnt HTTP ab).
2. `updates.json` ebenfalls auf deine Gitea-URLs anpassen und in dein Repo committen
(erreichbar unter der `update_url`, z.B. via *raw*-Link auf `main`).
2. `updates.json` ebenfalls auf deine Gitea-URLs anpassen und in dein Repo committen.
3. ⚠️ **`update_url` und Release-Assets müssen ANONYM (ohne Login) erreichbar sein** —
sonst bekommt Thunderbird beim Update-Check nur die Login-Seite und aktualisiert nie.
Bei Gitea: Repo öffentlich **und** instanzweit `REQUIRE_SIGNIN_VIEW = false` (in
`app.ini`, Abschnitt `[service]`).
**Bei jedem neuen Release:**
**Bei jedem neuen Release** am einfachsten mit `scripts/release.sh` (baut sauberes XPI,
patcht `updates.json`, committet/pusht, legt Gitea-Release an + lädt das Asset hoch):
1. `version` in `manifest.json` erhöhen (z.B. `0.8.0``0.8.1`).
2. XPI bauen (`manifest.json` muss im Archiv-Wurzelverzeichnis liegen).
3. XPI bei AMO hochladen → **„Selbstständig"** wählen → **signiertes** XPI herunterladen.
4. Signiertes XPI als Release-Anhang in Gitea hochladen (passend zum `update_link`).
5. In `updates.json` einen neuen Eintrag mit `version` + `update_link` ergänzen,
committen/pushen.
```bash
scripts/release.sh 0.10.2 # Version setzen + alles erledigen
```
Manuell wären das die Schritte: `version` in `manifest.json` erhöhen → sauberes XPI bauen
(`manifest.json` im Archiv-Wurzelverzeichnis; `scripts/`, `docs/`, `.env` **nicht** mit
einpacken) → XPI als Release-Anhang in Gitea hochladen → Eintrag (`version` + `update_link`)
in `updates.json` ergänzen, committen/pushen.
Thunderbird prüft die `update_url` periodisch und aktualisiert automatisch auf die
neueste dort gelistete Version.
**Nach dem Release verifizieren** (anonym, genau wie Thunderbird):
```bash
curl -L .../raw/branch/main/updates.json # muss JSON liefern, nicht die Login-Seite
curl -sI -L .../releases/download/vX/...xpi # Content-Type: application/octet-stream
```
## Bekannte Grenzen / nächste Schritte
- **PDF** ist v1 ein einfaches Text-PDF (Kopf + Klartext-Body) ohne HTML-Layout/Bilder.

View File

@ -1,29 +1,36 @@
#!/usr/bin/env bash
#
# release.sh signiert die Extension bei addons.thunderbird.net (Kanal "unlisted",
# also signiert ABER nicht öffentlich gelistet), lädt das signierte XPI als
# Gitea-Release hoch und trägt es in updates.json fürs Auto-Update ein.
# release.sh baut ein sauberes XPI, lädt es als Gitea-Release hoch und trägt es
# in updates.json fürs Auto-Update ein.
#
# Benötigt: bash, node, npx, curl, git. web-ext wird genutzt, wenn global
# installiert; sonst automatisch via "npx web-ext" (kein globales Install nötig).
# KEIN Signieren: Thunderbird verlangt für self-distributed Add-ons keine
# Mozilla-Signatur, und addons.thunderbird.net (ATN) zeichnet Thunderbird-Add-ons
# ohnehin nicht gegen (jede Version bleibt `signed=false`; "web-ext sign" scheitert
# mit "no signed files were found"). Wir verteilen also das unsignierte XPI direkt
# über Gitea genau wie schon 0.8.0, das nie bei ATN war.
#
# WICHTIG fürs Auto-Update: update_url und Release-Asset müssen ANONYM (ohne Login)
# erreichbar sein. Bei Gitea heißt das: Repo öffentlich UND instanzweit
# REQUIRE_SIGNIN_VIEW=false (in app.ini). Sonst bekommt Thunderbird beim Update-Check
# nur die Login-Seite und aktualisiert nie.
#
# Benötigt: bash, node, curl, git. Zum Bauen zusätzlich npx (web-ext); im --xpi-Modus
# nicht nötig.
#
# Secrets kommen aus der Umgebung bzw. aus scripts/.env (gitignored, NIE committen):
# ATN_API_KEY API-Schlüssel von addons.thunderbird.net (Entwicklerbereich)
# ATN_API_SECRET zugehöriges Secret
# GITEA_TOKEN Gitea Personal Access Token (Scope: write:repository)
# Optionale Overrides (sonst aus dem git-Remote "origin" abgeleitet):
# GITEA_BASE, GITEA_OWNER, GITEA_REPO, REPO_DIR
#
# Aufruf:
# scripts/release.sh # signiert via ATN, nutzt Version aus manifest.json
# scripts/release.sh 0.9.0 # setzt zuerst diese Version, dann signieren
# scripts/release.sh --xpi <datei.xpi> # bereits signiertes XPI veröffentlichen
# scripts/release.sh # baut sauberes XPI, Version aus manifest.json
# scripts/release.sh 0.9.0 # setzt zuerst diese Version, dann bauen
# scripts/release.sh --xpi <datei.xpi> # fertiges XPI/ZIP veröffentlichen (kein Build)
# scripts/release.sh --xpi <datei.xpi> 0.9.0
#
# Hinweis ATN: addons.thunderbird.net gibt das signierte XPI nicht zuverlässig über
# die API zurück. In der Praxis: einmal mit dem Skript hochladen (legt die Version an),
# das signierte XPI aus dem ATN-Entwicklerbereich herunterladen, dann mit --xpi
# veröffentlichen. Der --xpi-Modus überspringt das Signieren komplett.
# Verifikation nach jedem Release (anonym, wie Thunderbird):
# curl -L .../raw/branch/main/updates.json → muss JSON liefern, nicht die Login-Seite
# curl -L .../releases/download/vX/...xpi → Content-Type application/octet-stream
#
set -euo pipefail
@ -57,13 +64,10 @@ need node; need curl; need git
[ -f "$UPDATES" ] || die "updates.json nicht gefunden ($UPDATES)."
: "${GITEA_TOKEN:?GITEA_TOKEN fehlt (scripts/.env oder Umgebung)}"
if [ -z "$PRESIGNED" ]; then
# web-ext: ATN nutzt die Signing-API v4. Das geht nur mit web-ext 7.x ab 8.x
# spricht web-ext ausschließlich die AMO-v5-API und ATN antwortet mit 404.
# Daher fest auf 7.x via npx (kein globales Install nötig); per WEBEXT_CMD überschreibbar.
# Sauberes Paket wird mit "web-ext build" erzeugt (kein Signieren, daher
# versionsunabhängig). Per WEBEXT_CMD überschreibbar.
need npx
WEBEXT="${WEBEXT_CMD:-npx --yes web-ext@^7}"
: "${ATN_API_KEY:?ATN_API_KEY fehlt (scripts/.env oder Umgebung)}"
: "${ATN_API_SECRET:?ATN_API_SECRET fehlt}"
WEBEXT="${WEBEXT_CMD:-npx --yes web-ext}"
fi
# --- Version setzen / lesen ---------------------------------------------------
@ -100,26 +104,25 @@ echo "Release $VERSION (Add-on $ADDON_ID)"
echo " Gitea : $GITEA_BASE/$GITEA_OWNER/$GITEA_REPO (Branch $BRANCH)"
echo " Asset : $UPDATE_LINK"
# --- 1) XPI besorgen: entweder bereits signiert (--xpi) oder via ATN signieren --
# --- 1) XPI besorgen: fertiges Paket (--xpi) oder sauber selbst bauen -----------
mkdir -p "$ARTIFACTS"
if [ -n "$PRESIGNED" ]; then
echo "→ Nutze vorsigniertes XPI: $PRESIGNED"
echo "→ Nutze fertiges Paket: $PRESIGNED"
cp -f "$PRESIGNED" "$ARTIFACTS/$XPI_NAME"
else
echo "→ Signiere bei addons.thunderbird.net (unlisted) …"
rm -f "$ARTIFACTS"/*.xpi 2>/dev/null || true
$WEBEXT sign \
--channel=unlisted \
--api-url-prefix="https://addons.thunderbird.net/api/v4" \
--api-key="$ATN_API_KEY" \
--api-secret="$ATN_API_SECRET" \
echo "→ Baue sauberes XPI (web-ext build) …"
rm -f "$ARTIFACTS"/*.zip "$ARTIFACTS"/*.xpi 2>/dev/null || true
# --ignore-files hält Secrets/Build-Kram raus: scripts/ (mit .env!), docs/,
# web-ext-artifacts/, *.md, *.xpi, git-Kram und updates.json (gehört NICHT ins XPI).
$WEBEXT build \
--source-dir="$REPO_DIR" \
--artifacts-dir="$ARTIFACTS" \
--overwrite-dest \
--ignore-files "web-ext-artifacts/**" "scripts/**" "docs/**" "*.md" "*.xpi" \
".git/**" ".gitignore" "*.env" ".env"
SIGNED="$(ls -t "$ARTIFACTS"/*.xpi 2>/dev/null | head -1)"
[ -n "${SIGNED:-}" ] && [ -f "$SIGNED" ] || die "Kein signiertes XPI in $ARTIFACTS gefunden."
cp -f "$SIGNED" "$ARTIFACTS/$XPI_NAME"
".git/**" ".gitignore" "*.env" ".env" "updates.json"
BUILT="$(ls -t "$ARTIFACTS"/*.zip 2>/dev/null | head -1)"
[ -n "${BUILT:-}" ] && [ -f "$BUILT" ] || die "Kein Paket in $ARTIFACTS gebaut."
cp -f "$BUILT" "$ARTIFACTS/$XPI_NAME"
fi
echo "✓ XPI bereit: $ARTIFACTS/$XPI_NAME"