release.sh: web-ext 7.x für ATN-API v4 pinnen + --xpi-Modus

- web-ext fest auf 7.x via npx (ab 8.x spricht es nur AMO-v5 → ATN gibt 404)
- korrekter Flag --api-url-prefix für ATN-API v4
- neuer --xpi-Modus: bereits signiertes XPI veröffentlichen (Gitea-Release +
  updates.json + push), ohne erneut zu signieren. Nötig, weil ATN das signierte
  XPI nicht über die API zurückgibt – Download aus dem ATN-Entwicklerbereich.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sylyx 2026-06-03 15:50:06 +02:00
parent 0ca212dd4c
commit 1b15973c9e

View File

@ -15,11 +15,25 @@
# GITEA_BASE, GITEA_OWNER, GITEA_REPO, REPO_DIR
#
# Aufruf:
# scripts/release.sh # nutzt die Version aus manifest.json
# scripts/release.sh 0.9.0 # setzt zuerst diese Version in manifest.json
# 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 --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.
#
set -euo pipefail
# --- Argumente: optional vorsigniertes XPI (--xpi) --------------------------
PRESIGNED=""
if [ "${1:-}" = "--xpi" ]; then
PRESIGNED="${2:-}"; shift 2
[ -n "$PRESIGNED" ] && [ -f "$PRESIGNED" ] || { echo "FEHLER: --xpi braucht eine existierende Datei." >&2; exit 1; }
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# .env (falls vorhanden) laden liefert die Secrets, ohne sie ins Repo zu schreiben.
@ -39,18 +53,18 @@ need() { command -v "$1" >/dev/null 2>&1 || die "'$1' nicht gefunden. Bitte inst
# --- Vorbedingungen -----------------------------------------------------------
need node; need curl; need git
# web-ext: global installiert bevorzugen, sonst per npx (kein globales Install nötig).
if command -v web-ext >/dev/null 2>&1; then
WEBEXT="web-ext"
else
need npx
WEBEXT="npx --yes web-ext"
fi
[ -f "$MANIFEST" ] || die "manifest.json nicht gefunden ($MANIFEST). Ggf. REPO_DIR setzen."
[ -f "$UPDATES" ] || die "updates.json nicht gefunden ($UPDATES)."
: "${ATN_API_KEY:?ATN_API_KEY fehlt (scripts/.env oder Umgebung)}"
: "${ATN_API_SECRET:?ATN_API_SECRET fehlt}"
: "${GITEA_TOKEN:?GITEA_TOKEN fehlt}"
: "${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.
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}"
fi
# --- Version setzen / lesen ---------------------------------------------------
if [ "${1:-}" ]; then
@ -86,10 +100,15 @@ echo "Release $VERSION (Add-on $ADDON_ID)"
echo " Gitea : $GITEA_BASE/$GITEA_OWNER/$GITEA_REPO (Branch $BRANCH)"
echo " Asset : $UPDATE_LINK"
# --- 1) Signieren (zuerst schlägt hier fehl, bevor irgendwas gepusht wird) ---
echo "→ Signiere bei addons.thunderbird.net (unlisted) …"
rm -f "$ARTIFACTS"/*.xpi 2>/dev/null || true
$WEBEXT sign \
# --- 1) XPI besorgen: entweder bereits signiert (--xpi) oder via ATN signieren --
mkdir -p "$ARTIFACTS"
if [ -n "$PRESIGNED" ]; then
echo "→ Nutze vorsigniertes XPI: $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" \
@ -98,11 +117,11 @@ $WEBEXT sign \
--artifacts-dir="$ARTIFACTS" \
--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"
echo "Signiert: $ARTIFACTS/$XPI_NAME"
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"
fi
echo "XPI bereit: $ARTIFACTS/$XPI_NAME"
# --- 2) updates.json patchen --------------------------------------------------
node -e 'const fs=require("fs");