diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 236b4be..58d4104 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -169,12 +169,26 @@ jobs: with: node-version: '22' + # Deux pièges de Windows PowerShell 5.1 sont à l'œuvre dans les étapes + # `shell: powershell` ci-dessous, et valent d'être connus avant de les + # modifier : + # + # 1. Les guillemets doubles imbriqués dans un argument passé à un + # exécutable natif sont perdus. `node -p 'x.split(".")[0]'` arrive + # donc comme `x.split(.)[0]` et lève une SyntaxError. On lit ici + # `node --version` et on découpe côté PowerShell : rien ne traverse + # cette frontière. + # 2. Le runner écrit ce bloc dans un .ps1 sans BOM, que PowerShell 5.1 + # relit dans la page de codes ANSI. Tout caractère non-ASCII y devient + # illisible (« trouvé » s'affichait « trouvǸ »). Les chaînes affichées + # restent donc en ASCII — les commentaires, eux, ne sont jamais rendus. - name: Confirmer la version de Node shell: powershell run: | - $major = [int](& node -p 'process.versions.node.split(".")[0]') - Write-Host "Node $(& node -v)" - if ($major -lt 22) { throw "Node 22+ attendu, trouvé $major" } + $raw = (& node --version) + if ($raw -match '^v(\d+)\.') { $major = [int]$Matches[1] } else { $major = 0 } + Write-Host "Node $raw" + if ($major -lt 22) { throw "Node 22+ requis, version lue : $raw" } # Le script d'installation Windows n'est exécutable que sur Windows : # ce contrôle de syntaxe est la seule barrière avant qu'il n'atterrisse @@ -205,7 +219,7 @@ jobs: $auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($pair)) Invoke-WebRequest -Uri $url -Headers @{ Authorization = "Basic $auth" } ` -OutFile agent.cjs -UseBasicParsing - Write-Host "Bundle récupéré : $((Get-Item agent.cjs).Length) octets" + Write-Host "Bundle : $((Get-Item agent.cjs).Length) octets" - name: Exécuter le diagnostic shell: powershell @@ -221,7 +235,7 @@ jobs: # On valide que le diagnostic s'est déroulé, pas son verdict. foreach ($marker in @('obs-websocket', 'powershell')) { if ($out -notmatch [regex]::Escape($marker)) { - throw "Diagnostic incomplet : « $marker » absent de la sortie" + throw "Diagnostic incomplet : marqueur $marker absent de la sortie" } } Write-Host 'Bundle fonctionnel sous Windows.' diff --git a/deploy/install-agent.ps1 b/deploy/install-agent.ps1 index 10ae937..dcbed35 100644 --- a/deploy/install-agent.ps1 +++ b/deploy/install-agent.ps1 @@ -69,7 +69,13 @@ Write-Host '' $nodeMajor = 0 $nodeCmd = Get-Command node -ErrorAction SilentlyContinue if ($nodeCmd) { - $nodeMajor = [int]((& node -p 'process.versions.node.split(".")[0]') 2>$null) + # On lit `node --version` plutôt que d'évaluer une expression JavaScript. + # PowerShell 5.1 perd les guillemets doubles imbriqués quand il passe un + # argument à un exécutable natif : `node -p 'x.split(".")[0]'` arrive côté + # Node comme `x.split(.)[0]`, qui lève une SyntaxError. Le majeur valait + # alors 0 et le script réinstallait Node sur une machine déjà équipée. + $nodeRaw = (& node --version 2>$null) + if ($nodeRaw -match '^v(\d+)\.') { $nodeMajor = [int]$Matches[1] } } if ($nodeMajor -lt 22) {