feat(desktop): signature updater Tauri + wizard persistant + protocole E2E (#77)
CI / lint (push) Successful in 1m11s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m22s
CI / build (push) Successful in 1m41s
CI / e2e (push) Successful in 10m50s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
CI / lint (push) Successful in 1m11s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m22s
CI / build (push) Successful in 1m41s
CI / e2e (push) Successful in 10m50s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- Signature des mises a jour Tauri : paire de cles minisign generee, cle publique dans tauri.conf.json, createUpdaterArtifacts actif, secrets CI exposes (repli build non signe si secret absent). - Wizard 1er lancement : etat persistant wizard_done cote Rust (get_wizard_state/complete_wizard) pour ne plus reafficher la banniere, retro-compatible. - Protocole des 6 tests E2E manuels : docs/DESKTOP_E2E_CHECKLIST.md. - CI : desktop.test.mjs ajoute au job lint. - Docs : ROADMAP, fiche desktop-tauri, CHANGELOG, README desktop, guide releases. - fix(build): retirer les libs WeasyPrint inutiles du stage builder Docker.
This commit is contained in:
@@ -57,6 +57,90 @@ cargo tauri dev
|
||||
|
||||
---
|
||||
|
||||
## 2bis. Signature des mises à jour (updater Tauri)
|
||||
|
||||
La signature de l'auto-update Tauri est **indépendante** de la signature de code
|
||||
Windows et **gratuite**. Elle garantit qu'une mise à jour téléchargée provient bien
|
||||
de vous. Elle repose sur une paire de clés `minisign` :
|
||||
|
||||
- La **clé publique** est embarquée dans `desktop/tauri.conf.json`
|
||||
(`plugins.updater.pubkey`).
|
||||
- La **clé privée** signe les artefacts au build. Elle ne doit **jamais** être
|
||||
commitée (ignorée par `.gitignore`).
|
||||
|
||||
### A. Générer la paire de clés (une seule fois)
|
||||
|
||||
```bash
|
||||
cd desktop
|
||||
cargo tauri signer generate -w obsigate-updater.key
|
||||
# La clé publique s'affiche et est écrite dans obsigate-updater.key.pub
|
||||
```
|
||||
|
||||
> ⚠️ Conservez la clé privée en lieu sûr (gestionnaire de secrets). Si vous la
|
||||
> perdez, les mises à jour ne pourront plus être signées. Pour la protéger par mot
|
||||
> de passe : ajoutez `-p "<mot de passe>"`.
|
||||
|
||||
Copiez le contenu de `obsigate-updater.key.pub` dans
|
||||
`desktop/tauri.conf.json` → `plugins.updater.pubkey`.
|
||||
|
||||
### B. Build local signé
|
||||
|
||||
```powershell
|
||||
# Windows PowerShell
|
||||
$env:TAURI_SIGNING_PRIVATE_KEY = Get-Content -Raw .\obsigate-updater.key
|
||||
# $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD = "<mot de passe>" # si la clé en a un
|
||||
cargo tauri build --bundles nsis,msi
|
||||
```
|
||||
|
||||
```bash
|
||||
# Linux / Bash
|
||||
export TAURI_SIGNING_PRIVATE_KEY="$(cat obsigate-updater.key)"
|
||||
# export TAURI_SIGNING_PRIVATE_KEY_PASSWORD="<mot de passe>"
|
||||
cargo tauri build --bundles appimage,deb
|
||||
```
|
||||
|
||||
Le CLI produit des fichiers `.sig` à côté de chaque artefact
|
||||
(`*.exe.sig`, `*.msi.sig`, `*.AppImage.sig`, `*.deb.sig`).
|
||||
|
||||
> Sans clé définie, `createUpdaterArtifacts` est actif et le build échoue : dans
|
||||
> le CI, l'étape désactive automatiquement les artefacts de mise à jour si le
|
||||
> secret est absent.
|
||||
|
||||
### C. Secrets CI (Gitea)
|
||||
|
||||
Dans **Dépôt → Paramètres → Actions → Secrets**, créez :
|
||||
|
||||
| Secret | Valeur |
|
||||
|---|---|
|
||||
| `TAURI_SIGNING_PRIVATE_KEY` | contenu **intégral** du fichier `.key` |
|
||||
| `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` | mot de passe de la clé (vide si aucun) |
|
||||
|
||||
Le workflow `.gitea/workflows/desktop-build.yml` les expose aux étapes de build ;
|
||||
les fichiers `.sig` sont uploadés comme artefacts.
|
||||
|
||||
### D. Manifeste de mise à jour (`latest.json`)
|
||||
|
||||
Le CLI Tauri génère les `.sig` mais **pas** le manifeste JSON consommé par
|
||||
l'updater. L'endpoint configuré
|
||||
(`.../releases/latest`) doit servir un document de la forme :
|
||||
|
||||
```json
|
||||
{
|
||||
"version": "2.3.0",
|
||||
"notes": "…",
|
||||
"pub_date": "2026-09-12T00:00:00Z",
|
||||
"platforms": {
|
||||
"windows-x86_64": { "signature": "<contenu .msi.sig>", "url": "<URL du .msi>" },
|
||||
"linux-x86_64": { "signature": "<contenu .AppImage.sig>", "url": "<URL .AppImage>" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Sans ce manifeste, l'updater ne détecte aucune mise à jour (la signature, elle,
|
||||
est déjà opérationnelle).
|
||||
|
||||
---
|
||||
|
||||
## 3. Commit, Push & Tagging Git
|
||||
|
||||
Une fois les modifications testées et validées :
|
||||
|
||||
Reference in New Issue
Block a user