feat(build-offi): add build date to iso filename and prompt for version/variant on host

Refactor version and variant handling to prompt for metadata on the host before entering container, enabling proper terminal display. Pass FWS_ISO_VERSION and FWS_ISO_TAG via environment variables to container.

Add build date (AAAA.MM.JJ format) to the final ISO filename: fws-<version>-<variant>-<AAAA.MM.JJ>.iso

Implement ask_iso_meta_host() function to validate and collect version (major.minor.build) and variant name inputs before containerization. Use sudo -E to preserve environment variables across privilege escalation.

Update ISO metadata prompt logic to skip if already provided, supporting both container execution and native Arch/WSL environments.
This commit is contained in:
2026-06-23 12:50:45 +02:00
parent 0de970239f
commit d409406fde
+68 -32
View File
@@ -2,10 +2,13 @@
# ============================================================
# FWS — Build OFFICIEL versionné de l'ISO (archiso)
#
# Identique à build.sh dans sa structure, mais :
# - lit la version dans le fichier VERSION (format Major.Minor.Build)
# - nomme l'ISO FWS-vMAJOR-MINOR-BUILD-DATE-x86_64.iso
# - range l'ISO dans out/vMAJOR/vMAJOR.MINOR/
# IDENTIQUE à build.sh (même bascule conteneur/WSL, --network=host, fusion
# baseline, MÊME injection local-repo → donc même paquet anaconda avec le champ
# Hostname), avec EN PLUS uniquement le RENOMMAGE :
# - demande la version (major.minor.build) + le nom de variante, le fichier
# VERSION servant de défaut,
# - nomme l'ISO fws-<version>-<nom>.iso (ex. fws-1.5.0-cli.iso),
# - range l'ISO dans out/vMAJOR/vMAJOR.MINOR/.
#
# Fonctionne sur :
# - Windows 10 / 11 (Git Bash → bascule auto dans WSL Arch)
@@ -121,6 +124,37 @@ if [ -z "$FWS_IN_CONTAINER" ] && ! host_is_arch; then
exit 1
}
# La version + le nom sont DEMANDÉS sur l'hôte (avant le conteneur) et passés
# via -e, pour que le prompt s'affiche au bon endroit (terminal de l'hôte).
# (Définis FWS_ISO_VERSION / FWS_ISO_TAG ; lus plus bas, prompt sauté si déjà
# fournis — c.-à-d. dans le conteneur.)
ask_iso_meta_host() {
[ -n "$FWS_ISO_VERSION" ] && [ -n "$FWS_ISO_TAG" ] && return 0
local def=""
if [ -f "$(dirname "${BASH_SOURCE[0]}")/VERSION" ]; then
def="$(tr -d ' \t\r\n' < "$(dirname "${BASH_SOURCE[0]}")/VERSION")"
[[ "$def" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || def=""
fi
while :; do
if [ -n "$def" ]; then
read -rp "==> Version (major.minor.build) [Entrée = $def] : " FWS_ISO_VERSION || exit 1
[ -n "$FWS_ISO_VERSION" ] || FWS_ISO_VERSION="$def"
else
read -rp "==> Version (major.minor.build, ex. 1.5.0) : " FWS_ISO_VERSION || exit 1
fi
[[ "$FWS_ISO_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && break
echo -e "\e[31m Format attendu : major.minor.build (ex. 1.5.0)\e[0m" >&2
done
while :; do
read -rp "==> Nom de la variante (ex. cli, gnome, kde) : " FWS_ISO_TAG || exit 1
FWS_ISO_TAG="$(printf '%s' "$FWS_ISO_TAG" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')"
[ -n "$FWS_ISO_TAG" ] && break
echo -e "\e[31m Nom requis (lettres, chiffres, tirets)\e[0m" >&2
done
export FWS_ISO_VERSION FWS_ISO_TAG
}
ask_iso_meta_host
# Rootful : préfixe sudo si on n'est pas déjà root.
SUDO=(); [ "$EUID" -eq 0 ] || SUDO=(sudo)
# -it seulement si on est dans un terminal (sinon podman casse en CI).
@@ -145,6 +179,7 @@ if [ -z "$FWS_IN_CONTAINER" ] && ! host_is_arch; then
# dans son propre netns), le conteneur récupère une connectivité identique.
"${SUDO[@]}" podman run --rm "${TTY[@]}" --network=host --privileged \
-e FWS_IN_CONTAINER=1 \
-e FWS_ISO_VERSION -e FWS_ISO_TAG \
-v "$REPO_DIR":"$REPO_DIR" \
-v fws-pacman-cache:/var/cache/pacman/pkg \
-w "$REPO_DIR" \
@@ -173,7 +208,8 @@ command -v pacman >/dev/null \
# $0 est cité pour gérer les chemins à espaces (ex. "1. FWS").
if [ "$EUID" -ne 0 ]; then
if command -v sudo >/dev/null 2>&1; then
exec sudo bash "$0" "$@"
# -E : conserve FWS_ISO_VERSION / FWS_ISO_TAG (demandés avant) à travers sudo.
exec sudo -E bash "$0" "$@"
else
exec su -c "bash \"$0\"" root
fi
@@ -194,47 +230,46 @@ echo "==> Dossier de travail : $WORK_DIR"
# ============================================================
# Version (major.minor.build) + nom de la variante.
# La version est DEMANDÉE ; le fichier VERSION sert de DÉFAUT (taper Entrée =
# reprendre sa valeur). Produit fws-<major.minor.build>-<nom>.iso
# (ex. fws-1.5.0-cli.iso). Nécessite un terminal (read).
# Déjà demandés sur l'hôte (FWS_ISO_VERSION/FWS_ISO_TAG passés via -e) ; sinon
# (exécution native Arch / WSL directe) on les demande ici. Le fichier VERSION
# sert de défaut (Entrée = le reprendre). Produit fws-<version>-<nom>.iso.
# ============================================================
# Défaut éventuel lu dans le fichier VERSION (doit être major.minor.build).
VERSION_FILE="$WORK_DIR/VERSION"
VERSION="$FWS_ISO_VERSION"
ISO_TAG="$FWS_ISO_TAG"
VERSION_DEFAULT=""
if [ -f "$VERSION_FILE" ]; then
VERSION_DEFAULT="$(tr -d ' \t\r\n' < "$VERSION_FILE")"
if [ -f "$WORK_DIR/VERSION" ]; then
VERSION_DEFAULT="$(tr -d ' \t\r\n' < "$WORK_DIR/VERSION")"
[[ "$VERSION_DEFAULT" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || VERSION_DEFAULT=""
fi
while :; do
while [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; do
if [ -n "$VERSION_DEFAULT" ]; then
read -rp "==> Version (major.minor.build) [Entrée = $VERSION_DEFAULT] : " VERSION \
|| { echo -e "\e[31mEntrée requise — lance le script en interactif.\e[0m" >&2; exit 1; }
[ -n "$VERSION" ] || VERSION="$VERSION_DEFAULT" # vide → on reprend le fichier VERSION
[ -n "$VERSION" ] || VERSION="$VERSION_DEFAULT"
else
read -rp "==> Version (major.minor.build, ex. 1.5.0) : " VERSION \
|| { echo -e "\e[31mEntrée requise — lance le script en interactif.\e[0m" >&2; exit 1; }
fi
[[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && break
echo -e "\e[31m Format attendu : major.minor.build (ex. 1.5.0)\e[0m" >&2
[[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] \
|| echo -e "\e[31m Format attendu : major.minor.build (ex. 1.5.0)\e[0m" >&2
done
while :; do
while [ -z "$ISO_TAG" ]; do
read -rp "==> Nom de la variante (ex. cli, gnome, kde) : " ISO_TAG \
|| { echo -e "\e[31mEntrée requise — lance le script en interactif.\e[0m" >&2; exit 1; }
# normalise : minuscules, lettres / chiffres / tirets uniquement
ISO_TAG="$(printf '%s' "$ISO_TAG" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')"
[ -n "$ISO_TAG" ] && break
echo -e "\e[31m Nom requis (lettres, chiffres, tirets)\e[0m" >&2
[ -n "$ISO_TAG" ] || echo -e "\e[31m Nom requis (lettres, chiffres, tirets)\e[0m" >&2
done
IFS='.' read -r MAJOR MINOR BUILD <<< "$VERSION"
BUILD_DATE="$(date +%Y.%m.%d)"
# iso_version interne (passé à mkarchiso) ; l'ISO finale est renommée plus bas.
ISO_VERSION="${VERSION}-${ISO_TAG}"
OUT_DIR="$WORK_DIR/out/v${MAJOR}/v${MAJOR}.${MINOR}"
ISO_FILE="$OUT_DIR/fws-${VERSION}-${ISO_TAG}.iso"
# Date ajoutée À LA FIN du nom, avant .iso → fws-<version>-<nom>-<AAAA.MM.JJ>.iso
ISO_FILE="$OUT_DIR/fws-${VERSION}-${ISO_TAG}-${BUILD_DATE}.iso"
echo "==> Version : ${VERSION} · variante : ${ISO_TAG}"
echo "==> ISO finale : fws-${VERSION}-${ISO_TAG}.iso"
echo "==> Version : ${VERSION} · variante : ${ISO_TAG} · date : ${BUILD_DATE}"
echo "==> ISO finale : fws-${VERSION}-${ISO_TAG}-${BUILD_DATE}.iso"
echo "==> Dossier : $OUT_DIR"
# pacman ≥ 7 sandboxe les ops FS via landlock, non supporté par le kernel
@@ -274,8 +309,8 @@ if [ -d "$WORK_DIR/configs/baseline" ]; then
fi
# ── Injection de la version dans profiledef.sh (copie temporaire) ──
# mkarchiso nomme l'ISO ${iso_name}-${iso_version}-${arch}.iso.
# On force iso_version pour obtenir vMAJOR-MINOR-BUILD-DATE.
# mkarchiso nomme l'ISO ${iso_name}-${iso_version}-${arch}.iso ; on force
# iso_version pour obtenir le nom voulu (l'ISO est renommée fws-… plus bas).
if [ -f /tmp/fws-build/releng/profiledef.sh ]; then
sed -i "s|^iso_version=.*|iso_version=\"${ISO_VERSION}\"|" \
/tmp/fws-build/releng/profiledef.sh
@@ -320,11 +355,12 @@ find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
echo "==> Lancement de mkarchiso..."
mkdir -p "$OUT_DIR"
# mkarchiso supprime l'ISO cible avant de la réécrire : si elle est VERROUILLÉE
# par Windows (VM ouverte dessus, ISO montée), ce rm casse tout le build à la
# fin. Parade : staging neuf puis déplacement ; si la cible (cette même
# version) est verrouillée, on bascule sur un nom horodaté. On ne touche
# jamais aux ISO des autres versions.
# mkarchiso fait un « rm » interne de l'ISO cible avant de la ()écrire ; si
# une ISO du même nom est VERROUILLÉE par Windows (VM encore ouverte dessus,
# ISO montée, antivirus), ce rm échoue et tout le build casse à la toute fin.
# Parade : mkarchiso écrit dans un dossier de staging neuf, puis on déplace
# l'ISO. Si la cible (cette même version) est verrouillée, on bascule sur un
# nom horodaté → on ne touche jamais aux ISO des autres versions.
STAGE="$OUT_DIR/.staging-$$"
rm -rf "$STAGE"; mkdir -p "$STAGE"
mkarchiso -v -w /tmp/fws-build/work -o "$STAGE" /tmp/fws-build/releng
@@ -344,4 +380,4 @@ echo "==> Nettoyage..."
rm -rf /tmp/fws-build/work
echo "==> Build officiel terminé ! ISO : $FINAL"
echo -e "\e[32mScript de build officiel (fws-${VERSION}-${ISO_TAG}) terminé avec succès.\e[0m"
echo -e "\e[32mScript de build officiel (fws-${VERSION}-${ISO_TAG}-${BUILD_DATE}) terminé avec succès.\e[0m"