Files
punktfunk/scripts/windows/deploy-host.ps1
T
enricobuehler 5d7aabe8f0
apple / swift (push) Successful in 1m8s
ci / rust (push) Failing after 50s
ci / web (push) Successful in 55s
ci / docs-site (push) Successful in 1m8s
android / android (push) Successful in 3m24s
deb / build-publish (push) Failing after 45s
decky / build-publish (push) Successful in 11s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 5s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 4s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 3s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 5s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 5s
windows-host / package (push) Failing after 6m18s
apple / screenshots (push) Successful in 5m35s
ci / bench (push) Successful in 4m41s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Failing after 3m25s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Failing after 3m26s
docker / deploy-docs (push) Successful in 17s
fix(scripts/windows): keep deploy-host.ps1 pure ASCII (em-dash -> hyphen)
Two comment em-dashes I added tripped the installer-run ASCII guard (PS 5.1
mis-parses non-ASCII on non-UTF-8 locales).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 15:09:17 +00:00

104 lines
4.6 KiB
PowerShell

<#
Rebuild the punktfunk Windows host (release + NVENC) from the CURRENT source and
restart the LocalSystem service, with automatic rollback if the build fails or the
new binary won't start.
powershell -ExecutionPolicy Bypass -File scripts\windows\deploy-host.ps1
Prereqs: run setup-build-env.ps1 once (persists the build env), and VS C++ build tools
installed (vcvars64.bat is auto-discovered via vswhere). The service is stopped for the
duration of the build (the running .exe is locked), then restarted on the new binary.
#>
$ErrorActionPreference = 'Stop'
$repo = Split-Path (Split-Path $PSScriptRoot) # scripts\windows -> repo root
$exe = Join-Path $repo 'target\release\punktfunk-host.exe'
$bak = "$exe.bak"
$svc = 'PunktfunkHost'
function Find-VcVars {
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
if (Test-Path $vswhere) {
$ip = & $vswhere -latest -products * -property installationPath 2>$null
if ($ip) { $v = Join-Path $ip 'VC\Auxiliary\Build\vcvars64.bat'; if (Test-Path $v) { return $v } }
}
$fb = 'C:\Program Files\Microsoft Visual Studio\18\Community\VC\Auxiliary\Build\vcvars64.bat'
if (Test-Path $fb) { return $fb }
throw "vcvars64.bat not found - install the VS C++ build tools."
}
function Svc-Running { (& sc.exe query $svc 2>$null) -match 'RUNNING' }
Write-Host "== punktfunk host deploy =="
$vcvars = Find-VcVars
Write-Host "vcvars : $vcvars"
Set-Location $repo
# Load the persisted build env (Machine scope) into THIS process, so the build sees it even
# if this shell was started before setup-build-env.ps1 ran (env is inherited at spawn time).
foreach ($k in 'LIBCLANG_PATH','CMAKE_POLICY_VERSION_MINIMUM') {
$v = [Environment]::GetEnvironmentVariable($k, 'Machine')
if ($v) { [Environment]::SetEnvironmentVariable($k, $v, 'Process'); Write-Host "env : $k=$v" }
else { Write-Warning "env $k not set (run setup-build-env.ps1)" }
}
# All-vendor build when an FFmpeg dev tree is available (BtbN lgpl-shared: include/ + lib/ + bin/):
# nvenc alone otherwise. Without amf-qsv a GPU preference pointing at an AMD/Intel adapter makes
# every session die at encoder open (NV_ENC_ERR_NO_ENCODE_DEVICE) - the exact "can't connect"
# field failure on hybrid boxes.
$features = 'nvenc'
if (-not $env:FFMPEG_DIR) {
$v = [Environment]::GetEnvironmentVariable('FFMPEG_DIR', 'Machine')
if ($v) { [Environment]::SetEnvironmentVariable('FFMPEG_DIR', $v, 'Process') }
elseif (Test-Path 'C:\Users\Public\ffmpeg\include') { $env:FFMPEG_DIR = 'C:\Users\Public\ffmpeg' }
}
if ($env:FFMPEG_DIR -and (Test-Path (Join-Path $env:FFMPEG_DIR 'include'))) {
$features = 'nvenc,amf-qsv'
Write-Host "env : FFMPEG_DIR=$env:FFMPEG_DIR (AMF/QSV enabled)"
} else {
Write-Warning "no FFMPEG_DIR dev tree - building NVENC-only (AMD/Intel GPU selection will not encode)"
}
# 1. stop the service so the .exe is writable
Write-Host "stopping $svc ..."
& sc.exe stop $svc | Out-Null
for ($i=0; $i -lt 30 -and (Svc-Running); $i++) { Start-Sleep 1 }
# 2. back up the current binary for rollback
if (Test-Path $exe) { Copy-Item $exe $bak -Force; Write-Host "backup : $bak" }
# 3. build (release); build env is inherited from Machine scope (setup-build-env.ps1)
Write-Host "building: cargo build --release -p punktfunk-host --features $features"
& cmd.exe /c "call `"$vcvars`" >nul && cargo build --release -p punktfunk-host --features $features"
$built = ($LASTEXITCODE -eq 0)
if (-not $built) {
Write-Warning "BUILD FAILED (exit $LASTEXITCODE) - restoring previous binary."
if (Test-Path $bak) { Copy-Item $bak $exe -Force }
& sc.exe start $svc | Out-Null
throw "build failed; previous binary restored and service restarted."
}
# 3b. the AMF/QSV backend link-imports the FFmpeg DLLs - lay them next to the exe (the installer
# does the same into {app}); idempotent, and harmless for the NVENC path.
if ($features -like '*amf-qsv*') {
Copy-Item (Join-Path $env:FFMPEG_DIR 'bin\*.dll') (Split-Path $exe) -Force
Write-Host "ffmpeg : runtime DLLs copied next to the exe"
}
# 4. start on the new binary and confirm it stays up
Write-Host "build OK - starting $svc ..."
& sc.exe start $svc | Out-Null
$running = $false
for ($i=0; $i -lt 20; $i++) { if (Svc-Running) { $running = $true; break }; Start-Sleep 1 }
if (-not $running) {
Write-Warning "new binary did not start - rolling back."
& sc.exe stop $svc | Out-Null; Start-Sleep 2
if (Test-Path $bak) { Copy-Item $bak $exe -Force }
& sc.exe start $svc | Out-Null
throw "new binary failed to start; rolled back to previous."
}
Write-Host "DONE - $svc running the new binary:"
Get-Item $exe | Select-Object LastWriteTime, Length | Format-List