From 997aadf5b5693cc50ca6a99179d7ffe8cfbf8a80 Mon Sep 17 00:00:00 2001 From: "IETM_FIXE\\ietm6" Date: Sat, 20 Jun 2026 11:04:15 +0200 Subject: [PATCH] Mise en place de la distribution en .appimage pour les distro linux --- .github/workflows/desktop-release.yml | 76 ++++++++- brain/app/main.py | 2 +- brain/run_local.py | 6 +- core/pom.xml | 2 +- installers/desktop/app-icon.png | Bin 0 -> 82960 bytes installers/desktop/build-linux.sh | 236 ++++++++++++++++++++++++++ web/package-lock.json | 4 +- web/package.json | 2 +- 8 files changed, 315 insertions(+), 13 deletions(-) create mode 100644 installers/desktop/app-icon.png create mode 100644 installers/desktop/build-linux.sh diff --git a/.github/workflows/desktop-release.yml b/.github/workflows/desktop-release.yml index d037708..86a9a76 100644 --- a/.github/workflows/desktop-release.yml +++ b/.github/workflows/desktop-release.yml @@ -1,12 +1,12 @@ name: Desktop installers -# Produit les installeurs de BUREAU (.msi Windows pour l'instant) et les publie +# Produit les installeurs de BUREAU (.msi Windows + AppImage Linux) et les publie # en tant qu'assets d'une GitHub Release, sur tag `v*`. # # Complementaire au pipeline Gitea Actions (.gitea/workflows/release.yml) qui, -# lui, build et pousse les IMAGES Docker. Ici on est sur GitHub car jpackage et -# PyInstaller ne savent PAS cross-compiler : le .msi DOIT etre construit sur un -# runner Windows, et GitHub en fournit gratuitement (windows-latest). +# lui, build et pousse les IMAGES Docker. Ici on est sur GitHub car jpackage ne +# sait PAS cross-compiler : le .msi DOIT etre construit sur un runner Windows et +# l'AppImage sur un runner Linux — GitHub fournit les deux gratuitement. # # Prerequis : le depot Gitea doit etre mirrore vers GitHub (push mirror, tags # inclus) pour que le tag declenche ce workflow. @@ -191,6 +191,68 @@ jobs: path: core/target/dist-out/*.msi retention-days: 90 - # TODO (plus tard) : job `linux` sur ubuntu-latest produisant un AppImage - # (jpackage --type app-image + appimagetool) + PyInstaller Linux du Brain, - # attache a la MEME release. Reutilise la meme matrice / les memes etapes. + # LINUX : AppImage (1 fichier, toutes distros) attache a la MEME release. + # Tourne sur ubuntu-latest (jpackage ne cross-compile pas -> build natif Linux). + # Brain empaquete via python-build-standalone (pas de Python embeddable Linux + # officiel ; pas de PyInstaller -> pas de faux positif AV). Memes regles de + # publication que windows : stable -> release publique ; beta -> artefact prive. + linux: + needs: tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'workflow_dispatch' && format('v{0}', inputs.version) || github.ref }} + + # Apporte jpackage (empaquetage natif) dans le PATH. + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '21' + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '20' + + # Pas de setup-python : le Brain utilise SON python-build-standalone + # (telecharge par le script, avec son propre pip). Le host n'en a pas besoin. + + # Version (numerique X.Y.Z) + tag + isbeta, comme le job windows. + - name: Derive version + id: ver + run: | + if [ '${{ github.event_name }}' = 'workflow_dispatch' ]; then + raw='${{ inputs.version }}' + else + raw='${{ github.ref_name }}' + fi + raw="${raw#v}" # 0.15.0 ou 0.15.0-beta + num="${raw%%-*}" # 0.15.0 + case "$raw" in *-beta*) isbeta=true ;; *) isbeta=false ;; esac + echo "version=$num" >> "$GITHUB_OUTPUT" + echo "tag=v$raw" >> "$GITHUB_OUTPUT" + echo "isbeta=$isbeta" >> "$GITHUB_OUTPUT" + + - name: Build Linux AppImage + run: bash ./installers/desktop/build-linux.sh --version ${{ steps.ver.outputs.version }} + + # STABLE uniquement : attache l'AppImage a la release publique (meme tag que + # le .msi -> les deux installeurs sur la meme release). + - name: Publish AppImage to GitHub Release (stable) + if: ${{ steps.ver.outputs.isbeta == 'false' }} + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.ver.outputs.tag }} + files: core/target/dist-out/*.AppImage + fail_on_unmatched_files: true + + # BETA uniquement : artefact PRIVE (pas de release publique). + - name: Upload AppImage as private artifact (beta) + if: ${{ steps.ver.outputs.isbeta == 'true' }} + uses: actions/upload-artifact@v4 + with: + name: loremind-beta-${{ steps.ver.outputs.version }}-appimage + path: core/target/dist-out/*.AppImage + retention-days: 90 diff --git a/brain/app/main.py b/brain/app/main.py index 38b3e58..772b34b 100644 --- a/brain/app/main.py +++ b/brain/app/main.py @@ -26,7 +26,7 @@ from app.infrastructure.ollama_model_installer import ensure_ollama_embedding_mo app = FastAPI( title="LoreMind Brain", description="Backend IA pour la génération de contenu narratif.", - version="0.17.0", + version="0.17.1-beta", ) logger = logging.getLogger(__name__) diff --git a/brain/run_local.py b/brain/run_local.py index c0fa422..341d441 100644 --- a/brain/run_local.py +++ b/brain/run_local.py @@ -23,7 +23,11 @@ sys.path.insert(0, _HERE) # AVANT que l'app n'importe le pdf_extractor (qui détecte la version au chargement). # tessdata (fra+eng) est embarqué dans tesseract/tessdata. Sans ce bloc, l'OCR # reste désactivé en dégradation gracieuse (PDF born-digital OK, scans signalés). -_TESS = os.path.join(_HERE, "tesseract", "tesseract.exe") +# Binaire selon l'OS : tesseract.exe (Windows embeddable) ou tesseract (Linux/Mac). +# Si aucun Tesseract n'est bundlé (cas Linux/AppImage par défaut), le bloc est +# sauté et pytesseract retombe sur le tesseract SYSTÈME du PATH (ex. apt install +# tesseract-ocr) — sinon OCR désactivé en dégradation gracieuse. +_TESS = os.path.join(_HERE, "tesseract", "tesseract.exe" if os.name == "nt" else "tesseract") if os.path.exists(_TESS): os.environ.setdefault("TESSDATA_PREFIX", os.path.join(_HERE, "tesseract")) try: diff --git a/core/pom.xml b/core/pom.xml index df90bbe..8c51ab8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -14,7 +14,7 @@ com.loremind loremind-core - 0.17.0 + 0.17.1-beta LoreMind Core Backend Core - Architecture Hexagonale diff --git a/installers/desktop/app-icon.png b/installers/desktop/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcbd2ae7b23c0aea2809e336f15ade6a2893d02 GIT binary patch literal 82960 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 RHm+j;0#8>zmvv4FO#nM|cc}mX literal 0 HcmV?d00001 diff --git a/installers/desktop/build-linux.sh b/installers/desktop/build-linux.sh new file mode 100644 index 0000000..52d7f0b --- /dev/null +++ b/installers/desktop/build-linux.sh @@ -0,0 +1,236 @@ +#!/usr/bin/env bash +# +# Construit l'application de BUREAU Linux de DM Loremind sous forme d'AppImage, +# sans Docker. Equivalent Linux de installers/desktop/build-windows.ps1. +# +# Pipeline complet "local-first" : +# 1. Build du front Angular (web/ -> web/dist/web) +# 2. Prep du Brain (Python standalone) (brain/ -> dist-embed-linux : python relocatable + deps + sources) +# 3. Build du Core en fat jar + front (core/ -> target/*.jar, profil Maven "desktop") +# 4. Assemblage de la charge utile (jar + brain) dans un dossier d'entree jpackage +# 5. jpackage --type app-image -> image applicative + JRE embarque +# 6. appimagetool -> DM_Loremind-x86_64.AppImage (1 fichier, toutes distros) +# +# L'app resultante se lance d'un double-clic (chmod +x puis ./*.AppImage) : le Core +# demarre en profil Spring "local" (H2 fichier + stockage filesystem) et lance lui-meme +# le Brain en sidecar. Aucune dependance externe (ni Docker, ni Java, ni Python). +# +# PREREQUIS (machine de BUILD Linux uniquement, PAS chez l'utilisateur final) : +# - JDK 21+ avec jpackage dans le PATH (Temurin OK). +# - Node.js + npm (build Angular) ; Maven via le wrapper du repo. +# - curl, tar, et FUSE *ou* (sur CI sans FUSE) on lance appimagetool en +# --appimage-extract-and-run (gere automatiquement ci-dessous). +# - Internet (telecharge python-build-standalone + appimagetool). +# +# IMPORTANT : jpackage NE cross-compile PAS. Ce script DOIT tourner sur Linux +# (machine, WSL, ou runner ubuntu-latest). Il ne produira rien d'utile sous Windows. +# +# Projet : DM Loremind — assistant pour Maitres de Jeu de JDR — Licence AGPL-3.0 +set -euo pipefail + +# --- Args ------------------------------------------------------------------ +VERSION="" +SKIP_FRONT=0; SKIP_BRAIN=0; SKIP_JAR=0 +while [[ $# -gt 0 ]]; do + case "$1" in + --version) VERSION="$2"; shift 2 ;; + --skip-front) SKIP_FRONT=1; shift ;; + --skip-brain) SKIP_BRAIN=1; shift ;; + --skip-jar) SKIP_JAR=1; shift ;; + *) echo "Option inconnue : $1" >&2; exit 2 ;; + esac +done + +step() { printf '\033[36m==> %s\033[0m\n' "$1"; } +ok() { printf '\033[32m OK %s\033[0m\n' "$1"; } +err() { printf '\033[31m XX %s\033[0m\n' "$1" >&2; } + +# --- Chemins --------------------------------------------------------------- +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +WEB_DIR="$REPO_ROOT/web" +BRAIN_DIR="$REPO_ROOT/brain" +CORE_DIR="$REPO_ROOT/core" +STAGE_DIR="$CORE_DIR/target/dist-input" # charge utile jpackage +OUT_DIR="$CORE_DIR/target/dist-out" # image applicative + AppImage produits +BRAIN_EMBED="$BRAIN_DIR/dist-embed-linux" # staging du brain empaquete (Linux) +ICON_PNG="$SCRIPT_DIR/app-icon.png" # icone de l'app (jpackage Linux exige un PNG) +APP_NAME="DM Loremind" + +# python-build-standalone (Astral) : equivalent Linux du Python embeddable de +# python.org (qui n'existe que sous Windows). Build "install_only" = Python complet +# RELOCATABLE (pip inclus), donc on installe les deps directement dedans. +PY_MINOR="3.12" # doit matcher python:3.12 du Docker + +# --- Version (numerique) --------------------------------------------------- +if [[ -z "$VERSION" ]]; then + # Viser la version DU PROJET (artifactId loremind-core), pas le du parent. + VERSION="$(grep -oPz 'loremind-core\s*\K[0-9]+\.[0-9]+\.[0-9]+' \ + "$CORE_DIR/pom.xml" | tr -d '\0' | head -1 || true)" + [[ -z "$VERSION" ]] && VERSION="0.0.0" +fi + +echo +printf '\033[35m============================================================\033[0m\n' +printf '\033[35m DM Loremind - Build AppImage Linux (v%s)\033[0m\n' "$VERSION" +printf '\033[35m============================================================\033[0m\n' + +# --- Verif outils ---------------------------------------------------------- +command -v jpackage >/dev/null 2>&1 || { err "jpackage introuvable dans le PATH. Installez un JDK 21+ (Temurin)."; exit 1; } + +# --- 1. Front Angular ------------------------------------------------------ +if [[ $SKIP_FRONT -eq 0 ]]; then + step "Build du front Angular" + ( cd "$WEB_DIR" + [[ -d node_modules ]] || npm ci + npm run build ) + ok "Front construit (web/dist/web)" +else step "Front : saute (--skip-front)"; fi + +# --- 2. Brain (Python standalone relocatable, PAS d'exe gele) -------------- +if [[ $SKIP_BRAIN -eq 0 ]]; then + step "Preparation du Brain (python-build-standalone $PY_MINOR)" + rm -rf "$BRAIN_EMBED"; mkdir -p "$BRAIN_EMBED" + + # a) Resoudre l'asset install_only linux-gnu pour $PY_MINOR dans la derniere + # release PBS (la date du tag change a chaque release -> on la decouvre). + step " Resolution de l'archive python-build-standalone" + asset_url="$(curl -fsSL https://api.github.com/repos/astral-sh/python-build-standalone/releases/latest \ + | grep -oE "https://[^\"]*cpython-${PY_MINOR//./\\.}\.[0-9]+\+[0-9]+-x86_64-unknown-linux-gnu-install_only\.tar\.gz" \ + | head -1)" + [[ -z "$asset_url" ]] && { err "Archive python-build-standalone introuvable pour $PY_MINOR."; exit 1; } + echo " Telechargement $asset_url" + curl -fsSL "$asset_url" -o "$BRAIN_EMBED/python.tar.gz" + # L'archive install_only s'extrait en un dossier 'python/' (bin/python3, lib/...). + tar -xzf "$BRAIN_EMBED/python.tar.gz" -C "$BRAIN_EMBED" + rm -f "$BRAIN_EMBED/python.tar.gz" + PYBIN="$BRAIN_EMBED/python/bin/python3" + [[ -x "$PYBIN" ]] || { err "python3 introuvable apres extraction ($PYBIN)."; exit 1; } + + # b) Installer les deps DANS le python standalone (site-packages interne). + # Python complet => pip fonctionne directement, pas de bricolage ._pth/--target. + "$PYBIN" -m pip install --upgrade pip >/dev/null + "$PYBIN" -m pip install -r "$BRAIN_DIR/requirements.txt" + + # c) Copier les sources du Brain + le point d'entree. + cp -r "$BRAIN_DIR/app" "$BRAIN_EMBED/app" + cp "$BRAIN_DIR/run_local.py" "$BRAIN_EMBED/run_local.py" + + # d) OCR (Tesseract) : pas bundle pour l'instant sous Linux (libs partagees + # lourdes a embarquer proprement). Degradation gracieuse : si l'utilisateur a + # 'tesseract-ocr' (apt/dnf), pytesseract le trouve sur le PATH et l'OCR des + # scans marche ; sinon PDF born-digital OK, scans signales. Cf. run_local.py. + ok "Brain prepare (brain/dist-embed-linux : python standalone + deps + sources)" +else step "Brain : saute (--skip-brain)"; fi + +# --- 3. Core (fat jar avec front embarque) --------------------------------- +if [[ $SKIP_JAR -eq 0 ]]; then + step "Build du Core (fat jar, profil desktop)" + ( cd "$CORE_DIR" + chmod +x ./mvnw + # -Pdesktop : copie web/dist/web dans le jar (classpath:/static). + ./mvnw -q -Pdesktop -DskipTests clean package ) + ok "Core construit (core/target)" +else step "Core : saute (--skip-jar)"; fi + +# --- 4. Assemblage de la charge utile -------------------------------------- +step "Assemblage de la charge utile jpackage" +rm -rf "$STAGE_DIR"; mkdir -p "$STAGE_DIR" + +# Le jar repackage Spring Boot (executable) — on ignore le *.jar.original. +jar="$(find "$CORE_DIR/target" -maxdepth 1 -name 'loremind-core-*.jar' ! -name '*.original' | head -1)" +[[ -z "$jar" ]] && { err "Jar introuvable dans core/target. Relancez sans --skip-jar."; exit 1; } +cp "$jar" "$STAGE_DIR/loremind-core.jar" + +# Le Brain (python standalone + deps + sources) -> stage/brain/ +[[ -d "$BRAIN_EMBED/python" ]] || { err "Brain introuvable (brain/dist-embed-linux). Relancez sans --skip-brain."; exit 1; } +mkdir -p "$STAGE_DIR/brain" +cp -r "$BRAIN_EMBED/." "$STAGE_DIR/brain/" +ok "Charge utile prete ($STAGE_DIR)" + +# --- 5. jpackage -> app-image ---------------------------------------------- +step "Generation de l'image applicative (app-image) via jpackage" +[[ -f "$ICON_PNG" ]] || { err "Icone manquante : $ICON_PNG (PNG requis sous Linux)."; exit 1; } +rm -rf "$OUT_DIR"; mkdir -p "$OUT_DIR" + +# $APPDIR : substitue par jpackage AU LANCEMENT par le dossier applicatif +# (lib/app), qui contient le jar ET le dossier brain copie depuis --input. +# Le Brain se lance via python3 + run_local.py. brain.sidecar.command est une +# LISTE : les deux chemins separes par une virgule (aucun chemin Linux n'en +# contient) sont bindes en List par Spring. NB: $APPDIR doit rester +# LITTERAL ici (quote simple) — c'est jpackage, pas bash, qui le resout. +BRAIN_CMD='$APPDIR/brain/python/bin/python3,$APPDIR/brain/run_local.py' + +jpackage \ + --type app-image \ + --name "$APP_NAME" \ + --app-version "$VERSION" \ + --vendor 'IGML Creation' \ + --icon "$ICON_PNG" \ + --input "$STAGE_DIR" \ + --main-jar loremind-core.jar \ + --main-class org.springframework.boot.loader.launch.JarLauncher \ + --dest "$OUT_DIR" \ + --java-options '-Dspring.profiles.active=local' \ + --java-options "-Dbrain.sidecar.command=$BRAIN_CMD" + +APPIMG_SRC="$OUT_DIR/$APP_NAME" # dossier produit par jpackage (avec espace) +[[ -d "$APPIMG_SRC" ]] || { err "app-image jpackage introuvable ($APPIMG_SRC)."; exit 1; } +ok "Image applicative prete ($APPIMG_SRC)" + +# --- 6. AppImage via appimagetool ------------------------------------------ +step "Empaquetage AppImage (toutes distros)" +APPDIR="$OUT_DIR/AppDir" +rm -rf "$APPDIR"; mkdir -p "$APPDIR/usr" + +# a) L'app-image jpackage va sous AppDir/usr/ (le lanceur bin/* resout lib/ en +# relatif via ../lib -> reste coherent). +cp -r "$APPIMG_SRC/." "$APPDIR/usr/" + +# b) Icone a la racine de l'AppDir (nom = Icon= du .desktop, SANS extension). +cp "$ICON_PNG" "$APPDIR/dm-loremind.png" +mkdir -p "$APPDIR/usr/share/icons/hicolor/256x256/apps" +cp "$ICON_PNG" "$APPDIR/usr/share/icons/hicolor/256x256/apps/dm-loremind.png" + +# c) Fichier .desktop (a la racine + copie standard). +cat > "$APPDIR/dm-loremind.desktop" < lance le binaire jpackage. +cat > "$APPDIR/AppRun" <<'EOF' +#!/bin/sh +HERE="$(dirname "$(readlink -f "$0")")" +exec "$HERE/usr/bin/DM Loremind" "$@" +EOF +chmod +x "$APPDIR/AppRun" + +# e) appimagetool (telecharge si absent). --appimage-extract-and-run : evite +# d'exiger FUSE (absent des runners CI). +TOOL="$OUT_DIR/appimagetool-x86_64.AppImage" +if [[ ! -x "$TOOL" ]]; then + curl -fsSL -o "$TOOL" \ + https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage + chmod +x "$TOOL" +fi + +# APPIMAGE_EXTRACT_AND_RUN : permet d'EXECUTER l'AppImage appimagetool SANS FUSE +# (absent des runners CI) — il se self-extrait au lieu de se monter via fuse. +OUT_FILE="$OUT_DIR/DM_Loremind-${VERSION}-x86_64.AppImage" +ARCH=x86_64 APPIMAGE_EXTRACT_AND_RUN=1 "$TOOL" --appimage-extract-and-run "$APPDIR" "$OUT_FILE" +chmod +x "$OUT_FILE" + +echo +printf '\033[32m============================================================\033[0m\n' +printf '\033[32m AppImage genere !\033[0m\n' +printf '\033[32m %s\033[0m\n' "$OUT_FILE" +printf '\033[32m============================================================\033[0m\n' diff --git a/web/package-lock.json b/web/package-lock.json index 84dcf3f..6406328 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "loremind-web", - "version": "0.17.0", + "version": "0.17.1-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "loremind-web", - "version": "0.17.0", + "version": "0.17.1-beta", "dependencies": { "@angular/animations": "^21.2.16", "@angular/common": "^21.2.16", diff --git a/web/package.json b/web/package.json index 55e01d4..50671f1 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "loremind-web", - "version": "0.17.0", + "version": "0.17.1-beta", "description": "LoreMind Frontend - Angular", "scripts": { "ng": "ng",