mirror of
https://github.com/storytold/wordcraft.git
synced 2026-10-25 02:47:33 -06:00
The MSI had no UI, so Windows Installer showed only its basic progress box and closed without saying the install had worked. It now uses WiX's standard WixUI_Minimal dialogs: a welcome page with the license (MIT or Apache-2.0, built at packaging time from LICENSE-MIT and LICENSE-APACHE), progress, and a finish page with an optional "Launch WordCraft" checkbox. The release and Windows ARM64 workflows install the WiX UI and Util extensions the build now needs. UpgradeCode and component GUIDs are unchanged. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
101 lines
4.0 KiB
YAML
101 lines
4.0 KiB
YAML
# Windows on ARM: package the ARM64 release the way release.yml does (cross-compiled on an x64
|
|
# runner, unsigned here), then install that MSI on a Windows 11 ARM64 runner, check the installed
|
|
# binaries are ARM64, run the CLI natively, and uninstall. (A native ARM64 `cargo test` job is left
|
|
# out for now: PdfCraft saw an intermittent access violation in egui UI tests there.)
|
|
name: Windows ARM64
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
paths:
|
|
- Cargo.toml
|
|
- Cargo.lock
|
|
- "**/Cargo.toml"
|
|
- "**/build.rs"
|
|
- .github/workflows/windows-arm64.yml
|
|
- packaging/windows/**
|
|
schedule:
|
|
- cron: "41 4 * * 1" # weekly, so drift in the runner images shows up
|
|
workflow_dispatch:
|
|
|
|
concurrency:
|
|
group: windows-arm64-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
CARGO_TERM_COLOR: always
|
|
CARGO_INCREMENTAL: 0
|
|
|
|
jobs:
|
|
package:
|
|
name: package (cross-compiled on x64)
|
|
runs-on: windows-latest
|
|
timeout-minutes: 90
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@89b12181fb390509a0842a86cc55eeb8eb928c1d # stable
|
|
with:
|
|
targets: aarch64-pc-windows-msvc
|
|
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
with:
|
|
key: windows-arm64-package
|
|
- name: Install WiX
|
|
shell: pwsh
|
|
run: |
|
|
$PSNativeCommandUseErrorActionPreference = $true # stop at the first failing command
|
|
dotnet tool install --global wix --version 5.0.2
|
|
# Installer dialogs and the finish page's "Launch WordCraft" (packaging/windows/wordcraft.wxs).
|
|
wix extension add -g WixToolset.UI.wixext/5.0.2
|
|
wix extension add -g WixToolset.Util.wixext/5.0.2
|
|
- name: Build and package (unsigned)
|
|
shell: pwsh
|
|
env:
|
|
DIST: ${{ github.workspace }}\dist\arm64
|
|
run: ./packaging/windows/package.ps1 -Arch arm64
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: wordcraft-windows-arm64
|
|
path: dist/arm64/*
|
|
if-no-files-found: error
|
|
retention-days: 7
|
|
|
|
install:
|
|
name: install and run on ARM64
|
|
needs: package
|
|
runs-on: windows-11-arm
|
|
timeout-minutes: 30
|
|
steps:
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: wordcraft-windows-arm64
|
|
path: dist
|
|
- name: Install the MSI, check it, run it, uninstall it
|
|
shell: pwsh
|
|
run: |
|
|
$ErrorActionPreference = 'Stop'
|
|
$msi = (Get-ChildItem dist/*.msi | Select-Object -First 1).FullName
|
|
$p = Start-Process msiexec.exe -ArgumentList '/i', "`"$msi`"", '/qn', '/l*v', 'install.log' -Wait -PassThru
|
|
if ($p.ExitCode -ne 0) { Get-Content install.log -Tail 60; throw "msiexec /i exited $($p.ExitCode)" }
|
|
$dir = Join-Path $env:ProgramFiles 'WordCraft'
|
|
foreach ($exe in 'wordcraft.exe', 'wordcraft-cli.exe') {
|
|
$path = Join-Path $dir $exe
|
|
if (-not (Test-Path $path)) { throw "$exe not installed in $dir" }
|
|
$bytes = [System.IO.File]::ReadAllBytes($path)
|
|
$machine = [BitConverter]::ToUInt16($bytes, [BitConverter]::ToInt32($bytes, 0x3C) + 4)
|
|
if ($machine -ne 0xAA64) { throw "$exe is for machine 0x$('{0:X}' -f $machine), not ARM64" }
|
|
Write-Output "ok $path (ARM64)"
|
|
}
|
|
# The installed CLI runs natively on ARM64.
|
|
$cli = Join-Path $dir 'wordcraft-cli.exe'
|
|
$out = & $cli --version 2>&1 | Out-String
|
|
if ($LASTEXITCODE -ne 0) { Write-Output $out; throw "wordcraft-cli --version exited $LASTEXITCODE" }
|
|
Write-Output "ok wordcraft-cli --version: $($out.Trim())"
|
|
$p = Start-Process msiexec.exe -ArgumentList '/x', "`"$msi`"", '/qn' -Wait -PassThru
|
|
if ($p.ExitCode -ne 0) { throw "msiexec /x exited $($p.ExitCode)" }
|
|
if (Test-Path (Join-Path $dir 'wordcraft.exe')) { throw 'uninstall left wordcraft.exe behind' }
|
|
Write-Output 'ok uninstalled'
|