From d9593518d03c538976f92c3131089b6e24271c64 Mon Sep 17 00:00:00 2001 From: Pierre Date: Fri, 14 Aug 2026 14:30:21 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20script=20de=20d=C3=A9ploiement=20a?= =?UTF-8?q?utomatis=C3=A9=20+=20assets=20statiques=20(manifest,=20ic=C3=B4?= =?UTF-8?q?nes,=20sw.js=20mod=C3=A8le)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/deploy_wasm.ps1 | 66 +++++++++++++++++++++++++++++++++++++++ deploy/icon-192.png | Bin 0 -> 2659 bytes deploy/icon-512.png | Bin 0 -> 7548 bytes deploy/manifest.json | 22 +++++++++++++ deploy/sw.js | 68 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+) create mode 100644 deploy/deploy_wasm.ps1 create mode 100644 deploy/icon-192.png create mode 100644 deploy/icon-512.png create mode 100644 deploy/manifest.json create mode 100644 deploy/sw.js diff --git a/deploy/deploy_wasm.ps1 b/deploy/deploy_wasm.ps1 new file mode 100644 index 0000000..49d1fdb --- /dev/null +++ b/deploy/deploy_wasm.ps1 @@ -0,0 +1,66 @@ +# ============================================================================ +# deploy_wasm.ps1 - Build + déploiement de shipheart_wasm vers le CM5 +# ---------------------------------------------------------------------------- +# Automatise : renommage HTML, injection manifest/service-worker, versionnage +# du cache (résout le problème de mise à jour automatique côté client, cf +# synthèse §21.10/21.11), et transfert final vers le CM5. +# +# Prérequis : avoir lancé Build dans Qt Creator (kit WebAssembly) AVANT ce +# script - il ne compile pas, il ne fait que préparer et déployer la sortie +# déjà construite. +# ============================================================================ + +param( + [string]$BuildDir = "O:\Technique\Projets_Qt\koriolan\shipheart_wasm\build\WebAssembly_Qt_6_8_3_Release", + [string]$AssetsDir = "O:\Technique\Projets_Qt\koriolan\shipheart_wasm\deploy", # manifest.json, icônes, sw.js "modèle" (CACHE_NAME sans version) + [string]$CM5Host = "192.168.1.220", + [int]$CM5Port = 2022, + [string]$CM5User = "koriolan", + [string]$CM5Path = "/var/www/shipheart-poc-wasm/" +) + +$ErrorActionPreference = "Stop" + +# --- 1. Renommer le HTML généré par Qt --- +Copy-Item "$BuildDir\shipheart_wasm.html" "$BuildDir\index.html" -Force + +# --- 2. Injecter les blocs manifest / service-worker --- +$html = Get-Content "$BuildDir\index.html" -Raw +$html = $html -replace "", @" + + + + +"@ +$html = $html -replace "", @" + + +"@ +Set-Content "$BuildDir\index.html" $html -NoNewline + +# --- 3. Versionner sw.js (change le CACHE_NAME à chaque déploiement) --- +# Le fichier "modèle" (CACHE_NAME générique) vit dans $AssetsDir, sous +# contrôle de version - on ne le modifie jamais sur place, on écrit la +# version horodatée directement dans le dossier de build. +$version = Get-Date -Format "yyyyMMdd_HHmmss" +$sw = Get-Content "$AssetsDir\sw.js" -Raw +$sw = $sw -replace 'const CACHE_NAME = "[^"]*";', "const CACHE_NAME = ""shipheart-wasm-$version"";" +Set-Content "$BuildDir\sw.js" $sw -NoNewline + +# --- 4. Transfert vers le CM5 --- +Copy-Item "$AssetsDir\manifest.json" "$BuildDir\manifest.json" -Force +Copy-Item "$AssetsDir\icon-192.png" "$BuildDir\icon-192.png" -Force +Copy-Item "$AssetsDir\icon-512.png" "$BuildDir\icon-512.png" -Force + +$fichiers = "index.html","qtloader.js","qtlogo.svg","shipheart_wasm.js","shipheart_wasm.wasm","shipheart_wasm.worker.js","sw.js","manifest.json","icon-192.png","icon-512.png" +foreach ($f in $fichiers) { + scp -P $CM5Port "$BuildDir\$f" "${CM5User}@${CM5Host}:${CM5Path}" +} + +Write-Host "Déploiement terminé - version $version" diff --git a/deploy/icon-192.png b/deploy/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..0baffa4280d0801654c0cb61d5d5f064cd4a66f5 GIT binary patch literal 2659 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 literal 0 HcmV?d00001 diff --git a/deploy/manifest.json b/deploy/manifest.json new file mode 100644 index 0000000..83f1543 --- /dev/null +++ b/deploy/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "ShipHeart (POC WASM)", + "short_name": "ShipHeart POC", + "description": "POC d'accès à ShipHeart via WebAssembly - jusqu'à home_accueil.qml", + "start_url": "./index.html", + "display": "fullscreen", + "orientation": "landscape", + "background_color": "#0e283a", + "theme_color": "#0e283a", + "icons": [ + { + "src": "icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/deploy/sw.js b/deploy/sw.js new file mode 100644 index 0000000..d366c8e --- /dev/null +++ b/deploy/sw.js @@ -0,0 +1,68 @@ +// Service worker du client ShipHeart. +// Stratégie "cache d'abord" pour la coquille statique de l'app (mêmes fichiers +// que le domaine de la page elle-même), MAIS jamais pour les appels vers +// l'API (données live, cross-origine) - ceux-ci passent toujours par le +// réseau, sans jamais être mis en cache, sous peine de figer les données +// affichées (rencontré concrètement : rafraîchissement périodique et même +// rechargement de page ne montraient plus jamais de valeurs à jour). + +const CACHE_NAME = "shipheart-wasm-v1"; +const APP_SHELL = [ + "./index.html", + "./qtloader.js", + "./shipheart_wasm.js", + "./shipheart_wasm.worker.js", + "./shipheart_wasm.wasm", + "./manifest.json", + "./icon-192.png", + "./icon-512.png", +]; + +self.addEventListener("install", (event) => { + event.waitUntil( + caches.open(CACHE_NAME).then((cache) => + Promise.allSettled( + APP_SHELL.map((url) => + cache.add(url).catch((err) => console.warn("Échec de mise en cache:", url, err)) + ) + ) + ) + ); + self.skipWaiting(); +}); + +self.addEventListener("activate", (event) => { + event.waitUntil( + caches.keys().then((keys) => + Promise.all( + keys.filter((key) => key !== CACHE_NAME).map((key) => caches.delete(key)) + ) + ) + ); + self.clients.claim(); +}); + +self.addEventListener("fetch", (event) => { + const url = new URL(event.request.url); + + // Appels vers l'API (données live, autre origine) : jamais de cache, + // toujours le réseau. + if (url.origin !== self.location.origin) { + event.respondWith(fetch(event.request)); + return; + } + + // Coquille statique de l'app (même origine) : cache d'abord, comme avant. + event.respondWith( + caches.match(event.request).then((cached) => { + if (cached) return cached; + return fetch(event.request).then((response) => { + if (response && response.ok) { + const responseClone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, responseClone)); + } + return response; + }); + }) + ); +});