Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
82b0530
feat(ci): allow hotfixes with release-please
StephaneTrebel Jan 27, 2026
eaaca76
chore(ci): rename cd workflow to create-or-update-release
StephaneTrebel Jan 27, 2026
f80b3b1
chore(ci): move release-please job file to dedicated jobs directory
StephaneTrebel Jan 27, 2026
ffe1a5f
chore(ci): rename ci to explicit continuous-integration workflow
StephaneTrebel Jan 27, 2026
783831b
chore(ci): rename preview to explicit create-preview-release.yml work…
StephaneTrebel Jan 27, 2026
5b846be
chore(ci): move all jobs (not workflows) to dedicated directory
StephaneTrebel Jan 27, 2026
4d8c6cf
chore(doc): update main README to fix/update how releases are performed
StephaneTrebel Jan 27, 2026
8b58f7f
chore(server-nestjs): add application to the version-bumpable ones
StephaneTrebel Jan 27, 2026
416b0d1
feat(ci): change release-please config and job to allow for hotfixes
StephaneTrebel Jan 27, 2026
454fc6f
chore(ci): rename workflows
StephaneTrebel Jan 27, 2026
baa7196
feat(release-please): allow chore, docs, and other commit types to tr…
StephaneTrebel Jan 27, 2026
550a265
chore(ci): rename create-preview-comment to better explicit its purpose
StephaneTrebel Jan 27, 2026
1624142
chore(ci): avoid checking out the repository for create-preview-comment
StephaneTrebel Jan 27, 2026
84a4739
docs(README): split release section into its own RELEASE.md file
StephaneTrebel Jan 27, 2026
11d01bc
docs(RELEASE): document hotfixes creation workflow
StephaneTrebel Jan 29, 2026
b157e94
docs(RELEASE): add mermaidjs schema
StephaneTrebel Jan 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,20 @@ jobs:
- name: Checks-out repository
uses: actions/checkout@v4

- name: Pre release new version
- name: Update release-please config for hotfix branches
if: startsWith(github.ref_name, 'hotfix/')
run: |
# Update versioning to always-bump-patch for hotfix branches
jq '.versioning = "always-bump-patch"' release-please-config.json > tmp.json && mv tmp.json release-please-config.json
echo "Updated release-please-config.json versioning to always-bump-patch"
shell: bash

- name: Create merge request for new release
uses: googleapis/release-please-action@v4
id: release
with:
target-branch: main
config-file: release-please-config.json
target-branch: ${{ github.ref_name }}
token: ${{ secrets.GITHUB_TOKEN }}

- name: Edit packages versions
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: CI
name: Continuous Integration

on:
pull_request:
Expand Down Expand Up @@ -63,7 +63,7 @@ jobs:
run: echo "Exposing env vars"

npm-check:
uses: ./.github/workflows/npm.yml
uses: ./.github/workflows/job-npm.yml
if: ${{ github.base_ref == 'main' && needs.path-filter.outputs.packages == 'true' }}
needs:
- path-filter
Expand All @@ -78,14 +78,14 @@ jobs:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

lint:
uses: ./.github/workflows/lint.yml
uses: ./.github/workflows/job-lint.yml
needs:
- expose-vars
with:
NODE_VERSION: ${{ needs.expose-vars.outputs.NODE_VERSION }}

unit-tests:
uses: ./.github/workflows/tests-unit.yml
uses: ./.github/workflows/job-tests-unit.yml
if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' }}
needs:
- path-filter
Expand All @@ -98,7 +98,7 @@ jobs:
SONAR_PROJECT_KEY: "${{ secrets.SONAR_PROJECT_KEY }}"

component-tests:
uses: ./.github/workflows/tests-component.yml
uses: ./.github/workflows/job-tests-component.yml
if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' }}
needs:
- path-filter
Expand All @@ -108,7 +108,7 @@ jobs:
BROWSERS: "${{ github.base_ref == 'main' && 'chrome,firefox' || 'firefox' }}"

build:
uses: ./.github/workflows/build.yml
uses: ./.github/workflows/job-build.yml
needs:
- expose-vars
with:
Expand All @@ -123,15 +123,15 @@ jobs:
ARGOCD_TOKEN: ${{ secrets.ARGOCD_TOKEN }}

build-label:
uses: ./.github/workflows/label.yml
uses: ./.github/workflows/job-label.yml
needs:
- expose-vars
- build
with:
CONF_PATH: ./.github/labeler/build.yml

playwright-tests:
uses: ./.github/workflows/playwright.yml
uses: ./.github/workflows/job-playwright.yml
if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' || needs.path-filter.outputs.e2e == 'true' }}
needs:
- path-filter
Expand All @@ -142,7 +142,7 @@ jobs:
TAG: pr-${{ github.event.pull_request.number || github.event.number }}

cypress-tests:
uses: ./.github/workflows/tests-e2e.yml
uses: ./.github/workflows/job-tests-e2e.yml
if: ${{ needs.path-filter.outputs.apps == 'true' || needs.path-filter.outputs.packages == 'true' || needs.path-filter.outputs.ci == 'true' || needs.path-filter.outputs.e2e == 'true' }}
needs:
- playwright-tests
Expand All @@ -155,7 +155,7 @@ jobs:
BROWSERS: "${{ github.base_ref == 'main' && 'chrome,firefox' || 'firefox' }}"

deploy-tests:
uses: ./.github/workflows/tests-deploy.yml
uses: ./.github/workflows/job-tests-deploy.yml
if: ${{ (needs.path-filter.outputs.apps != 'true' && needs.path-filter.outputs.packages != 'true' && needs.path-filter.outputs.ci != 'true') || (!github.event.pull_request.draft && github.base_ref == 'main') }}
needs:
- path-filter
Expand All @@ -165,7 +165,7 @@ jobs:
TAG: pr-${{ github.event.pull_request.number || github.event.number }}

scan-vuln:
uses: ./.github/workflows/scan.yml
uses: ./.github/workflows/job-scan.yml
needs:
- expose-vars
- build
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
name: CD
name: Create/update next release

on:
push:
branches:
- main
- hotfix/*

env:
REGISTRY: ghcr.io
Expand All @@ -28,10 +29,10 @@ jobs:
run: echo "Exposing env vars"

release:
uses: ./.github/workflows/release.yml
uses: ./.github/workflows/job-release-please.yml

build-amd64:
uses: ./.github/workflows/build.yml
uses: ./.github/workflows/job-build.yml
if: ${{ needs.release.outputs.release-created == 'true' }}
needs:
- expose-vars
Expand All @@ -48,7 +49,7 @@ jobs:
USE_QEMU: ${{ needs.expose-vars.outputs.USE_QEMU == 'true' }}

build-arm64:
uses: ./.github/workflows/build.yml
uses: ./.github/workflows/job-build.yml
if: ${{ needs.release.outputs.release-created == 'true' }}
needs:
- expose-vars
Expand All @@ -65,7 +66,7 @@ jobs:
USE_QEMU: ${{ needs.expose-vars.outputs.USE_QEMU == 'true' }}

npm-publish:
uses: ./.github/workflows/npm.yml
uses: ./.github/workflows/job-npm.yml
if: ${{ needs.release.outputs.release-created == 'true' }}
needs:
- expose-vars
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Preview comment
name: Add preview comment

on:
pull_request:
Expand All @@ -13,9 +13,6 @@ jobs:
if: contains(github.event.pull_request.labels.*.name, 'preview')
runs-on: ubuntu-latest
steps:
- name: Checks-out repository
uses: actions/checkout@v4

- name: Generate app url
id: generate-url
run: |
Expand Down
23 changes: 6 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -399,36 +399,25 @@ La gestion des dépendances est effectuée à l'aide de [pnpm](https://pnpm.io/)
└── README.md
```

# Workflow Git
# Organisation avec Git

Une PR doit être faite à partir de la branche `main` à jour (utiliser `rebase` si besoin) avant la demande de fusion (PR). Les PR sont mergées dans `main`.
Une requête de fusion ("merge request") doit être faite avec la branche `main` comme destination.

La branche de base **doit** être à jour avec `origin/main` (utiliser `git pull origin/main && git rebase origin/main` ou l'option de rebasage dans l'interface Web si besoin) avant la demande de fusion (MR).

## Conventions de nommage

Cf. [Conventions - MIOM Fabrique Numérique](https://docs.fabrique-numerique.fr/conventions/nommage.html).

Les commits doivent suivre la spécification des [Commits Conventionnels](https://www.conventionalcommits.org/en/v1.0.0/). Cette norme est utilisée pour construire la release, voir ci-après.
Les commits doivent suivre la spécification des [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/). Cette norme est utilisée pour construire la nouvelle version, voir ci-après.

Il est possible d'ajouter l'[extension VSCode](https://github.com/vivaxy/vscode-conventional-commits) pour faciliter la création des commits.

> Les messages de commits sont rédigés en anglais.

## Gestion des versions

Le dépôt utilise [Release Please](https://github.com/googleapis/release-please-action) pour automatiquement générer les tags Git ainsi que les releases GitHub. À chaque fois que du code est poussé dans la branche `main`, une pull request est créée en analysant les messages de commits pour déterminer le numéro de version à créer.

À chaque fois qu'une pull request de release est fusionnée, les images de conteneur du serveur et du client sont créées et hébergées dans la [registry Github associée au dépôt](https://github.com/orgs/cloud-pi-native/packages?repo_name=console).

### Versioning du chart dso-console

Les images de conteneurs peuvent être déployées via le Helm Chart [dso-console](https://github.com/cloud-pi-native/helm-charts/tree/main/charts/dso-console).
La dernière étape du pipeline de release automatise la création d'une version Helm pour la mise à jour de la version des images. Exemple : https://github.com/cloud-pi-native/helm-charts/pull/204.

### Versioning des modules

Pour publier les versions des modules npm du dépôt un [pipeline](https://github.com/cloud-pi-native/console/actions/workflows/npm.yml) est disponible dans les GitHub Actions, il analysera 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é-release d'un module npm en modifiant la clé `publishConfig.tag` dans le `package.json` avec par exemple `beta` pour générer une version beta.
Se référer à [./RELEASE.md](./RELEASE.md).

## Gestion des dépendances

Expand Down
94 changes: 94 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Gestion des versions

Ce document décrit comment est géré le versionnement de `console`, c'est-à-dire les différents aspects qui nous permettent de :

- Préparer la création d'une nouvelle version de `console` au fur et à mesure des ajouts
- Créer effectivement la nouvelle version
- Mettre à jour le chart Helm concerné
- Publier les nouvelles versions de modules NPM concernés

## Schéma récapitulatif

Les sections suivantes vont expliciter ce schéma:

```mermaid
gitGraph
commit id: "…previous commits"
commit id: "Add basic features"

branch release-please-main
checkout release-please-main
commit id:"bump to v1.2.0" tag: "v1.2.0"

checkout main
merge release-please-main
checkout release-please-main
branch "hotfix/v1.2.0"
commit id: "Fix stuff"
branch release-please-hotfix_v1.2.3
commit id:"bump to v1.2.1" tag: "v1.2.1"
checkout "hotfix/v1.2.0"
merge release-please-hotfix_v1.2.3

checkout main
commit id: "Add features"
checkout release-please-main
commit id:"bump to v1.3.0" tag: "v1.3.0"
merge main
commit id:"bump to v1.3.0" tag: "v1.3.0"
checkout main
commit id: "More features"
checkout release-please-main
merge main
commit id:"bump to v1.3.0 (recreated)" tag: "v1.3.0 (recreated)"
checkout main
merge release-please-main

checkout main
merge "hotfix/v1.2.0"
checkout release-please-main
commit id:"bump to v1.4.0" tag: "v1.4.0"
merge main
commit id:"bump to v1.4.0" tag: "v1.4.0"
checkout main
merge release-please-main
```

## Versionnement de Console

Le flux de travail qui créé les nouvelles versions s'intitule `create-or-update-release` et est déclenché à chaque nouveau commit sur `main` (soit lorsqu'on fusionne une requête de fusion, soit un commit poussé en outrepassant l'interdiction de pousser sur `main`).

Le flux de travail utilise [release-please-action](https://github.com/googleapis/release-please-action) pour automatiquement générer les tags Git ainsi que les nouvelles versions sur GitHub. À chaque fois que du code est poussé dans la branche `main`, une requête de fusion de version est créée en analysant les messages de commits pour déterminer le numéro de version à créer (patch/mineur/majeur). Si une requête de fusion de nouvelle version existe déjà, elle est mise à jour afin de refléter les nouveaux changements ajoutés à la future nouvelle version.

Les types de commits qui déclenchent une nouvelle version (ou mettent à jour la MR de la prochaine version) sont décrit dans la configuration de release-please, [`./release-please-config.json`](./release-please-config.json)

À chaque fois qu'une requête de fusion de version est fusionnée, les images de conteneur des applications (`client`, `server`, etc.) sont alors créées et hébergées dans la [registry Github associée au dépôt](https://github.com/orgs/cloud-pi-native/packages?repo_name=console).

## Versionnement du chart Helm `dso-console`

Le déploiement de `console` se fait préférablement à l'aide de son chart Helm, nommé [`dso-console`](https://github.com/cloud-pi-native/helm-charts/tree/main/charts/dso-console).

La dernière étape du flux de travail de création de nouvelles versions (cf. section ci-dessus) est la création automatique d'une requête de fusion dans le dépôt `helm-charts` pour la mise à jour du chart Helm `dso-console`. Une fusion manuelle sur ce dépôt est alors nécessaire pour déclencher la publication de la nouvelle version du chart Helm (embarquant donc la nouvelle version de `console`). Exemple d'une telle requête de fusion de nouvelle version du chart Helm : https://github.com/cloud-pi-native/helm-charts/pull/204.

## Versionnement des modules NPM

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é-release d'un module npm en modifiant la clé `publishConfig.tag` dans le `package.json` avec par exemple `beta` pour générer une version beta.

## Hotfixes

Autant que faire se peut il vaut mieux privilégier le "Fix Forward" avec de nouvelles releases.
Copy link
Contributor

@shikanime shikanime Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai pas compris ce que tu veux dire :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Faire des hotfix doit être la dernière solution envisagée. C'est trop prescriptif, selon toi ?

Copy link
Contributor

@shikanime shikanime Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Principalement la tournure de phrase que j'ai pas compris.

Apres, les hotfixes devraient etre une partie integrante d'un release. D'ou le branching systematique des releases LTS defini dans l'ADR.

Dans le cas actuellement on aura juste une branche release n-1 pour maintenir la prod. Avec de l'outillage pour backport automatiquement de LTS vers main ou inversement.

Copy link
Contributor

@shikanime shikanime Jan 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typiquement les etapes sont:

  • campagne de 0 CI fail sur main
  • creation d'une branch release-1.0
  • tag version v1.0.0-rc.1 -> staging
  • tag version v1.0.0 -> production
  • pr hotfix sur release-1.0
  • ouverture d'une pr backport main si besoin
  • tag version v1.0.1 ou v1.0.1-rc.1 si non critique -> production


Ceci étant dit, il arrivera, hélas, qu'un hotfix soit nécessaire sur une version livrée.

Voici donc le processus compatible avec l'utilisation de `release-please`:

- Se placer localement sur le tag de la version concernée: `$ git checkout v1.2.3` (`v1.2.3` est ici la version à hotfixer)
- En tirer une branche dédiée au hotfix: `$ git checkout -b hotfix/my-urgent-hotfix-for-v1.2.3` (Note: Il n'est pas nécessaire de spécifier la version dans le nom de la branche, mais ça peut aider à la lecture et ainsi confirmer la version concernée)
- Faire les modifications nécessaires, committer, etc.
- Pousser la nouvelle branche sur le dépôt Github
- Une fois la nouvelle branche poussée, `release-please` va être déclenché par le flux de travail Github `create-or-update-release` afin de créer une requête de fusion pour la nouvelle version hotfixée (avec comme cible la branche de hotfix). Il est d'ailleurs à noter que dans le cas d'un hotfix **on ne fait qu'une montée du "patch"** quelque soit les commits (donc même un `feat!` ne fera pas de montée majeure)
- Valider la MR de version hotfixée (créée donc par `release-please`) à l'aide du flux de travail Github `Continuous Integration`
- Une fois la MR de version hotfixée validée et fusionnée, la nouvelle version est créée et, comme pour les versions traditionnelles, une requête de fusion est crée dans le dépôt `helm-charts` pour avoir là aussi une version hotfixée (mais, pour le chart Helm, c'est considéré comme une version classique)
- Il faudra ensuite faire des picorages (`git cherry-pick`) ou une MR de la branche de hotfix vers `main` afin d'intégrer le ou les commits de hotfix dans la prochaine version officielle
4 changes: 4 additions & 0 deletions ci/matrix-npm.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
"name": "@cpn-console/server",
"path": "./apps/server"
},
{
"name": "@cpn-console/server-nestjs",
"path": "./apps/server-nestjs"
},
{
"name": "@cpn-console/client",
"path": "./apps/client"
Expand Down
15 changes: 15 additions & 0 deletions release-please-config.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"versioning": "default",
"pull-request-title-pattern": "chore${scope}: Release${component} v${version}",
"release-type": "node",
"changelog-type": "default",
"changelog-sections": [
{ "type": "feat", "hidden": false, "section": "Features" },
{ "type": "feature", "hidden": false, "section": "Features" },
{ "type": "fix", "hidden": false, "section": "Bug Fixes" },
{ "type": "chore", "hidden": false, "section": "Miscellaneous Chores" },
{ "type": "build", "hidden": false, "section": "Miscellaneous Chores" },
{ "type": "docs", "hidden": false, "section": "Docs" },
{ "type": "refactor", "hidden": false, "section": "Refactoring" },
{ "type": "revert", "hidden": false, "section": "Reverted commits" }
],
"packages": {
".": {
"package-name": "console",
Expand Down
Loading