Releases et canal de préversion
Comment Canopy gère les versions, les tags et publie les images de conteneurs. Cette page est la référence pour les opérateurs qui ont besoin d'épingler des versions en production et pour les contributeurs qui créent des releases.
Versionnage
Canopy suit le Versionnage Sémantique. La source unique de vérité pour la version actuelle est le fichier /VERSION à la racine du dépôt.
- Patch (par ex.
1.0.0→1.0.1) : corrections de bogues uniquement. Toujours sûr à mettre à niveau. - Minor (par ex.
1.0.0→1.1.0) : nouvelles fonctionnalités. Rétrocompatible selon la politique de compatibilité. - Major (par ex.
1.x→2.0.0) : changements cassants. Les notes de migration sont livrées avec la release.
La version est incrémentée une fois par PR, pas par commit. L'entrée CHANGELOG du PR utilise la nouvelle version comme titre ; le workflow CI version-check.yml fait échouer tout PR qui incrémente VERSION sans avoir d'en-tête ## [<version>] correspondant dans CHANGELOG.md.
Tags d'image de conteneur
Chaque push vers main et chaque tag v*.*.* déclenche .github/workflows/docker-publish.yml, qui construit et pousse des images multi-arch (amd64 + arm64) vers GHCR.
Pour un tag de release comme v1.2.3, les tags publiés sur chaque image sont :
| Tag | Pointe vers | Stable ? |
|---|---|---|
1.2.3 | exactement cette release | oui – épinglez ce tag en production |
1.2 | dernier patch sur 1.2.x | avance sur les patches |
1 | dernière mineure sur 1.x | avance sur les mineures |
latest | dernière release non-préversion | avance à chaque release |
sha-<short> | commit exact | oui – débogage / préversion |
Pour les pushs vers main (sans tag), seuls les tags main et sha-<short> sont produits – jamais latest, jamais de tag semver.
Tous les manifestes d'images publiés sont signés avec cosign OIDC sans clé. Les détails de vérification et de SBOM se trouvent dans Chaîne d'approvisionnement.
Canal de préversion
Pour les versions mineures qui modifient la disposition des conteneurs, les images de base, les UIDs par défaut, les noms de volumes, les ports par défaut ou le schéma d'une manière nécessitant une action de l'opérateur, un release candidate est créé avant le tag final.
Conventions :
- Les tags RC sont
vX.Y.0-rc.N– jamais sur une release de patch, uniquement sur des mineures avec des changements visibles par les opérateurs. - L'action
docker/metadata-actiondu workflow de publication est configurée avecflavor: latest=auto. Cela exclut automatiquement les tags semver de préversion de:latest,:X.Yet:X– les RC sont uniquement publiés sous:X.Y.0-rc.N. Les opérateurs qui épinglent:latestne tireront pas accidentellement un RC. - La release GitHub pour un tag RC doit être marquée comme préversion sur la page des Releases. Le workflow actuel
github-release.ymlcrée toujours une release non-préversion ; le mainteneur bascule manuellement l'option de préversion après l'exécution du workflow (ou modifie la release viagh release edit vX.Y.0-rc.N --prerelease).
Temps de maturation :
- Un RC reste disponible pendant au moins 48 à 72 heures avant la promotion, ou jusqu'à ce qu'au moins un opérateur en dehors du mainteneur signale une mise à niveau réussie – selon ce qui est le plus long.
- Les rapports de bogues concernant un RC sont livrés sous
vX.Y.0-rc.N+1si le problème mérite une correction. L'ancien RC est conservé dans GHCR pour la reproductibilité.
Promotion vers la version finale :
- Le tag final
vX.Y.0est créé sur le même commit que le dernier RC. Le workflow de publication reconstruit et retague les images multi-arch ; le digest différera du RC même si la source est identique (les entrées de build incluent des horodatages). - Les tags
:X.Y,:Xet:latestpointent désormais vers la release finale.
Créer une release (liste de contrôle du mainteneur)
Pour un patch ou une mineure normale – pas besoin du canal RC :
- Sur une branche de fonctionnalité, incrémenter
VERSIONet ajouter l'en-tête## [<version>] - YYYY-MM-DDcorrespondant dansCHANGELOG.md. - Exécuter
python scripts/dump_openapi.pysi une route backend ou un schéma a changé ; commiter le résultat s'il a changé. - Ouvrir le PR. CI exécute lint, tests, vérification de dérive OpenAPI et
version-check.yml. - Squash-merger vers
main. - Depuis
main:git tag -s v<version> -m "v<version>"(ougit tag v<version>si aucune clé de signature n'est configurée),git push origin v<version>. - Le workflow
Publish GitHub Releaseextrait la section## [<version>]deCHANGELOG.mdet crée une release GitHub. - Le workflow
Publish Docker images to GHCRconstruit, signe et publie les images multi-arch. - Vérifier avec cosign :
cosign verify \--certificate-identity-regexp 'https://github.com/Rhizo-Tech/canopy/.+' \--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \ghcr.io/rhizo-tech/canopy/backend:<version>
Pour une mineure nécessitant un RC :
- Même flux PR-et-merge qu'au-dessus, mais incrémenter vers
1.Y.0-rc.1. - Après le merge, tagger
v1.Y.0-rc.1et pousser. Le workflow de publication construit et pousse les images RC (uniquement:1.Y.0-rc.1, jamais:latestni les tags courts –flavor: latest=autos'en charge). Le workflow de release crée une release GitHub ; basculer manuellement en préversion ensuite viagh release edit v1.Y.0-rc.1 --prereleaseou dans l'interface GitHub. - Attendre la fenêtre de maturation. Traiter les problèmes signalés avec
-rc.2,-rc.3au besoin. - Pour promouvoir : incrémenter
VERSIONvers1.Y.0dans un PR final (l'entrée CHANGELOG consolide tous les correctifs RC), merger, taggerv1.Y.0, pousser. Les tags:latestet les tags courts pointent maintenant vers la release promue.
Fin de vie
Seule la dernière ligne mineure reçoit des corrections de sécurité. Voir SECURITY.md pour la politique complète. Les lignes mineures plus anciennes sont en fin de vie et ne recevront pas de rétroportages – les opérateurs sur des versions plus anciennes doivent planifier des mises à niveau conformément à la politique de compatibilité.