bd3f417d4b
apple / swift (push) Successful in 55s
ci / rust (push) Successful in 1m20s
ci / web (push) Successful in 29s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 2m7s
ci / docs-site (push) Successful in 30s
android / android (push) Successful in 3m20s
windows-msix / package (x64, C:\Users\Public\ffmpeg, x86_64-pc-windows-msvc, C:\t) (push) Successful in 1m52s
deb / build-publish (push) Successful in 3m40s
windows / build (aarch64-pc-windows-msvc) (push) Successful in 3m16s
decky / build-publish (push) Successful in 12s
ci / bench (push) Successful in 4m58s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 5s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 5s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 3m21s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 8m34s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 8m38s
docker / deploy-docs (push) Successful in 18s
windows.yml + windows-msix.yml gain an x86_64/aarch64 target matrix. ARM64 is cross-compiled on the one x64 Windows runner — the x64 MSVC toolset ships the ARM64 cross compiler, aarch64-pc-windows-msvc is tier-2 with host tools, and SDL3/libopus (build-from-source) cross-compile cleanly. The only arch-specific external dep is FFmpeg's import libs: the matrix points FFMPEG_DIR at a per-arch tree (x64 C:\Users\Public\ffmpeg, arm64 C:\Users\Public\ffmpeg-arm64, both FFmpeg 7.x / avcodec-61). Per-arch short CARGO_TARGET_DIR avoids a shared target dir; fmt + test run only for x64 (aarch64 can't execute on the x64 host). pack-msix.ps1 gains -Arch x64|arm64 (stamps the manifest ProcessorArchitecture, arch-suffixes the .msix/.cer); windows-msix.yml matrixes both arches and publishes ..._x64.msix / ..._arm64.msix. setup-windows-runner.ps1 provisions the rustup target + the ARM64 FFmpeg tree (idempotent). Verified live on the runner (home-windows-1): debug+release cross-build green, clippy -D warnings green, and MSIX pack produces a valid arm64 package (manifest arch=arm64; bundled exe/SDL3/avcodec/reactor-bootstrap all PE machine 0xAA64). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
112 lines
5.1 KiB
YAML
112 lines
5.1 KiB
YAML
# Build the punktfunk Windows client as signed MSIX packages (x64 + ARM64) and publish them to
|
|
# Gitea's generic package registry, so Windows boxes can download + install a real package (Start
|
|
# tile, clean install/uninstall) instead of a loose exe. Runs on the self-hosted Windows runner
|
|
# (host mode; scripts/ci/setup-windows-runner.ps1) — the MSVC/WinUI/FFmpeg toolchain + the Windows
|
|
# SDK's makeappx/signtool are baked into the runner's daemon env, same as windows.yml.
|
|
#
|
|
# Both arches come off the ONE x64 runner: x86_64 natively, aarch64 cross-compiled (the x64 MSVC
|
|
# toolset has the ARM64 cross compiler; the matrix points FFMPEG_DIR at the ARM64 FFmpeg tree). See
|
|
# windows.yml for the cross-build rationale + the BOM/MAX_PATH runner gotchas.
|
|
#
|
|
# Registry (public, unom org): https://git.unom.io/unom/-/packages (generic group)
|
|
# Packaging internals: clients/windows/packaging/README.md.
|
|
#
|
|
# Versioning — MSIX requires a strictly 4-part numeric version (no ~/- suffixes), so:
|
|
# win-vX.Y.Z tag -> X.Y.Z.0 (a real Windows-client release; `win-v*` is its own tag namespace,
|
|
# kept off the host's `host-v*` and the Apple `v*` to avoid the
|
|
# version-shadow class of bug — see deb.yml).
|
|
# main push / dispatch -> 0.2.<run_number>.0 (rolling; climbs monotonically by run number).
|
|
# Both arches share the version; artifacts are arch-suffixed (..._x64.msix / ..._arm64.msix).
|
|
#
|
|
# Signing (packaging/pack-msix.ps1): if the MSIX_CERT_PFX_B64 / MSIX_CERT_PASSWORD Actions secrets
|
|
# are set (a real or shared code-signing .pfx whose subject DN == Publisher), the package is signed
|
|
# with them. Otherwise an ephemeral self-signed cert is generated and its public .cer is published
|
|
# next to the .msix (users import it to Trusted People before install). Drop in a real cert later
|
|
# with no workflow change — just add the secrets (+ pass -Publisher if its subject differs).
|
|
name: windows-msix
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'clients/windows/**'
|
|
- 'crates/punktfunk-core/**'
|
|
- 'Cargo.lock'
|
|
- 'Cargo.toml'
|
|
- '.gitea/workflows/windows-msix.yml'
|
|
tags: ['win-v*']
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
REGISTRY: git.unom.io
|
|
OWNER: unom
|
|
PKG: punktfunk-client-windows
|
|
|
|
jobs:
|
|
package:
|
|
runs-on: windows-amd64
|
|
timeout-minutes: 90
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- arch: x64
|
|
target: x86_64-pc-windows-msvc
|
|
ffmpeg: C:\Users\Public\ffmpeg
|
|
td: C:\t
|
|
- arch: arm64
|
|
target: aarch64-pc-windows-msvc
|
|
ffmpeg: C:\Users\Public\ffmpeg-arm64
|
|
td: C:\t-a64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Configure + version
|
|
shell: pwsh
|
|
run: |
|
|
# windows-reactor's build.rs unwraps CARGO_WORKSPACE_DIR; CARGO_TARGET_DIR (per-arch, short)
|
|
# dodges the MAX_PATH wall in the CMake-from-source crates (see windows.yml). FFMPEG_DIR
|
|
# selects the arch's import libs + is read by pack-msix.ps1 for the runtime DLLs. All via
|
|
# GITHUB_ENV.
|
|
"CARGO_WORKSPACE_DIR=$env:GITHUB_WORKSPACE" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
|
"CARGO_TARGET_DIR=${{ matrix.td }}" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
|
"FFMPEG_DIR=${{ matrix.ffmpeg }}" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
|
rustup target add ${{ matrix.target }}
|
|
$parts = if ($env:GITHUB_REF -like 'refs/tags/win-v*') {
|
|
($env:GITHUB_REF_NAME -replace '^win-v', '').Split('.')
|
|
} else {
|
|
@('0', '2', $env:GITHUB_RUN_NUMBER)
|
|
}
|
|
while ($parts.Count -lt 4) { $parts += '0' }
|
|
$v = ($parts[0..3] -join '.')
|
|
"MSIX_VERSION=$v" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
|
Write-Output "MSIX version $v arch ${{ matrix.arch }} target ${{ matrix.target }}"
|
|
|
|
- name: Build (release)
|
|
shell: pwsh
|
|
run: cargo build --release -p punktfunk-client-windows --target ${{ matrix.target }}
|
|
|
|
- name: Pack + sign MSIX
|
|
shell: pwsh
|
|
env:
|
|
MSIX_CERT_PFX_B64: ${{ secrets.MSIX_CERT_PFX_B64 }}
|
|
MSIX_CERT_PASSWORD: ${{ secrets.MSIX_CERT_PASSWORD }}
|
|
run: |
|
|
& clients/windows/packaging/pack-msix.ps1 `
|
|
-Version $env:MSIX_VERSION -Arch ${{ matrix.arch }} `
|
|
-TargetDir ${{ matrix.td }}\${{ matrix.target }}\release -OutDir ${{ matrix.td }}\msix
|
|
|
|
- name: Publish to Gitea generic registry
|
|
shell: pwsh
|
|
env:
|
|
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
|
|
run: |
|
|
$files = @($env:MSIX_PATH, $env:MSIX_CER_PATH) | Where-Object { $_ -and (Test-Path $_) }
|
|
if (-not $files) { throw "pack produced no artifacts to publish" }
|
|
foreach ($f in $files) {
|
|
$name = Split-Path $f -Leaf
|
|
$url = "https://$($env:REGISTRY)/api/packages/$($env:OWNER)/generic/$($env:PKG)/$($env:MSIX_VERSION)/$name"
|
|
curl.exe -fsS --user "enricobuehler:$($env:REGISTRY_TOKEN)" --upload-file "$f" "$url"
|
|
Write-Output "published $name -> $url"
|
|
}
|