diff --git a/.gitea/workflows/windows-client.yml b/.gitea/workflows/windows-client.yml index d0d8e528..9745490e 100644 --- a/.gitea/workflows/windows-client.yml +++ b/.gitea/workflows/windows-client.yml @@ -288,10 +288,13 @@ jobs: # stable release -> `latest/` alias; canary main build -> `canary/` alias. $alias = if ($env:GITHUB_REF -like 'refs/tags/v*') { 'latest' } else { 'canary' } # version-less, arch-suffixed alias names so each channel keeps one predictable URL. - $aliasNames = @{ - "$($env:MSIX_PATH)" = "$($env:PKG)_${{ matrix.arch }}.msix" - "$($env:MSIX_CER_PATH)" = "$($env:PKG)_${{ matrix.arch }}.cer" - } + # Under Azure signing there is no .cer, so MSIX_CER_PATH is unset. The quotes below are + # load-bearing: "$($env:UNSET)" interpolates to an empty string (a legal key), whereas a + # BARE $env:UNSET is $null and a null key is a hard error in a hash literal — which is + # exactly how windows-host.yml's publish step broke. Added explicitly rather than relying + # on that accident, so removing the quotes can't silently reintroduce it. + $aliasNames = @{ "$($env:MSIX_PATH)" = "$($env:PKG)_${{ matrix.arch }}.msix" } + if ($env:MSIX_CER_PATH) { $aliasNames[$env:MSIX_CER_PATH] = "$($env:PKG)_${{ matrix.arch }}.cer" } $files = @($env:MSIX_PATH, $env:MSIX_CER_PATH) | Where-Object { $_ -and (Test-Path $_) } if (-not $files) { throw "pack produced no artifacts to publish" } function Put($f, $url) { diff --git a/.gitea/workflows/windows-host.yml b/.gitea/workflows/windows-host.yml index 1047fbeb..29297c88 100644 --- a/.gitea/workflows/windows-host.yml +++ b/.gitea/workflows/windows-host.yml @@ -472,7 +472,13 @@ jobs: # Refresh the channel alias (delete-then-reupload, like flatpak.yml/decky.yml) for a # predictable download URL: stable release -> `latest/`, canary main build -> `canary/`. $alias = if ($env:GITHUB_REF -like 'refs/tags/v*') { 'latest' } else { 'canary' } - $aliasNames = @{ $env:HOST_SETUP_PATH = 'punktfunk-host-setup.exe'; $env:HOST_CER_PATH = 'punktfunk-host-windows.cer' } + # Build this incrementally, NOT as one literal: under Azure signing there is no .cer, so + # HOST_CER_PATH is unset — and an unset $env: var is $null, which is a HARD ERROR as a hash + # literal key ("A null key is not allowed in a hash literal"), not the empty-string key it + # looks like it should be. The $files guard above filters the missing .cer out just fine; + # this line ran before anything could use it and failed the whole publish step. + $aliasNames = @{ $env:HOST_SETUP_PATH = 'punktfunk-host-setup.exe' } + if ($env:HOST_CER_PATH) { $aliasNames[$env:HOST_CER_PATH] = 'punktfunk-host-windows.cer' } foreach ($f in $files) { $an = $aliasNames[$f]; if (-not $an) { continue } curl.exe -fsS -o NUL --user "enricobuehler:$($env:REGISTRY_TOKEN)" -X DELETE "$base/$alias/$an" 2>$null