From 15e623ac5fe17fc2ad1c9b880a1a81a72a651750 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Tue, 12 May 2026 21:58:07 +0200 Subject: [PATCH] Update QElectroTech.wxs --- build-aux/windows/QElectroTech.wxs | 342 ++++++++++++++++------------- 1 file changed, 194 insertions(+), 148 deletions(-) diff --git a/build-aux/windows/QElectroTech.wxs b/build-aux/windows/QElectroTech.wxs index e8ba64779..cb79b73b7 100644 --- a/build-aux/windows/QElectroTech.wxs +++ b/build-aux/windows/QElectroTech.wxs @@ -1,167 +1,213 @@ - - - +on: + workflow_dispatch: + inputs: + run_id: + description: "Run ID de 'Windows Build' (laisse vide pour le dernier run réussi)" + required: false + default: "" - +jobs: + build-msi: + name: Build MSI with WiX v7 + runs-on: windows-latest - - + steps: + # ---------------------------------------------------------------- + # 1. Checkout (to retrieve QElectroTech.wxs and sources) + # ---------------------------------------------------------------- + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 - - - - + # ---------------------------------------------------------------- + # 2. Download the portable artifact from the main build + # Requires windows-build.yml to upload an artifact named + # "qelectrotech-windows-portable" (fixed name) + # ---------------------------------------------------------------- + - name: Download portable artifact + uses: actions/download-artifact@v4 + with: + name: qelectrotech-windows-portable + path: artifact\files + run-id: ${{ github.event.inputs.run_id || github.run_id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.repository }} - - - - - - - - - - - - + # ---------------------------------------------------------------- + # 3. Extraire la version depuis les sources + # ---------------------------------------------------------------- + - name: Extract version + id: version + shell: pwsh + run: | + # Version from qetversion.cpp (same logic as windows-build.yml) + $src = Get-Content "sources\qetversion.cpp" -Raw -ErrorAction SilentlyContinue + if ($src -match 'return QVersionNumber\{([^}]+)\}') { + $ver = $Matches[1] -replace '\s','' -replace ',','.' + } else { + # Fallback: CMakeLists.txt + $cmake = Get-Content "CMakeLists.txt" -Raw + if ($cmake -match 'project\s*\([^)]*VERSION\s+([\d]+\.[\d]+\.[\d]+)') { + $ver = $Matches[1] + } else { + $ver = "0.0.0" + } + } - - - - + # Numeric MSI version: 4 digits required (e.g. 0.100.1.0) + $verMsi = "$ver.0" - - - - + # Short SHA for the display version + $sha = git rev-parse --short HEAD 2>$null + if (-not $sha) { $sha = "unknown" } - - - + # Cumulative revision number (same calculation as windows-build.yml) + $count = git rev-list HEAD --count 2>$null + $rev = [int]$count + 473 - - - + $verDisplay = "${ver}-r${rev}-${sha}_x86_64-win64" - - - + echo "VERSION_MSI=$verMsi" >> $env:GITHUB_OUTPUT + echo "VERSION_DISPLAY=$verDisplay" >> $env:GITHUB_OUTPUT + Write-Host "Version MSI : $verMsi" + Write-Host "Version display : $verDisplay" - - - + # ---------------------------------------------------------------- + # 4. Installer WiX v7 via dotnet tool + # ---------------------------------------------------------------- + - name: Install WiX v7 + shell: pwsh + run: | + dotnet tool install --global wix --version 7.0.0 + $toolsPath = [System.IO.Path]::Combine($env:USERPROFILE, '.dotnet', 'tools') + echo $toolsPath >> $env:GITHUB_PATH + Write-Host "WiX v7 installé." - - - + # ---------------------------------------------------------------- + # 5. Accepter la licence OSMF WiX v7 + # Official CI/CD method: writes a sentinel file + # that authorises all subsequent wix commands in the job + # ---------------------------------------------------------------- + - name: Accept WiX EULA + shell: pwsh + run: | + wix eula accept wix7 + Write-Host "EULA WiX v7 acceptée." - - - - - - - - - - - + # ---------------------------------------------------------------- + # 6. Installer l'extension WixUI + # ---------------------------------------------------------------- + - name: Install WiX UI extension + shell: pwsh + run: | + wix extension add WixToolset.UI.wixext/7.0.0 + Write-Host "Extension UI installée." - - - - - - - - - + # ---------------------------------------------------------------- + # 7. Check that the WXS file exists in the repository + # ---------------------------------------------------------------- + - name: Check WXS file + shell: pwsh + run: | + $wxs = "build-aux\windows\QElectroTech.wxs" + if (-not (Test-Path $wxs)) { + Write-Error "Fichier WXS introuvable : $wxs" + Write-Host "Contenu de build-aux\windows\ :" + Get-ChildItem "build-aux\windows\" -ErrorAction SilentlyContinue + exit 1 + } + Write-Host "WXS trouvé : $wxs" - - + # ---------------------------------------------------------------- + # 8. Check the artifact structure and locate files/ + # ---------------------------------------------------------------- + - name: Check artifact structure + shell: pwsh + run: | + Write-Host "=== Contenu de artifact\files (2 niveaux) ===" + Get-ChildItem -Path "artifact\files" -Depth 2 | + Select-Object FullName | Format-Table -AutoSize - - - - - - - - - - - - - + # Search for qelectrotech.exe in the artifact + $exe = Get-ChildItem -Path "artifact\files" -Filter "qelectrotech.exe" -Recurse | Select-Object -First 1 + if (-not $exe) { + Write-Error "qelectrotech.exe introuvable dans l'artifact" + exit 1 + } + Write-Host "Executable : $($exe.FullName) ($([math]::Round($exe.Length/1MB,1)) MB)" - - + # FilesDir = folder containing bin\ + $binDir = $exe.Directory.FullName + $filesDir = Split-Path $binDir -Parent - - - - - + echo "FILES_DIR=$filesDir" >> $env:GITHUB_ENV + Write-Host "FILES_DIR : $filesDir" - - + # ---------------------------------------------------------------- + # 9. Construire le MSI + # ---------------------------------------------------------------- + - name: Build MSI + shell: pwsh + run: | + $version = "${{ steps.version.outputs.VERSION_MSI }}" + $verDisplay = "${{ steps.version.outputs.VERSION_DISPLAY }}" + $filesDir = $env:FILES_DIR + $wxs = "build-aux\windows\QElectroTech.wxs" + $outputName = "QElectroTech-${verDisplay}.msi" + + New-Item -ItemType Directory -Force -Path "dist" | Out-Null + + Write-Host "=== wix build ===" + Write-Host " WXS : $wxs" + Write-Host " Version : $version" + Write-Host " FilesDir : $filesDir" + Write-Host " Output : dist\$outputName" + + wix build $wxs ` + -arch x64 ` + -d "Version=$version" ` + -d "ProductVersion=$verDisplay" ` + -d "FilesDir=$filesDir" ` + -ext WixToolset.UI.wixext ` + -o "dist\$outputName" + + if (-not (Test-Path "dist\$outputName")) { + Write-Error "MSI non généré : dist\$outputName" + exit 1 + } + + $size = [math]::Round((Get-Item "dist\$outputName").Length / 1MB, 1) + Write-Host "MSI généré : dist\$outputName ($size MB) ✓" + echo "MSI_NAME=$outputName" >> $env:GITHUB_ENV + + # ---------------------------------------------------------------- + # 10. Upload de l'artifact MSI + # ---------------------------------------------------------------- + - name: Upload MSI artifact + uses: actions/upload-artifact@v4 + with: + name: qelectrotech-windows-msi + path: dist\*.msi + retention-days: 14 + if-no-files-found: error + + # ---------------------------------------------------------------- + # 11. Summary + # ---------------------------------------------------------------- + - name: Summary + if: always() + shell: pwsh + run: | + Write-Host "=== Résumé build MSI ===" + Write-Host "Version : ${{ steps.version.outputs.VERSION_DISPLAY }}" + Write-Host "WiX : v7.0.0" + Write-Host "Image runner : ${{ runner.os }} / ${{ runner.arch }}" + if (Test-Path "dist\$env:MSI_NAME") { + $size = [math]::Round((Get-Item "dist\$env:MSI_NAME").Length / 1MB, 1) + Write-Host "MSI : $env:MSI_NAME ($size MB) ✓" + } else { + Write-Host "MSI : ÉCHEC ✗" + }