ci: Desktop-Pakete mit dem Updater-Schluessel signieren, Signatur und updateVersion ins Manifest

- ci.yml: Secrets TAURI_SIGNING_PRIVATE_KEY/_PASSWORD als env nur an den
  beiden tauri-build-Schritten des Jobs desktop (kein Job-env, kein
  --no-sign); alles andere strukturgleich
- desktop-collect.sh: liest <bundle>.sig (genau eine Base64-Zeile) als
  files.<p>.signature ins Manifest, schreibt updateVersion (X.Y.Z bzw.
  X.Y.Z-beta.g<sha7>); fehlende .sig bricht auf main/Tag oder bei
  gesetztem Schluessel ab, warnt sonst (dev, lokal --no-sign)
- desktop-stamp.sh check: kein Cache-Stand ohne updateVersion und
  Signaturen beider Plattformen
- .gitignore: *.key

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 15:34:45 +02:00
parent de81c74e53
commit 7004b5b020
4 changed files with 97 additions and 5 deletions
+16
View File
@@ -43,6 +43,13 @@
# liest ausserhalb von apps/desktop keine Werkstatt-Datei -- frontendDist ist
# ../src innerhalb von apps/desktop, keine Abhaengigkeit auf packages/*.
#
# quick-260917-kgc: `check` verlangt zusaetzlich `updateVersion` und je
# Plattform `files.<p>.signature` im gecachten Manifest -- ein Cache-Stand
# aus der Zeit vor der Update-Funktion (oder aus einem Bau mit --no-sign)
# wird nie uebernommen, sonst lieferte der Update-Endpunkt dauerhaft 204.
# Ein Schluesselwechsel (`pubkey` in tauri.conf.json unter apps/desktop)
# aendert den Stempel automatisch, weil apps/desktop in DESKTOP_PATHS liegt.
#
# Dieses Skript kennt kein Secret.
set -eu
@@ -112,6 +119,10 @@ cmd_check() {
if [ "$SHA" != "$EXP_SHA" ]; then
no_reuse "Pruefsumme von $2 weicht ab"
fi
SIG="$(jq -r ".files.$1.signature // empty" "$MANIFEST")"
if [ -z "$SIG" ]; then
no_reuse "Signatur fuer $2 fehlt im Manifest"
fi
}
if [ "$CACHE_HIT" != "true" ]; then
@@ -132,6 +143,11 @@ cmd_check() {
no_reuse "Version $MVERSION statt $STAMP_VERSION"
fi
UPDATE_VERSION="$(jq -r '.updateVersion // empty' "$MANIFEST")"
if [ -z "$UPDATE_VERSION" ]; then
no_reuse "updateVersion fehlt im Manifest (Stand vor der Update-Funktion)"
fi
LINUX_NAME="$(jq -r '.files.linux.name // empty' "$MANIFEST")"
WINDOWS_NAME="$(jq -r '.files.windows.name // empty' "$MANIFEST")"
if [ -z "$LINUX_NAME" ] || [ -z "$WINDOWS_NAME" ]; then