Ce document décrit comment est géré le versionnement de console, c'est-à-dire :
- Préparer les préversions et les versions stables de
console - Créer effectivement les versions correspondantes dans GitHub
- Mettre à jour le chart Helm
dso-console - Publier les nouvelles versions de modules NPM concernés
Afin d'éviter une confusion entre les correctifs d'urgence ("hotfixes") — historiquement des versions PATCH rétroportées sur main — et les versions régulières produites par des commits fix:, les versions stables adoptent le protocole suivant :
- Les versions régulières sur
releasessont par défaut desMINOR(et très rarement desMAJOR). - Une préversion utilise la prochaine version stable visée, suffixée par
-rc, puis-rc.Npour les candidates suivantes. Par exemple:- Si la dernière version publiée est la
9.24.5, la préversion (RC) suivante sera la9.25.0-rc - Si la dernière version publiée est la
9.32.0-rc2, la préversion suivante sera la9.32.0-rc3
- Si la dernière version publiée est la
- Les correctifs d'urgence sont forcément des versions
PATCH, créées depuis une branchehotfix/<slug>issue du tag stable à corriger ; voir la section Correctifs d'urgence.
La structure de versionnement stable de console est donc :
- Versions "stables" :
MAJOR.MINOR.0 - Préversions (ou "release candidates") :
MAJOR.MINOR.0-rc ouMAJOR.MINOR.0-rc.INCREMENT - Correctifs d'urgenc (ou "hotfixes") : **
MAJOR.MINOR.HOTFIX, oùHOTFIXest un nombre strictement supérieur à1
Les sections suivantes vont expliciter ce schéma:
flowchart LR
M0["main: version stable N"] --> M1["main: nouvelles MRs fusionnées; build et déploiement latest"]
M0 --> R0["releases créée depuis le périmètre retenu sur main"]
M1 -. "correctif retenu : cherry-pick" .-> R1["releases: commits de qualification"]
R0 --> RP["Release Please cible releases"]
R1 --> RP
RP --> RC["Fusion de la PR RC sur releases; tag et build"]
RC --> ST["PR stable sur releases; fusion, tag et build"]
ST --> BACK["Après la stable : reporter les commits de version nécessaires sur main"]
BACK --> NEXT["Recréer releases depuis main pour le cycle suivant"]
Le flux Build and deploy latest from main est déclenché à chaque push sur main. Il construit la version d'intégration et déploie latest; il ne déclenche pas Release Please.
Le flux Handle next prerelease or release est déclenché à chaque push sur releases. Il appelle le job réutilisable Next Prerelease and Release, avec releases comme branche cible pour les PR RC et stable. Les tags RC et stables déclenchent les builds d'artefacts et la mise à jour du chart. Le job de déploiement latest reste réservé aux événements de main.
Le flux Handle next hotfix est déclenché à chaque nouveau commit sur une branche hotfix/*. Il utilise le job réutilisable Next Hotfix.
Trois configurations isolent les états de version :
.github/prerelease-please-config.jsonet son manifeste gèrent les préversions (ou "Release Candidates", usuellement dénotées "RC") surreleases;.github/release-please-config.jsonet son manifeste gèrent les versions stables surreleases. La version stable met aussi à jour le manifeste de préversion afin de réinitialiser le cycle suivant depuis cette version (si on était à la-rc14, on réinitialise à-rcpour la prochaine version) ;.github/hotfix-release-please-config.jsonet le manifeste de version stable gèrent les correctifs d'urgence. Cette configuration n'écrit jamais dans le manifeste de préversion.
À chaque push sur releases, le job prepare finalise d'abord toute PR de version déjà fusionnée, puis crée ou met à jour la prochaine PR Release Please. Le cycle manuel est le suivant :
- Au début d'une qualification, créer
releasesdepuis le commit demainqui définit le périmètre de la version et pousser cette branche. Pour la bascule du cycle existant, fermer sans la fusionner l'ancienne PR Release Please qui ciblemain, puis créerreleasesdepuis l'état demaincontenant la dernière RC publiée. Release Please crée alors la PR de version surreleases. - Fusionner les MRs fonctionnelles sur
maincomme d'habitude. Elles continuent à alimenter le build et le déploiementlatest, sans créer de RC. - Pour inclure une correction dans la version en qualification, cherry-picker son commit de
mainsurreleases. Release Please crée ou met à jour la PR RC ciblantreleases. - Fusionner la PR RC sur
releasespour créer le tagvX.Y.Z-rcouvX.Y.Z-rc.N, la Release GitHub « Pre-release » et les builds d'artefacts correspondants. Le flux existant déclenche également la mise à jour du chart Helm. - Après une RC, Release Please crée ou met à jour la PR de version stable
vX.Y.Z, toujours ciblantreleases. La fusion de cette PR crée le tag et la Release GitHub stables, les builds d'artefacts et les tags partielsvXetvX.Y. - Après la stable, reporter sur
mainuniquement les commits de version/release nécessaires qui ne s'y trouvent pas déjà. Ne pas fusionner l'ensemble dereleases, qui contient des cherry-picks de commits déjà présents surmain. Supprimer ensuitereleaseset la recréer depuismainau début de la qualification suivante.
Les commits qui ne sont pas cherry-pickés sur releases restent hors du périmètre de la version en qualification. Le cycle de Release Please régulier ne démarre pas depuis main.
release-please gère les incréments de version, les requêtes de fusion de release, les tags immuables et les GitHub Releases. Il ne génère pas de fichier CHANGELOG.md.
L’historique généré avant cette bascule est conservé, sans modification, dans CHANGELOGS/CHANGELOG_ARCHIVE.md. Les notes destinées aux utilisateurs sont préparées manuellement avec le skill cpn-release-notes : il produit CHANGELOGS/<version>.md et son audit non publiable CHANGELOGS/<version>.anomalies.md.
La procédure collecte la version stable cible, le tag candidat, le milestone exact et la MR Helm. Elle réconcilie ces preuves, présente une prévisualisation et n’écrit les fichiers qu’après validation humaine. L’absence de tag, de milestone ou de MR Helm bloque la préparation. Cette bascule n’ajoute ni contrôle CI ni automatisation par agent.
Lorsqu'une préversion ou une version stable est créée, les images de conteneur des applications (client, server, etc.) sont publiées dans la registry GitHub du dépôt avec le tag complet correspondant. Une version stable met aussi à jour les tags partiels vX et vX.Y ;
Les tags complets (
vX.Y.Z,vX.Y.Z-rcetvX.Y.Z-rc.N) sont immutables. Seuls les tags partiels stables (vXetvX.Y) sont recréés pour référencer la dernière version stable. Après une version stable, il est recommandé d'exécutergit pull --tags --forceafin de recréer localement ces tags partiels.
Le déploiement de console se fait préférablement à l'aide de son chart Helm, nommé dso-console.
Lorsqu'une RC, une version stable ou un correctif d'urgence est créé, le flux de travail déclenche automatiquement une requête de fusion dans le dépôt helm-charts afin de mettre à jour le chart Helm dso-console avec l'APP_VERSION complète correspondante. Une fusion manuelle sur ce dépôt reste nécessaire pour publier la nouvelle version du chart. Exemple de requête de fusion : cloud-pi-native/helm-charts#204.
Une RC, une version stable et un correctif d'urgence produisent le même type de requête de fusion côté
helm-charts. Le chart référence cependant l'APP_VERSIONcomplète : une RC conserve donc son suffixe-rcou-rc.N.
La publication des nouvelles versions de modules npm du dépôt est automatique et est inclus dans le flux de travail de création d'une nouvelle version. Il analyse les numéros de version présents dans les différents fichiers package.json pour déterminer si une nouvelle version du module doit être créée et publiée.
Il est possible de créer une version de préversion d'un module npm en modifiant la clé
publishConfig.tagdans lepackage.jsonavec par exemplebetapour générer une version beta.
Un correctif d'urgence est réservé, comme son nom l'indique, à la correction urgente d'une version stable déjà livrée. La correction "en avant" ("fix forward") sur main reste cependant la solution privilégiée lorsque le délai le permet.
Schéma récapitulatif :
gitGraph
commit id: "Bump v1.2.0" tag: "v1.2.0"
%% Initial state: latest tag on main = v1.2.5
branch "v1.2.0 (tag)"
commit id: "Bump v1.2.0" tag: "v1.2.0"
checkout main
commit id: "some"
commit id: "other"
commit id: "unrelated"
commit id: "commits"
%% Some commits are added to new hotfix branch
checkout "v1.2.0 (tag)"
branch hotfix/my-urgent-fix
commit id: "URGENT fix"
%% Job create-or-update-release triggers release-please
%% which will upsert the next release MR, which will be a prerelease
branch release-please-hotfix
commit id: "Bump v1.2.1"
%% Upon merging the release-please MR
%% The new tag is created
checkout hotfix/my-urgent-fix
merge release-please-hotfix tag: "v1.2.1"
%% IF new commits are added BEFORE merging the release-please MR,
%% a new prerelease MR will replace the stable release MR
checkout main
cherry-pick id: "URGENT fix"
branch release-please-main
commit id: "Bump v1.3.0-rc1"
%% Upon merging the release-please MR
%% The new tag is created
checkout main
merge release-please-main tag: "v1.3.0-rc1"
%% and the release-please MR for the next stable release is created
checkout release-please-main
merge main
commit id: "Bump v1.3.0"
%% IF the stable release MR is merged into main
checkout main
merge release-please-main tag: "v1.3.0"
%% New commits are then pushed to main
%% and the cycle starts anew
commit id: "another"
commit id: "new"
commit id: "feature"
%% Job create-or-update-release triggers release-please
%% which will upsert the next release MR, which will be a prerelease
checkout release-please-main
merge main
commit id: "Bump v1.3.1-rc"
- La branche de correctif part toujours d'un tag de version stable effectivement déployé quelque part, jamais de
mainni d'une RC. - Un seul correctif est traité à la fois pour une même version stable.
- La branche suit le format
correctif/<slug>; le motif de déclenchement actuel ne couvre pas les éventuelles sous-branches (hotfix/sub/fix). - La branche de correctif et sa MR
release-pleasene doivent JAMAIS être fusionnées dansmain. Seuls les commits applicatifs sont ensuite picorés ("cherry-picking") dansmain.
Exemple : corriger la version de production v9.24.5.
-
Vérifier le tag cible et créer la branche :
git fetch origin --tags git switch --detach v9.24.5 git switch -c hotfix/urgent-<description>
-
Implémenter et valider le correctif, puis pousser la branche.
-
Vérifier que le workflow
Handle next hotfixcrée une MRrelease-pleaseciblanthotfix/urgent-<description>et proposant exactementv9.24.6. En cas de version, branche cible ou tag proposé inattendus, ne pas fusionner la MR. -
Fusionner la MR
release-pleaseaprès validation. Cela crée le tag et la GitHub Releasev9.24.6, publie les images OCI taguéesv9.24.6et déclenche la demande de mise à jour du chartdso-consoleavecappVersion: 9.24.6. -
Déployer le chart mis à jour, puis vérifier que la version déployée est bien
9.24.6. -
Créer une MR vers
mainen picorant ("cherry-picking") exclusivement le ou les commits applicatif du correctif d'urgence. Exclure les commits automatiquesrelease-please, les manifestes et les fichiers de version. Le correctif intègre alors normalement le cycle préversion/version stable en cours surmain.
Une préversion en cours sur
mainreste indépendante d'un correctif d'urgence. Par exemple, un correctif d'urgence9.24.6ne modifie ni la cible ni le compteur des RC9.25.0-rc.*.