feat(desktop): manifeste de mise a jour latest.json + builds locaux signes (#77)
CI / lint (push) Successful in 1m7s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m12s
CI / build (push) Successful in 42s
CI / e2e (push) Successful in 10m43s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
CI / lint (push) Successful in 1m7s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m12s
CI / build (push) Successful in 42s
CI / e2e (push) Successful in 10m43s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- scripts/updater_manifest.py : construit latest.json (version, pub_date, platforms Windows/Linux avec signature .sig et URLs des assets). - publish_release.py : genere latest.json, upload des .sig + latest.json, rappel de commit. - tauri.conf.json : endpoint updater -> raw/branch/main/desktop/latest.json. - build-windows.bat / build-linux.sh : detection automatique de obsigate-updater.key (signature) ou repli non signe. - .gitignore : ignore desktop/key/ ; tests/test_updater_manifest.py (8 tests).
This commit is contained in:
@@ -128,10 +128,9 @@ fenêtre existante** (single-instance) au lieu de lancer un doublon.
|
||||
**Résultat attendu :** détection de la version N+1, téléchargement, installation
|
||||
sans intervention manuelle, version mise à jour après redémarrage.
|
||||
|
||||
**Prérequis bloquant :** la `pubkey` de l'updater dans `desktop/tauri.conf.json`
|
||||
ne doit **pas** être le placeholder `OBSIGATE_UPDATE_PUBKEY_PLACEHOLDER`, et la
|
||||
clé privée correspondante doit être fournie au build
|
||||
(`TAURI_SIGNING_PRIVATE_KEY`). Voir §4.
|
||||
**Prérequis bloquant :** la release N+1 doit être publiée (binaires **signés**
|
||||
`.sig` + `latest.json`) et le fichier `desktop/latest.json` **commité sur `main`**
|
||||
(le manifeste est généré par `scripts/publish_release.py`, cf. §4).
|
||||
|
||||
---
|
||||
|
||||
@@ -172,14 +171,11 @@ aucun raccourci cassé.
|
||||
`OBSIGATE_SIGN_CERT_PFX` est défini ; sinon il est un no-op explicite.
|
||||
Alternatives détaillées dans le [README desktop](../desktop/README.md).
|
||||
- **Signature de l'updater Tauri (gratuite, distincte de la signature Windows) :**
|
||||
générer une paire de clés, renseigner la `pubkey` dans
|
||||
`desktop/tauri.conf.json` et exposer la clé privée au build via
|
||||
`TAURI_SIGNING_PRIVATE_KEY`. La clé privée **ne doit jamais être commitée**.
|
||||
|
||||
```bash
|
||||
cargo tauri signer generate -w ~/.tauri/obsigate.key
|
||||
# → copier la clé publique affichée dans plugins.updater.pubkey
|
||||
```
|
||||
déjà configurée — `pubkey` dans `desktop/tauri.conf.json`, clé privée lue depuis
|
||||
`desktop/obsigate-updater.key` (gitignorée) ou `TAURI_SIGNING_PRIVATE_KEY`.
|
||||
Le manifeste `latest.json` est généré par `scripts/publish_release.py` puis
|
||||
commité sur `main`. Procédure :
|
||||
[DEVELOPMENT_AND_RELEASES §2bis](./DEVELOPMENT_AND_RELEASES.md#2bis-signature-des-mises-à-jour-updater-tauri).
|
||||
|
||||
## 5. Clôture
|
||||
|
||||
|
||||
@@ -121,8 +121,30 @@ 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 :
|
||||
l'updater. Celui-ci est produit par `scripts/updater_manifest.py` :
|
||||
|
||||
```powershell
|
||||
# Windows — après build-windows.bat
|
||||
.\.venv\Scripts\python.exe scripts\updater_manifest.py --tag v2.3.0
|
||||
```
|
||||
|
||||
`publish_release.py` l'appelle automatiquement : il écrit `desktop/latest.json`,
|
||||
l'ajoute aux assets de la release, et rappelle la dernière étape manuelle.
|
||||
|
||||
**Flux complet de release :**
|
||||
|
||||
1. `desktop\build-windows.bat` (build + signature `.sig`) ;
|
||||
2. `python scripts\publish_release.py --tag vX.Y.Z` (checksums + `latest.json` + upload) ;
|
||||
3. **commit** de `desktop/latest.json` sur `main` puis `git push`.
|
||||
|
||||
L'endpoint de l'updater (`desktop/tauri.conf.json`) pointe vers ce fichier
|
||||
versionné :
|
||||
|
||||
```
|
||||
https://git.dracodev.net/Projets/ObsiGate/raw/branch/main/desktop/latest.json
|
||||
```
|
||||
|
||||
Document produit (URLs construites vers les assets de la release) :
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -130,14 +152,15 @@ l'updater. L'endpoint configuré
|
||||
"notes": "…",
|
||||
"pub_date": "2026-09-12T00:00:00Z",
|
||||
"platforms": {
|
||||
"windows-x86_64": { "signature": "<contenu .msi.sig>", "url": "<URL du .msi>" },
|
||||
"windows-x86_64": { "signature": "<contenu .exe.sig>", "url": "<URL du .exe>" },
|
||||
"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).
|
||||
> Seules les plateformes dont l'artefact **signé** est présent sont incluses.
|
||||
> Sans `desktop/latest.json` à jour sur `main`, l'updater ne détecte aucune
|
||||
> mise à jour (la signature, elle, reste opérationnelle).
|
||||
|
||||
---
|
||||
|
||||
|
||||
+2
-2
@@ -36,7 +36,7 @@
|
||||
- **Statut :** livré (A→F) — projet Tauri, backend Python embarqué, fonctionnalités natives, jumplist vaults, bannière 1er lancement, build CI, UX, 24 tests Rust. Détail complet : [features/desktop-tauri.md](./features/desktop-tauri.md)
|
||||
- **Reste à faire :**
|
||||
- [x] **Signature de l'updater Tauri** (gratuit) : paire de clés générée, `pubkey` renseignée, `createUpdaterArtifacts` activé, secrets CI câblés
|
||||
- [ ] Générer le manifeste `latest.json` pour que l'updater détecte les mises à jour
|
||||
- [x] **Manifeste `latest.json`** généré par `scripts/updater_manifest.py` (intégré à `publish_release.py`), endpoint updater pointé sur `main`
|
||||
- [ ] **Signature de code Windows** : non retenue (pas de certificat) — alternatives : livrer non signé, SignPath.io (OSS gratuit), Certum OSS, Azure Trusted Signing, certificat EV
|
||||
- [ ] Exécuter les 6 tests E2E **manuels** — protocole documenté : [DESKTOP_E2E_CHECKLIST.md](./DESKTOP_E2E_CHECKLIST.md)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
| Priorité | Items | Effort total estimé |
|
||||
|---|---|---|
|
||||
| ✅ Complété | #1 → #59, #61–72, #74–76, #78–80 | ~103 jours réalisés |
|
||||
| 🔵 P2 restant | #77 Desktop : manifeste `latest.json`, signature de code (non retenue), 6 tests E2E **manuels** ([protocole](./DESKTOP_E2E_CHECKLIST.md)) | ~0,5-1 jour |
|
||||
| 🔵 P2 restant | #77 Desktop : signature de code (non retenue), 6 tests E2E **manuels** ([protocole](./DESKTOP_E2E_CHECKLIST.md)) | ~0,5-1 jour |
|
||||
| ⚪ P4 restant | #73 Sync (6-8j) | 6-8 jours |
|
||||
| **Total restant** | **2 items + finitions** | **~7-10 jours** |
|
||||
|
||||
|
||||
@@ -57,7 +57,8 @@
|
||||
- [x] **Build Windows local** : `cargo build --release` vérifié (rustc 1.94.1) — `cargo tauri build --bundles msi` prêt
|
||||
- [x] **Build Linux local** : workflow CI couvre `.deb`, `.rpm`, `.AppImage`
|
||||
- [x] **Auto-update** : `tauri-plugin-updater` configuré → vérifie `https://git.dracodev.net/api/v1/repos/Projets/ObsiGate/releases/latest`
|
||||
- [x] **Signature de l'updater Tauri** (gratuite, ≠ signature Windows) : paire de clés `minisign` générée, clé publique dans `plugins.updater.pubkey`, `bundle.createUpdaterArtifacts: true`, secrets Gitea `TAURI_SIGNING_PRIVATE_KEY` / `_PASSWORD` exposés au CI (build non signé en repli si le secret est absent). Reste : générer le manifeste `latest.json` pour que l'updater détecte les mises à jour ([guide](../DEVELOPMENT_AND_RELEASES.md#2bis-signature-des-mises-à-jour-updater-tauri))
|
||||
- [x] **Signature de l'updater Tauri** (gratuite, ≠ signature Windows) : paire de clés `minisign` générée, clé publique dans `plugins.updater.pubkey`, `bundle.createUpdaterArtifacts: true`, secrets Gitea `TAURI_SIGNING_PRIVATE_KEY` / `_PASSWORD` exposés au CI (build non signé en repli si le secret est absent).
|
||||
- [x] **Manifeste `latest.json`** : généré par `scripts/updater_manifest.py` (et automatiquement par `publish_release.py`), endpoint de l'updater pointé sur `raw/branch/main/desktop/latest.json`. Builds locaux signés via `obsigate-updater.key` ([guide](../DEVELOPMENT_AND_RELEASES.md#2bis-signature-des-mises-à-jour-updater-tauri))
|
||||
- [ ] **Signature de code Windows** : non retenue (pas de certificat) — alternatives : livrer non signé, SignPath.io (OSS gratuit), Certum Open Source, Azure Trusted Signing, certificat EV
|
||||
- [x] **Page de release** : README desktop existe (`desktop/README.md`)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user