@zevra/bureau-maj
v0.1.2
Published
Mise à jour automatique des applications de bureau Zevra (Mac, Windows) : contrat de nommage, route du flux, moteur côté app, configuration du build, publication vérifiée.
Downloads
701
Readme
@zevra/bureau-maj
Mise à jour automatique des applications de bureau Zevra (lexform, ZOS, Zevra Admin), Mac et Windows : téléchargée seule, installée au clic, sans jamais re-télécharger un installeur à la main.
Un seul module pour les trois bouts de la chaîne — qui divergeaient par app :
| Morceau | Import | Rôle |
|---|---|---|
| Contrat | @zevra/bureau-maj | Nommage des fichiers, clés du bucket, liste blanche, adresses. Pur. |
| Route | @zevra/bureau-maj/route | GET /api/desktop-maj/<os>/<fichier> sur chaque site : sert le pointeur, redirige les binaires, propose l'installeur. |
| Moteur | @zevra/bureau-maj/moteur | Autour d'electron-updater dans la coquille : télécharge seul, n'installe qu'au clic, survit aux pannes passagères. |
| Signature Windows | @zevra/bureau-maj/signature-windows | Vérification Authenticode stricte (celle d'electron-updater échoue ouverte). |
| Construction | @zevra/bureau-maj/construction | Les morceaux de configuration electron-builder : cibles, artifactName, publish, droit au flux. |
| Publication | zevra-bureau-maj (CLI) | Publier sur dev, promouvoir en prod, repointer, retirer. Pointeur écrit en dernier. |
Où vivent les fichiers
Bucket OVH Object Storage zevra-telechargements (EU-WEST-PAR), privé,
chaque objet en lecture publique (OVH n'a pas de politique de bucket ; une
liste publique dirait tout ce qu'on a publié). Un utilisateur S3 par
(app, env), borné à <app>/<env>/*, sans droit d'effacer.
<app>/<env>/maj/versions/<v>/<Prefixe>-<v>-mac-arm64.zip (+ .blockmap) immuable une fois scellée
<app>/<env>/maj/versions/<v>/<Prefixe>-<v>-mac-arm64.dmg
<app>/<env>/maj/versions/<v>/<Prefixe>-<v>-windows-x64.exe (+ .blockmap)
<app>/<env>/maj/versions/<v>/latest-mac.yml, latest.yml, manifeste.json le SCEAU
<app>/<env>/maj/mac/latest-mac.yml POINTEUR
<app>/<env>/maj/windows/latest.yml POINTEURLes apps installées ne connaissent que le site (https://<app>/api/desktop-maj/<os>/),
jamais le bucket : on peut changer d'hébergeur sans toucher au parc.
Brancher une app
- La définition, une fois, dans l'app (
desktop/bureau-maj.config.mjs) — une DONNÉE brute, sans import, pour que la CI la lise sans installer le dépôt :
La route et le build l'enveloppent dansexport default { nom: 'lexform', prefixeFichier: 'lexform', archsMac: ['arm64', 'x64'], windows: true }definirApp(...)(qui valide) ; la CLI le fait seule. - La route (Next) :
src/app/api/desktop-maj/[os]/[fichier]/route.ts
L'environnement est celui du site : un pod de prod ne sert que ce qui a été promu.import { creerRouteMaj } from '@zevra/bureau-maj/route' import app from '../../../../../../desktop/bureau-maj.config.mjs' const route = creerRouteMaj(app, { env: estProd() ? 'prod' : 'dev' }) export const dynamic = 'force-dynamic' export async function GET(req: Request, ctx: { params: Promise<{ os: string; fichier: string }> }) { return route(req, await ctx.params) } - Le build : fusionner
configurationMiseAJour(app, origineMaj(env, …), etatMaj(app, env, …))dans la configuration electron-builder. Pas de notarisation ⇒ pas de flux Mac ; pas de signature ou pas de DN ⇒ pas de flux Windows. - La coquille :
creerMoteur({ app, plateforme: plateformeMac(), origine, charger: () => require('electron-updater').autoUpdater, surAction, surIncident }). Appelerverifier()au lancement puis toutes les heures ;installer()après le clic et la boîte de confirmation de l'app. Sous Windows, passerverifierSignature: verifierSignatureStricte. Brancher la veille :suivreVeille(moteur, powerMonitor). Sans elle, un Mac capot fermé lance des vérifications pendant ses micro-réveils (Power Nap), qui échouent et remontent de faux incidents « reseau » (bureau-maj#1). - La CI : secrets
MAJ_S3_ACCESS_KEY_DEV/MAJ_S3_SECRET_KEY_DEV(dépôt) et_PROD(environnementproduction), puis :zevra-bureau-maj --config desktop/bureau-maj.config.mjs --verifier --dossier <sortie> --version X.Y.Z zevra-bureau-maj --config … --env dev --version X.Y.Z --dossier <sortie> # sur un tag desktop-vX.Y.Z zevra-bureau-maj --config … --env prod --promouvoir --version X.Y.Z # geste explicite zevra-bureau-maj --config … --env prod --repointer --version X.Y.Z [--os mac] # arrêter une diffusion zevra-bureau-maj --config … --env prod --retirer --os windows # arrêter sans version de repli
Ce qui est tenu par les tests (pnpm test)
- la liste blanche refuse une autre app, une autre architecture, une traversée ;
- la route ne sert que l'environnement du site, jamais en cache, 404 ≠ 503 ;
- le moteur télécharge seul, n'installe jamais sans
installer(), lit un pointeur absent comme « rien », survit à hors-ligne / 5xx / 429 avec recul, ne rend la main qu'après trois téléchargements ratés, ne vérifie pas pendant la veille et ne compte pas une demande coupée par elle, relit le pointeur avant d'installer et renonce si la diffusion a été arrêtée ; - la publication écrit les pointeurs en dernier, chaque objet en
public-read, refuse de réécrire une version scellée et de faire reculer un pointeur, reprend une version coupée en route, refuse de repointer en laissant un système servi, et sait retirer un système par la sentinelle0.0.0; - la vérification Authenticode refuse tout ce qui n'est pas une preuve.
Tests en français, un commentaire quand le cas n'est pas évident.
