Aller au contenu

Release macOS

Les releases publiques macOS sont produites par le workflow GitHub Actions de release sur tag ou via workflow_dispatch.

Le workflow exécute npm run package:signed:mac:all pour produire des DMG Intel et Apple Silicon. Avant le packaging, scripts/prepare-runtime-config.mjs écrit resources/config/default.json depuis les variables et secrets GitHub: URL API, remote logging et paramètres Better Stack si activés.

La CI importe le certificat Developer ID Application, active le Hardened Runtime via electron-builder, applique les entitlements explicites build/entitlements.mac.plist et build/entitlements.mac.inherit.plist, signe l’app et le DMG, puis déclenche la notarization Apple via notarytool. Après notarization, le ticket est stapled au DMG.

Le DMG est signé par défaut dans package.json. Les scripts unsigned gardent une surcharge explicite -c.dmg.sign=false, afin que les builds de PR restent non signés et reproductibles sans certificat.

Le workflow vérifie:

  • identité de signature disponible dans le keychain temporaire;
  • signature du DMG;
  • acceptation Gatekeeper du DMG avec spctl --type open;
  • signature codesign de l’app montée;
  • Team ID attendu sur l’app signée;
  • ticket stapler validate;
  • acceptation Gatekeeper avec spctl --assess;
  • présence des artefacts .dmg, .blockmap et latest*.yml.

Les mêmes contrôles peuvent être relancés localement sur macOS avec:

Fenêtre de terminal
npm run verify:mac

La commande accepte aussi un dossier ou une liste de DMG:

Fenêtre de terminal
npm run verify:mac -- --release-dir release
npm run verify:mac -- --expected-team-id 4AY78C99H2
npm run verify:mac -- --skip-dmg-gatekeeper
npm run verify:mac -- release/Obscura.Flow-0.26.2-arm64.dmg

Le workflow CI utilise --skip-dmg-gatekeeper parce que spctl --type open peut retourner Insufficient Context sur les runners GitHub Actions pour un DMG pourtant signé et valide. La CI continue de vérifier la signature du DMG, la signature de l’app montée, le Team ID attendu, le ticket stapled et l’acceptation Gatekeeper de l’app avec spctl --type execute.

Une release signée doit aussi contenir Resources/config/default.json avec une apiBaseUrl non vide. Quand OBSCURA_FLOW_REMOTE_LOGGING_ENABLED=true, le même fichier doit activer remoteLogging et contenir l’endpoint d’ingestion. Le token Better Stack n’est pas attendu dans les fichiers .obf; il est injecté uniquement dans la configuration runtime packagée tant que le relais API public n’existe pas.