Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ADR-142 — Versionnage lockstep des paquets livrables Air (une seule version de release)

Statut : Accepté (2026-07-30, décision BDFL). RFC de mécanisme (ADR-015). Complète ADR-012 (qui traite la stabilité ABI de la plateforme, pas le numéro des .deb livrables) et ADR-095 (packaging).

Catégorie : politique de version + mécanisme (couche packaging / xtask).

Contexte

Les paquets Debian livrables d’Air (air-account, air-keystore, air-sshd, futurs air-ssh/air-agent) portent chacun un numéro de version. En l’absence de règle, ces numéros ont dérivé : air-sshd était passé à 0.6.0 (bumps successifs par des sessions déléguées) pendant que le reste du workspace restait 0.1.0, et xtask/packaging.rs codait la version en dur — d’où un risque de désynchronisation crate ↔ .deb (leçon #515). [ADR-012] fixe le versionnage de la plateforme (ABI air-stable, majeur tous les 5–10 ans), mais rien ne régissait le numéro des paquets livrables.

Directive BDFL (2026-07-30). « Vu qu’on livre de vraies versions de packages, il me faut une vraie gestion cohérente des numéros de version. » → décision : lockstep, prochaine release 0.7.0.

Décision

1. Lockstep : une seule version de release Air, partagée par tous les livrables

Tous les crates du workspace suivent version.workspace ([workspace.package] version du Cargo.toml racine) — aucun override par crate. Les paquets Debian livrables portent la même version. Un seul numéro à bumper par release. 0.7.0 est la première release lockstep (≥ 0.6.0 déjà déployé ⇒ pas de régression de version).

2. Anti-dérive : la version du .deb est dérivée, jamais codée en dur

xtask::packaging::AIR_RELEASE_VERSION = env!("CARGO_PKG_VERSION")xtask étant un membre du workspace en version.workspace, cette constante est la version de release. Toutes les entrées de PACKAGES l’utilisent (version: AIR_RELEASE_VERSION). Il devient impossible que le .deb diverge de la version des crates (la cause de #515 est structurellement éliminée).

3. Bump : la version + les bornes de dépendances internes

Une release édite [workspace.package] version (racine) — qui pilote tous les package versions (via version.workspace) et tous les .deb (via AIR_RELEASE_VERSION). Réserve actuelle : les dépendances inter-crates déclarées { path = "…", version = "X" } (≈300 occurrences) portent une borne qui doit rester satisfiable ⇒ elles se mettent à jour au même numéro. Tant que cette borne est présente, un bump touche deux familles d’éléments (la version workspace + ces bornes) — appliquées atomiquement (un sed de release, ou un futur cargo xtask bump — cf. §Suite). Le vrai « un seul endroit » s’obtient en rendant ces dépendances path-only (sans borne de version), refactor différé (§Suite). Sémantique major.minor.patch ([ADR-012]) : mineur = ajouts sans casse (cas courant Air), patch = correctifs, majeur = rupture (rare, décision BDFL).

Alternatives rejetées

  • Semver indépendant par paquet : plus granulaire mais exige un suivi par-paquet et rouvre la porte à la dérive ; Air est une plateforme intégrée livrée d’un bloc — le lockstep est plus simple et cohérent. Rejeté (BDFL).
  • Version codée en dur dans packaging.rs : c’est la cause de #515. Rejeté — dérivée de CARGO_PKG_VERSION.
  • Depends: versionné (air-account (>= 0.7.0)) : en lockstep les livrables partagent la version et sont déployés ensemble ; borne non nécessaire aujourd’hui. Raffinement possible si l’on veut interdire au niveau dpkg de mêler deux releases — différé.

Conséquences

Positives. Numéros cohérents par construction ; zéro dérive crate ↔ .deb ; un seul point de bump ; fin de l’incohérence air-sshd 0.6.0 vs reste 0.1.0.

Coûts. Un crate qui n’a rien changé « bumpe » quand même à chaque release (assumé : Air est livré d’un bloc). Le passage 0.1.0 → 0.7.0 de plusieurs crates est un saut cosmétique (aligne sur le plus haut déployé) — sans incidence ABI (couches non figées, [ADR-012] air-internal).

Suite

  • Release 0.7.0 : reconstruire les .deb (2 arches) et déployer air-account/air-keystore/ air-sshd 0.7.0 sur carbon/speedy/raspi (ordre des dépendances).
  • Raffinements différés (non bloquants) pour tendre vers le « un seul endroit » : (a) un cargo xtask bump <version> qui édite atomiquement [workspace.package] version et les bornes de dépendances internes ; (b) mieux — rendre les dépendances internes path-only (sans borne de version) pour que seul [workspace.package] version reste à toucher ; (c) un check xtask refusant tout override version = "…" de package par crate (garde-fou du lockstep).
  • Enregistrement : SUMMARY.md, registre-adrs-fr.md.