Files
qelectrotech-source-mirror/.github/workflows/windows-msi.yml
Laurent Trinques 2f72e6164c Update windows-msi.yml
Removal of all envs: WIX_ACCEPT_EULA: true (does not work)
Addition of a dedicated ‘Accept WiX EULA’ step with wix eula accept wix7 before any other WiX command — this is the official CI/CD method, which writes a sentinel file to the user profile, thereby authorising all subsequent WiX commands in the same job.
2026-05-12 21:39:36 +02:00

215 lines
8.5 KiB
YAML

name: Windows MSI (WiX v7)
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 (pour récupérer QElectroTech.wxs et les sources)
# ----------------------------------------------------------------
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
# ----------------------------------------------------------------
# 2. Télécharger l'artifact portable du build principal
# Nécessite que windows-build.yml uploade un artifact nommé
# "qelectrotech-windows-portable" (nom fixe)
# ----------------------------------------------------------------
- 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.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 depuis qetversion.cpp (même logique que 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"
}
}
# Version numérique MSI : 4 chiffres obligatoire (ex. 0.100.1.0)
$verMsi = "$ver.0"
# Short SHA pour la version lisible
$sha = git rev-parse --short HEAD 2>$null
if (-not $sha) { $sha = "unknown" }
# Numéro de révision cumulatif (même calcul que 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
# "wix eula accept wix7" est la méthode officielle pour CI/CD
# Elle écrit un fichier sentinel dans le profil utilisateur
# qui autorise toutes les commandes wix suivantes
# ----------------------------------------------------------------
- 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. Vérifier la présence du fichier WXS dans le dépôt
# ----------------------------------------------------------------
- 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. Vérifier la structure de l'artifact et localiser 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
# Chercher qelectrotech.exe dans l'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 = dossier contenant 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. Résumé
# ----------------------------------------------------------------
- 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 ✗"
}