mirror of
https://github.com/storytold/lightcraft.git
synced 2026-11-09 01:49:47 -06:00
- brand.toml is the only place the product name lives; every crate and app
reads it through dac-brand (env vars with legacy fallback, settings folder
with copy-only migration, default library, preset extensions, i18n {app})
- cargo xtask brand check|test, run|install|package, docs, rename-crates,
deny and immich; packaging files are templates rendered from brand.toml
- icons regenerated from brand/icon.svg; upstream branding removed
- MIT licence (segment and fetch stay Apache-2.0); cargo deny licence policy
- clean-room rules in AGENTS.md/CLAUDE.md; docs/upstream-merge.md
- plan/ rebuilt and committed; parity tracker reopens Classic rows, adds
PLAN.md section 2 rows and the IMM Immich section; plan/immich.md and a
pinned Immich test server
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
101 lines
3.8 KiB
YAML
101 lines
3.8 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: dotnet tool install --global wix --version 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: app-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:
|
|
# for brand.toml and packaging/windows/brand.ps1 (the product name lives only there)
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: app-windows-arm64
|
|
path: dist
|
|
- name: Install the MSI, check it, run it, uninstall it
|
|
shell: pwsh
|
|
run: |
|
|
$ErrorActionPreference = 'Stop'
|
|
. ./packaging/windows/brand.ps1
|
|
$appExe = "$($Brand.binary).exe"
|
|
$cliExe = "$($Brand.cli_binary).exe"
|
|
$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 $Brand.display_name
|
|
foreach ($exe in $appExe, $cliExe) {
|
|
$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 $cliExe
|
|
$out = & $cli --version 2>&1 | Out-String
|
|
if ($LASTEXITCODE -ne 0) { Write-Output $out; throw "$cliExe --version exited $LASTEXITCODE" }
|
|
Write-Output "ok $cliExe --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 $appExe)) { throw "uninstall left $appExe behind" }
|
|
Write-Output 'ok uninstalled'
|