Compétence de construction ActonOS
Utilisez cette compétence lors de la construction des artefacts ActonOS : le frontend, le binaire Go, l'image Docker ou l'ISO bare-metal.
Aperçu de la pipeline de compilation
make deps → make lint → make test → make test-race (CI Linux) → make build-web → make build → make docker → make iso
| Cible | Ce qu'elle fait | Sortie |
|---|---|---|
make deps | Installer les dépendances Go + Node | — |
make lint | Exécuter Go vet, gofmt, golangci-lint, ESLint | — |
make test | Exécuter tous les tests (unitaires + intégration) | build/coverage.out |
make test-race | Exécuter le détecteur de course CGO Linux | Porte CI obligatoire |
make build-web | Construire le frontend React (production Vite) | web/dist/ |
make build | Construire le binaire actond complet (inclut le web) | build/actond |
make build-only | Construire uniquement le binaire Go (sans reconstruire le web) | build/actond |
make docker | Construire l'image Docker | actonos/actonos:VERSION |
make iso | Construire l'ISO d'installation bare-metal | build/ActonOS-vVERSION.iso |
make all | Pipeline complète : lint → test → build | build/actond |
Variables de construction
Le binaire Go intègre les métadonnées de version via les flags du linker (-ldflags) :
LDFLAGS := -s -w \
-X main.Version=$(VERSION) \
-X main.GitCommit=$(GIT_COMMIT)$(GIT_DIRTY) \
-X main.BuildTime=$(BUILD_TIME)
Ces valeurs sont lues depuis :
- Fichier
VERSION→main.Version git rev-parse --short HEAD→main.GitCommitdate -u→main.BuildTime
Étape par étape : Construction complète pour la production
1. Construire le frontend
make build-web
# Exécute : cd web && npm run build
# Sortie : web/dist/ (assets statiques compressés)
Le frontend est construit avec Vite et produit des assets compressés en gzip/brotli qui sont intégrés dans le binaire Go via go:embed.
2. Construire le binaire Go
make build
# Exécute : CGO_ENABLED=0 go build -trimpath -ldflags '...' -o build/actond ./cmd/actond/
Critique : Toujours construire avec CGO_ENABLED=0 pour obtenir un binaire entièrement statique.
3. Compilation croisée
# Linux AMD64 (cible par défaut pour MiniPC/Docker)
GOOS=linux GOARCH=amd64 make build
# Linux ARM64 (pour les appareils basés sur ARM)
GOOS=linux GOARCH=arm64 make build
4. Construire l'image Docker
make docker
# Sortie : actonos/actonos:VERSION et actonos/actonos:latest
Le Dockerfile utilise une construction multi-étapes :
- Étape 1 : Construire le binaire Go
- Étape 2 : Construire le frontend
- Étape 3 : Image d'exécution Alpine minimaliste (<35 Mo)
5. Construire l'ISO (Bare-metal)
# Nécessite : hôte Debian/Ubuntu avec live-build et debootstrap
make iso
# Exécute : bash scripts/build-iso.sh
# Sortie : build/ActonOS-vVERSION.iso
Intégration go:embed
Les assets du frontend construit sont intégrés dans le binaire Go :
// internal/server/static.go
//go:embed all:../../../web/dist
var embeddedAssets embed.FS
Le module layered_fs.go implémente un système de fichiers superposé qui vérifie /data/overrides/ avant de revenir aux assets intégrés, permettant la personnalisation de l'interface utilisateur au moment de l'exécution.
Vérification d'une construction
# Vérifier la version du binaire
./build/actond --version
# Vérifier la taille du binaire
ls -lh build/actond
# Vérifier qu'il est vraiment statique (pas de liaison dynamique)
file build/actond
# Attendu : "ELF 64-bit LSB executable, x86-64, statically linked"
# Test rapide
./build/actond --data-dir=./dev-data --log-level=debug &
curl http://localhost:8080/api/health
kill %1
Problèmes courants de construction
| Problème | Cause | Solution |
|---|---|---|
web/dist not found | Frontend non construit | Exécutez make build-web d'abord |
CGO required | Utilisation de mattn/go-sqlite3 | Utilisez modernc.org/sqlite à la place |
go:embed pattern matches no files | web/dist/ vide | Construisez le frontend d'abord |
| Binaire non statique | CGO_ENABLED=1 | Définissez CGO_ENABLED=0 |
| Construction Docker OOM | Faible mémoire pendant la compilation Go | Augmentez la limite mémoire Docker |
Fichiers de référence
- Makefile — Définitions de la pipeline de construction
- deploy/docker/Dockerfile — Configuration de la construction Docker
- scripts/build-iso.sh — Script de construction ISO
- internal/server/static.go — Configuration go:embed