From d409406fde857d6fdc50b7a38a82783ae6ca985c Mon Sep 17 00:00:00 2001 From: nocode Date: Tue, 23 Jun 2026 12:50:45 +0200 Subject: [PATCH] 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---.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. --- build-offi.sh | 100 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 32 deletions(-) diff --git a/build-offi.sh b/build-offi.sh index 6346bc6..336ed0b 100755 --- a/build-offi.sh +++ b/build-offi.sh @@ -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--.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--.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--.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---.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 (ré)é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"