make with no target does what ./run.sh does: Electron on a graphical session, Vite's server without one or where Electron is not published (s390x, ppc64le). Every npm, npx and node recipe goes through the project's Node. make essai_demarrage starts the real Electron through Playwright and reads its window title, on Chromium's headless Ozone platform when there is no display: no X server is needed. scripts/verifier_systemes.sh replays install and tests in podman over the QEMU catalogue of TODO, and stops only its own containers. Checked: 17 Linux images and Nix pass all six steps; pwsh parses. --- FR --- [ADD] lancement : make et ./run.sh, essai d'Electron, matrice make sans cible fait ce que fait ./run.sh : Electron sur une session graphique, le serveur de Vite sans elle ou là où Electron n'est pas publié (s390x, ppc64le). Chaque recette npm, npx ou node passe par le Node du projet. make essai_demarrage lance la vraie coquille Electron par Playwright et lit le titre de sa fenêtre, sur la plateforme Ozone headless de Chromium sans écran : aucun serveur X n'est requis. scripts/verifier_systemes.sh rejoue installation et épreuves sous podman sur le catalogue QEMU de TODO, et n'arrête que ses conteneurs. Vérifié : 17 images Linux et Nix passent les six étapes ; pwsh analyse. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
62 lines
2.6 KiB
JavaScript
62 lines
2.6 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
// Essai de démarrage : construit la page, lance la vraie coquille Electron
|
|
// par Playwright, attend sa fenêtre, lit le titre et le bandeau, puis ferme.
|
|
// Il prouve ce que la coquille factice des épreuves (test/coquille.test.js)
|
|
// ne peut pas dire : qu'Electron démarre sur ce système, avec ses
|
|
// bibliothèques, et y charge la page.
|
|
//
|
|
// node scripts/essai_demarrage.js
|
|
//
|
|
// Sous Linux sans session graphique, Electron se lance sur la plateforme
|
|
// Ozone « headless » de Chromium : la fenêtre existe et la page s'y charge
|
|
// et s'y met en page, sans serveur d'affichage. Sous root, ou avec
|
|
// GTT_SANS_BAC_A_SABLE=1 là où le système refuse les espaces de noms
|
|
// d'utilisateur — un conteneur —, Electron se lance sans son bac à sable.
|
|
// Sort à 0 sur un démarrage conforme, à 1 sinon.
|
|
import { execFileSync } from 'node:child_process';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { _electron } from 'playwright';
|
|
import { VERSION } from '../src/version.genere.js';
|
|
import { titreAvecVersion } from '../src/interface/libelles.js';
|
|
|
|
const RACINE = fileURLToPath(new URL('..', import.meta.url));
|
|
const ATTENTE_MS = 60_000;
|
|
|
|
const sousRoot = typeof process.getuid === 'function' && process.getuid() === 0;
|
|
const sansBacASable = sousRoot || process.env.GTT_SANS_BAC_A_SABLE === '1';
|
|
const sansEcran = process.platform === 'linux' && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY;
|
|
|
|
// npm est un script .cmd sous Windows, que Node ne lance que par un shell.
|
|
execFileSync('npm', ['run', '--silent', 'build'], {
|
|
cwd: RACINE,
|
|
stdio: 'inherit',
|
|
shell: process.platform === 'win32',
|
|
});
|
|
|
|
const attendu = titreAvecVersion(VERSION.affichee);
|
|
const application = await _electron.launch({
|
|
args: [
|
|
...(sansBacASable ? ['--no-sandbox'] : []),
|
|
...(sansEcran ? ['--ozone-platform=headless'] : []),
|
|
'.',
|
|
],
|
|
cwd: RACINE,
|
|
timeout: ATTENTE_MS,
|
|
});
|
|
let conforme = false;
|
|
try {
|
|
const fenetre = await application.firstWindow({ timeout: ATTENTE_MS });
|
|
await fenetre.locator('header.bandeau .titre').waitFor({ timeout: ATTENTE_MS });
|
|
const titre = await fenetre.title();
|
|
const bandeau = (await fenetre.locator('header.bandeau .titre').textContent()).trim();
|
|
conforme = titre === attendu && bandeau === attendu;
|
|
console.log(`Titre de la fenêtre : ${titre}`);
|
|
console.log(`Bandeau : ${bandeau}`);
|
|
if (!conforme) console.error(`Attendu : ${attendu}`);
|
|
} finally {
|
|
await application.close();
|
|
}
|
|
console.log(conforme ? 'Démarrage conforme.' : 'Démarrage non conforme.');
|
|
process.exit(conforme ? 0 : 1);
|