bug: les utilisateurs installes en .rpm ne peuvent pas se mettre a jour (latest.json ne sert que le .deb) #320
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#320
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
src-tauri/tauri.conf.json:26bundle["nsis", "deb", "rpm"]etrelease.ymlpublie les trois. Maislatest.jsonn'a qu'une entréelinux-x86_64, construite depuis le.deb(release.yml:104-122).Vérifié en analyse (tauri-plugin-updater 2.10.0, tauri-utils 2.8.2)
get_urls(updater.rs:568-598) essaie{os}-{arch}-{installer}puis{os}-{arch}(commentaire L579,format!L584 et L586).Installer::Rpm.name()="rpm"(L63), donc une installation rpm cherchelinux-x86_64-rpmen premier.__TAURI_BUNDLE_TYPE(tauri-utils/src/platform.rs:349-360), remplacé par le bundler dans chaque paquet ;installer_for_bundle_type(updater.rs:1426-1433).linux-x86_64), télécharge le.deb, puisinstall_rpm(L1058-1063) refuse les octets (infer::archive::is_rpm→InvalidUpdaterFormat). Une mise à jour proposée, puis un échec.release.yml: aucune modification Rust.tauri build(release.yml:50,--bundles deb,rpm), une étape d'empaquetage et environ 9,7 Mo d'upload.release.yml:158(«.debou.AppImage», aucun AppImage construit, rpm absent) ;README.md:44-45(AppImage). Le site (la-compagnie-maximus) ne propose que le.deb: rien à changer.Décision (Max, 2026-10-10)
Ajouter la clé
linux-x86_64-rpm(etlinux-x86_64-deb) àlatest.json, garder le rpm. Écarté : retirer le rpm (couperait Fedora/openSUSE pour un gain CI négligeable).Travail à faire
latest.jsondansscripts/build-latest-json.sh(voir « Décisions prises en planification »), appelé parrelease.yml: écrirelinux-x86_64-rpmetlinux-x86_64-deb; garderlinux-x86_64sur le.deb(repli, voir décisions).release.yml:158: notes « Linux :.deb(Debian, Ubuntu) ou.rpm(Fedora, openSUSE) », sans AppImage.README.md:43-45: retirer l'AppImage..claude/skills/release/scripts/verify-release.sh(L44-51) : exigerlinux-x86_64,linux-x86_64-deb,linux-x86_64-rpmetwindows-x86_64, et vérifier que l'URL de chaque clé Linux finit par la bonne extension (.deb/.rpm). Mettre à jour.claude/skills/release/SKILL.md:46en conséquence.docs/qa-update-cycle.md:65-69: la section « RPM — cassé, connu » devient une procédure de test du cycle rpm (à dérouler sur la prochaine release) ;:32inchangé (toujours pas d'AppImage).docs/architecture.md:617: mentionner les clés delatest.json.CHANGELOG.md/CHANGELOG.fr.md: Fixed / Corrigé, « les installations.rpmreçoivent les mises à jour automatiques ». Corrigé aussi pour les installations rpm existantes : vérifié le 2026-10-10, le binaire du.rpmv0.17.1 publié porte le marqueur__TAURI_BUNDLE_TYPE_VAR_RPM, donc il liralinux-x86_64-rpmdès que la release suivante le publie, sans réinstallation.Fichiers concernés
.forgejo/workflows/release.yml.claude/skills/release/scripts/verify-release.sh,.claude/skills/release/SKILL.mdREADME.md,docs/qa-update-cycle.md,docs/architecture.mdCHANGELOG.md,CHANGELOG.fr.mdSurface de test
scripts/build-latest-json.test.mjs(vitest), voir « Critères d'acceptation (planification) ».verify-release.sh: le lancer sur unlatest.jsonfactice sanslinux-x86_64-rpm→ échec ; avec → succès.verify-release.shvert sur les quatre clés ; un cycle de mise à jour réel depuis une installation rpm reste à faire quand une machine Fedora/openSUSE est disponible (hors PR, à noter dansqa-update-cycle.md).Critères d'acceptation
latest.jsongénéré portelinux-x86_64,linux-x86_64-deb,linux-x86_64-rpmetwindows-x86_64, chacun avec la bonne URL et sa signature.verify-release.shéchoue si une de ces clés manque ou pointe vers la mauvaise extension.Complexité estimée
Simple.
Liens
Relevé pendant #315 / #312 ;
docs/qa-update-cycle.md§3.Dépendances
Depends on
Fichiers concernés (complet)
scripts/build-latest-json.sh(nouveau),scripts/build-latest-json.test.mjs(nouveau).forgejo/workflows/release.yml(appel du script, délimiteur, assertion avant DELETE, notes de release L158).forgejo/workflows/check-frontend.yml(ajouterjqà l'apt-get install).claude/skills/release/scripts/verify-release.sh(chemin exact),.claude/skills/release/SKILL.md(L46 et checklist)README.md(L43-45),docs/qa-update-cycle.md(L32, L65-69),docs/architecture.md(réécrire tout le paragrapherelease.yml, L610-617 : il décrit encore deux jobs dontwindows-latest, alors qu'un seul job Ubuntu cross-compile aveccargo-xwin; ajouterscripts/et son test)CHANGELOG.md,CHANGELOG.fr.mdCritères d'acceptation (planification)
scripts/build-latest-json.sh(entrées : dossier d'assets, version, fichier de notes, URL de base ; sortie :latest.json) sort en erreur s'il ne trouve pas exactement un.deb, un.rpmet un-setup.exe, chacun avec son"$asset.sig"non vide.jq(--arg,--rawfilepour les notes) ; noms de fichiers encodés@uridans les URL, comme l'étape d'upload.latest.jsonportelinux-x86_64(.deb),linux-x86_64-deb,linux-x86_64-rpmetwindows-x86_64, chaque URL avec la bonne extension, chaque signature lue du.sigde son propre asset.scripts/build-latest-json.test.mjs(vitest, lance le script avecbash -e -o pipefailcommerelease.yml, sur un dossier temporaire) : cas nominal (quatre clés, extensions, signatures appariées) ;.rpmabsent → code de sortie non nul ;.sigvide → non nul ; deux.deb→ non nul ; notes contenant",\et une ligneCHANGELOG_EOF→ JSON valide et notes intactes.check-frontendinstallejq; le test passe dans la CI de la PR (journal lu).release.yml: délimiteurGITHUB_OUTPUTaléatoire pour les notes ; avant le DELETE du paquetlatestdu registre, une assertionjq(version = tag, quatre clés, signature non vide, bonne extension) qui arrête le job sinon.verify-release.shsort en 1 si une des quatre clés manque, si une URL Linux n'a pas la bonne extension, ou si lefile:du commentaire de confiance minisign (signature décodée en base64) ne correspond pas au nom de fichier de l'URL. Prouvé sur unlatest.jsonfactice (cas vert et cas rouges) dans la PR.Review caveats
jqabsent decheck-frontend→ ajouté (décision).linux-x86_64doit avoir sa raison et sa condition de retrait écrites (commentaire du script +qa-update-cycle.md) : repli pour les binaires sans marqueur de bundle ; à retirer quand aucune version antérieure au marqueur n'est plus supportée.tsconfign'inclut quesrc; le test est en.mjspour ne pas laisser croire qu'il est vérifié partsc.release.ymln'est exercée qu'au prochain tag. Ajouter à.claude/skills/release/SKILL.md: lire le journal de l'étape de génération delatest.jsonet lancerverify-release.sh(désormais bloquant) avant d'annoncer la release.Décisions prises en planification
linux-x86_64-rpmajoutée, rpm gardé (Max, 2026-10-10).jqajouté àcheck-frontend+ test vitest.mjs(Max, 2026-10-10)..rpmv0.17.1), à écrire dansqa-update-cycle.mdet le CHANGELOG.Spec source
spec-plan-release-deps.md(local, ignoré par git)maximus referenced this issue2026-08-15 15:39:23 +00:00
Archive avant réécriture par
/analyze(2026-10-10, lu surmain87920ec). Le corps est réécrit avec les décisions de Max du jour ; le texte d'origine est conservé ci-dessous.Corps d'origine
src-tauri/tauri.conf.jsonbundle trois cibles :["nsis", "deb", "rpm"].release.ymlconstruit et publie bien les trois. Mais l'entreelinux-x86_64delatest.jsonest construite uniquement a partir du.deb:latest.jsonn'a pas de notion de format de paquet : il y a une entree par cible, et Linux pointe sur le.deb.Consequence
Un utilisateur installe depuis le
.rpmqui lance une verification de mise a jour telecharge des octets.deb. Cotetauri-plugin-updater, le format d'installeur est resolu depuis le marqueur__TAURI_BUNDLE_TYPEgrave dans l'artefact : le binaire rpm resoutInstaller::Rpm, qui verifie la signature magique du payload avant de le passer au gestionnaire de paquets, et rejette les octets deb.Donc : les utilisateurs rpm recoivent un echec de mise a jour, pas une mise a jour silencieusement cassee — mais ils n'ont aucun chemin de mise a jour automatique, alors qu'on leur livre un artefact. La mise a jour automatique etant une fonctionnalite Base+, ce sont des utilisateurs payants.
Incoherence connexe
Le texte des notes de release annonce le mauvais format :
Aucun AppImage n'est construit. Le
.rpm, lui, existe et n'est pas mentionne.Pistes
.rpms'il n'a pas d'utilisateur connu — un artefact sans chemin de mise a jour est un piege.latest.jsondistinct par format, ou basculer Linux sur l'AppImage (le seul format quetauri-plugin-updatersait reellement extraire lui-meme, viainstall_appimage— c'est aussi le seul chemin qui exerceraittar, cf. #315).Releve pendant #315 / #312.