FEAT: Version automatique des builds agents + publication des artefacts (image agent + binaires) #95

Closed
opened 2026-08-12 10:33:05 +02:00 by nonobis · 1 comment
Owner

Contexte

Chaque build doit produire un numéro de version automatique pour les agents, affiché dans l'UI. Aujourd'hui la version de l'agent est codée en dur (AgentOptions.Version = "1.0.0" dans appsettings.json), le workflow release ne publie que l'image du Web, et l'image eltruncho/heimdall-agent référencée par docker-compose.prod.yml n'est jamais construite par le pipeline.

Référence — étude Pangolin (fosrl/pangolin, 12/08/2026)

  • CI déclenché par tag (cicd.yml, on: push: tags), version = TAG=${GITHUB_REF#refs/tags/}.
  • Version injectée au build : sed -i "s/export const APP_VERSION = \".*\";/export const APP_VERSION = \"$TAG\";/" server/lib/consts.ts + --build-arg VERSION=$(tag) pour les images + -ldflags pour les binaires Go (install/main.go : pangolinVersion/gerbilVersion/badgerVersion).
  • Images Docker taguées par version (pas :latest seul), binaires release par plateforme/arch, digests sha256 exposés via API.

État actuel Heimdall (constats code)

  • src/Heimdall.Agent/appsettings.json : "Version": "1.0.0" ; AgentOptions.Version défaut "1.0.0".
  • La version est déjà envoyée au register (RegisterRequest.Version, AgentRegistrationService.cs:103) et affichée dans AgentDetail.razor (lignes 54-55) — mais toujours 1.0.0.
  • .forgejo/workflows/release.yml : docker-images: eltruncho/heimdall docker/Dockerfile — pas d'image agent.

À faire

  1. Injecter la version au build (remplacer le hardcode) :
    • Heimdall.Agent.csproj : <Version>$(BuildVersion)</Version> + InformationalVersion, avec défaut local 1.0.0-dev ;
    • l'agent lit sa version via Assembly.GetExecutingAssembly() (InformationalVersion) au démarrage → AgentOptions.Version devient readonly calculée, plus jamais 1.0.0 codé ;
    • Dockerfile agent : ARG VERSION + ENV/MSBuild property pour injecter le tag.
  2. CI/CD (template nonobis/templates ci-release, release.yml) :
    • publier l'image eltruncho/heimdall-agent (Dockerfile agent) taguée vX.Y.Z ET latest ;
    • publier les binaires natifs en Release Forgejo (assets) : heimdall-agent-linux-amd64, -linux-arm64, -win-x64 (dotnet publish single-file self-contained), avec sha256 dans les notes/API ;
    • le tag v* reste le déclencheur unique.
  3. UI : afficher la version réelle de l'agent (déjà fait via AgentDetail) + version du Central quelque part (footer ou page Settings) — « chaque build donne un numéro visible ».
  4. Vérifier que le compose prod continue de référencer l'image désormais publiée.

Critères d'acceptation

  • Un tag v1.2.3 produit : image web, image agent, binaires Linux/Windows avec digests.
  • Un agent déployé depuis ce build reporte 1.2.3 dans l'UI (pas 1.0.0).
  • docker pull eltruncho/heimdall-agent:v1.2.3 fonctionne.

Fichiers concernés

  • src/Heimdall.Agent/Heimdall.Agent.csproj, appsettings.json, AgentOptions.cs, Program.cs
  • .forgejo/workflows/release.yml
  • docker/Dockerfile.agent (ou docker/Dockerfile si multi-stage)
  • docker/docker-compose.prod.yml
  • src/Heimdall.Web/Components/Pages/AgentDetail.razor


Maquette

Maquette

Description

Affichage de la version de l'agent (central + agent) : badge version dans l'en-tête de la fiche agent, ligne Version dans les métadonnées (avec date de build), et footer


Maquette

Maquette

## Contexte Chaque build doit produire un numéro de version automatique pour les agents, affiché dans l'UI. Aujourd'hui la version de l'agent est **codée en dur** (`AgentOptions.Version = "1.0.0"` dans `appsettings.json`), le workflow release ne publie **que** l'image du Web, et l'image `eltruncho/heimdall-agent` référencée par `docker-compose.prod.yml` n'est **jamais construite** par le pipeline. ## Référence — étude Pangolin (fosrl/pangolin, 12/08/2026) - CI déclenché par tag (`cicd.yml`, `on: push: tags`), version = `TAG=${GITHUB_REF#refs/tags/}`. - Version injectée **au build** : `sed -i "s/export const APP_VERSION = \".*\";/export const APP_VERSION = \"$TAG\";/" server/lib/consts.ts` + `--build-arg VERSION=$(tag)` pour les images + `-ldflags` pour les binaires Go (`install/main.go` : `pangolinVersion`/`gerbilVersion`/`badgerVersion`). - Images Docker taguées par version (pas `:latest` seul), binaires release par plateforme/arch, digests sha256 exposés via API. ## État actuel Heimdall (constats code) - `src/Heimdall.Agent/appsettings.json` : `"Version": "1.0.0"` ; `AgentOptions.Version` défaut `"1.0.0"`. - La version est déjà envoyée au register (`RegisterRequest.Version`, `AgentRegistrationService.cs:103`) et affichée dans `AgentDetail.razor` (lignes 54-55) — mais toujours `1.0.0`. - `.forgejo/workflows/release.yml` : `docker-images: eltruncho/heimdall docker/Dockerfile` — **pas d'image agent**. ## À faire 1. **Injecter la version au build** (remplacer le hardcode) : - `Heimdall.Agent.csproj` : `<Version>$(BuildVersion)</Version>` + `InformationalVersion`, avec défaut local `1.0.0-dev` ; - l'agent lit sa version via `Assembly.GetExecutingAssembly()` (InformationalVersion) au démarrage → `AgentOptions.Version` devient readonly calculée, plus jamais `1.0.0` codé ; - Dockerfile agent : `ARG VERSION` + `ENV`/MSBuild property pour injecter le tag. 2. **CI/CD** (template `nonobis/templates` `ci-release`, `release.yml`) : - publier l'image `eltruncho/heimdall-agent` (Dockerfile agent) taguée `vX.Y.Z` ET `latest` ; - publier les **binaires natifs** en Release Forgejo (assets) : `heimdall-agent-linux-amd64`, `-linux-arm64`, `-win-x64` (dotnet publish single-file self-contained), avec **sha256** dans les notes/API ; - le tag `v*` reste le déclencheur unique. 3. **UI** : afficher la version réelle de l'agent (déjà fait via `AgentDetail`) + version du Central quelque part (footer ou page Settings) — « chaque build donne un numéro visible ». 4. Vérifier que le compose prod continue de référencer l'image désormais publiée. ## Critères d'acceptation - Un tag `v1.2.3` produit : image web, image agent, binaires Linux/Windows avec digests. - Un agent déployé depuis ce build reporte `1.2.3` dans l'UI (pas `1.0.0`). - `docker pull eltruncho/heimdall-agent:v1.2.3` fonctionne. ## Fichiers concernés - `src/Heimdall.Agent/Heimdall.Agent.csproj`, `appsettings.json`, `AgentOptions.cs`, `Program.cs` - `.forgejo/workflows/release.yml` - `docker/Dockerfile.agent` (ou `docker/Dockerfile` si multi-stage) - `docker/docker-compose.prod.yml` - `src/Heimdall.Web/Components/Pages/AgentDetail.razor` --- --- ## Maquette - **Lien Penpot** : [nonobis-design-system › page agents](https://penpot.tordais.cc/?page=127dfd1c-12b5-80f7-8008-79c6fdaf09f4) ![Maquette](https://forgejo.tordais.cc/attachments/abbf46b1-1f66-4b36-8712-6e9d2f2fcabe) - [Détails / composants MudBlazor (README)](https://forgejo.tordais.cc/attachments/b226e0e0-6f3b-42ad-87d6-b870244f2af1) - Statut : maquette appliquée dans Penpot ✓ ## Description Affichage de la version de l'agent (central + agent) : badge version dans l'en-tête de la fiche agent, ligne Version dans les métadonnées (avec date de build), et footer --- ## Maquette - **Lien Penpot** : [nonobis-design-system › page agents](https://penpot.tordais.cc/?page=127dfd1c-12b5-80f7-8008-79c6fdaf09f4) ![Maquette](https://forgejo.tordais.cc/attachments/abbf46b1-1f66-4b36-8712-6e9d2f2fcabe) - [Détails / composants MudBlazor (README)](https://forgejo.tordais.cc/attachments/b226e0e0-6f3b-42ad-87d6-b870244f2af1) - Statut : maquette appliquée dans Penpot ✓
Author
Owner

Maquette the-designer intégrée (14/08/2026) :

Maquette the-designer intégrée (14/08/2026) : - Aperçu (PNG) : https://forgejo.tordais.cc/attachments/abbf46b1-1f66-4b36-8712-6e9d2f2fcabe - Détails / composants MudBlazor (README) : https://forgejo.tordais.cc/attachments/b226e0e0-6f3b-42ad-87d6-b870244f2af1 - Statut : application Penpot différée (plugin MCP non connecté) — maquette locale consultable
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#95
No description provided.