Composants
Tout ce qu’il faut pour comprendre, construire et contribuer à XCP-hl.
Vue d’ensemble des dépôts
XCP-hl est réparti sur plusieurs dépôts fonctionnels, plus ce dépôt de documentation.
Vagrantin/xcp-hl ← docs (ce site)
│
├── Vagrantin/xolite-ce ← correctif XO Lite + build RPM
│ │ publie le RPM signé comme artefact de release GitHub
│ │
├─────────│───Vagrantin/xoa-proxy ← proxy HTTP Rust + build RPM
│ │ │ publie le RPM signé comme artefact de release GitHub
│ ▼ ▼
├── Vagrantin/xcp-ng-ce-iso ← assemblage de l'ISO + releases GitHub de l'ISO
│ │ télécharge les RPM de xolite-ce et xoa-proxy, assemble l'ISO
│
├── Vagrantin/xoa-hl ← XOA-hl : Xen Orchestra modifié (RPM + conteneur)
│ ▼
├── Vagrantin/build-xoa-hl ← chaîne Packer → image XVA de XOA sur XCP-ng
│ │ publie la XVA comme release GitHub (tags xoa-image-*)
│Chaque dépôt a sa propre chaîne GitHub Actions. Ils sont faiblement
couplés : xolite-ce et xoa-proxy publient des artefacts RPM versionnés
que xcp-ng-ce-iso récupère par tag de release. Aucun de ces dépôts n’a
besoin d’être récupéré en même temps qu’un autre pour un build normal.
xoa-hl construit le Xen Orchestra modifié par la communauté (XOA-hl), et
build-xoa-hl l’empaquette en image XVA.
Pile technique
| Couche | Technologie |
|---|---|
| Base hyperviseur | XCP-ng 8.3 (Xen 4.17, Dom0 Linux 4.19) |
| Interface XO Lite | Vue 3 · TypeScript · Vite · Pinia (@xen-orchestra/lite) |
| Build de XO Lite | Yarn (Corepack) · yarn build:xo-lite |
| Empaquetage RPM | rpmbuild, rpmsign, createrepo_c |
| Assemblage de l’ISO | create-install-image (chaîne d’outils XCP-ng, branche master) |
| Outillage ISO | mksquashfs, xorriso, isohybrid, implantisomd5 |
| Build de XOA-hl | Node.js 24 · workspaces Yarn · conteneur AlmaLinux 9 |
| Build de l’image XVA | Packer · greffon ddelnano/xenserver · Kickstart |
| Environnement de build | Docker (xcp-ng-build-env:8.3) |
| Serveur proxy | Rust · hyper · tokio · tokio_util::io::ReaderStream |
| CI/CD | GitHub Actions |
| Signature | GPG : clé maîtresse hors ligne + 2 sous-clés de signature (voir plus bas) |
Chaîne de build, de bout en bout
1. CI xolite-ce (GitHub Actions)
├── Cloner vatesfr/xen-orchestra au tag figé dans UPSTREAM_TAG
│ (actuellement xo-lite-v0.21.0, relevé délibérément, pas automatiquement)
├── Appliquer patches/community-xoa-deploy.patch
├── yarn build:xo-lite
├── rpmbuild → xo-lite-community-<VERSION>.rpm
├── rpmsign avec la signing subkey RPM (GPG_PRIVATE_KEY + GPG_PASSPHRASE)
└── Publier le RPM signé comme artefact de release GitHub (clé publique sur
keys.openpgp.org ; étapes d'import dans les notes de version)
2. CI xoa-proxy (GitHub Actions)
├── Installer la chaîne d'outils musl (musl-1.2.4, libc statique)
├── Installer Rust stable via rustup
├── Ajouter la cible x86_64-unknown-linux-musl
├── cargo build --release --target x86_64-unknown-linux-musl
├── Préparer les sources RPM (binaire + unité systemd + config logrotate)
├── rpmbuild → xoa-proxy-<VERSION>.rpm
├── rpmsign avec la signing subkey RPM (GPG_PRIVATE_KEY + GPG_PASSPHRASE)
└── Publier le RPM signé comme artefact de release GitHub (clé publique sur
keys.openpgp.org ; étapes d'import dans les notes de version)
3. CI xcp-ng-ce-iso (GitHub Actions)
├── Télécharger le RPM signé depuis la release xolite-ce
├── Télécharger le RPM signé depuis la release xoa-proxy
├── Importer GPG_PRIVATE_KEY (signing subkey ISO) dans le trousseau du runner
├── Exporter la clé publique du trousseau du runner → l'injecter dans le chroot de l'installateur
├── Préparer community-repo/x86_64/ avec createrepo_c
├── Lancer create-installimg.sh (root) : construit install.img (SquashFS)
├── Lancer create-iso.sh (non-root) : assemble l'ISO
├── isohybrid --uefi (fingerprint hybride MBR/GPT)
├── implantisomd5
├── sha256sum → xcp-ng-8.3-ceN.iso.sha256
├── gpg --detach-sign (signing subkey ISO via GPG_PRIVATE_KEY)
└── Publier xcp-ng-8.3-ceN.iso + .iso.sha256 + .iso.sha256.asc comme
release GitHub de Vagrantin/xcp-ng-ce-iso (clé publique sur
keys.openpgp.org ; étapes de vérification dans les notes de version)
4. CI xoa-hl (GitHub Actions, sur un tag v<VERSION>-ceN)
├── Récupération superficielle de vatesfr/xen-orchestra au commit figé dans UPSTREAM_XO
│ (actuellement 5.113.2, dernière version XO 5.x, relevée délibérément)
├── Appliquer patches/*.patch (menu-hide-items, xcp-hl-updates, xoa-hl-update-api)
├── Écrire xoahl.config.toml + générer un certificat TLS auto-signé
├── yarn && yarn build (tous les workspaces), élaguer, retirer les devDependencies
├── tar → xoa-hl-<VERSION>.tar.gz (entrée du build uniquement, non publiée)
├── rpmbuild → xoa-hl-<VERSION>-N.….x86_64.rpm (tout XO déjà construit)
├── Publier le RPM comme release GitHub v<VERSION>-ceN
└── Republier les 5 RPM les plus récents en dépôt yum signé (mises à jour de l'appliance)
5. build-xoa-hl (Packer, sur un vrai hôte XCP-ng)
├── Résoudre la checksum de l'ISO AlmaLinux + l'URL de la dernière release RPM de xoa-hl
├── Générer inst.ks (Kickstart) et almalinux-build.json (modèle Packer)
├── packer build : installer AlmaLinux 9 via Kickstart sur l'hôte XCP-ng
├── Provisionner : xe-guest-utilities, Node 24, RPM xoa-hl, unités de premier démarrage
├── Alléger l'image, vider /etc/machine-id
└── Exporter la XVA (xva_compressed) : l'appliance que XO Lite CE déploieChoix de conception
Trois dépôts pour le côté ISO
Ceci concerne spécifiquement la chaîne de l’ISO (xolite-ce, xoa-proxy,
xcp-ng-ce-iso) ; voir le schéma ci-dessus pour la place des dépôts propres
à XOA-hl dans la chaîne complète. Séparer chaque build de RPM de
l’assemblage de l’ISO garde les responsabilités bien délimitées : xolite-ce
(correctif d’interface, empaquetage) et xoa-proxy (proxy Rust, empaquetage)
peuvent chacun évoluer indépendamment sans toucher à la chaîne d’outils de
l’ISO, et réciproquement. Chacun publie un RPM versionné et signé comme
artefact de release GitHub. Ces artefacts sont ensuite consommés pour
construire l’ISO.
Correctif au niveau du code source
Le correctif XO Lite est appliqué au code source Vue/TypeScript de
DeployXoaView.vue.
Signature GPG
XCP-hl utilise une unique paire de clés suivant un modèle offline master key + sous-clés. La clé maîtresse est conservée hors ligne et n’est jamais utilisée pour signer. Deux signing subkeys en sont dérivées : une pour les deux RPM, une pour l’ISO.
Détails de la clé
| Propriété | Valeur |
|---|---|
| UID de la clé | XCP-ng Community Edition (Master signing key) (tel qu’affiché par gpg --list-keys) |
| Fingerprint de la clé maîtresse | 2F59 1DB9 D2C1 28C4 C3D9 63F4 6DA0 0DCA 5BBA 215A |
| Publiée sur | keys.openpgp.org |
| Adresse e-mail | xcp-ng-ce.lid530@passmail.com |
| Fichier de clé publique | xcp-ng-ce-public.asc |
Rôle des sous-clés
| Sous-clé | Utilisée pour |
|---|---|
| Signing subkey RPM | xo-lite-community-*.rpm et xoa-proxy-*.rpm |
| Signing subkey ISO | xcp-ng-8.3-ceN.iso.sha256.asc (detached signature du fichier de checksum de l’ISO) |
Documentation détaillée des composants
| Page | Description |
|---|---|
| xoa-proxy | Proxy HTTP/gzip en Rust pour la livraison des XVA |
| xolite-ce | Correctif XO Lite, spec RPM, chaîne de build |
| xcp-ng-ce-iso | Assemblage de l’ISO, chaîne d’outils, workflow de CI |
| xoa-hl | Xen Orchestra modifié (XOA-hl), construit et empaqueté en RPM |
| build-xoa-hl | Chaîne Packer qui construit l’image XVA de XOA sur XCP-ng |