From ba3add85b5c8350002a59c4ea3f473d61e3b7fc9 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Thu, 30 Jul 2026 10:16:41 +0200 Subject: [PATCH] fix(ci/windows): install zstd, or every cache save dies on a missing gzip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new windows-host cache steps reported '::warning::Failed to save' and nothing ever seeded. actions/cache probes for zstd, doesn't find it, falls back to gzip — and Git's GNU tar then shells out to a gzip that is not on the runner daemon's PATH: 'Child returned status 127', 'cache.tgz: Cannot write: Broken pipe', tar exit 2. Since save failures are warnings, the job stayed green while caching silently did nothing. zstd (+ a staged gzip.exe as insurance) now installs into its own directory — never Git's usr\bin on PATH, which would shadow Windows' find/sort/echo. Applied live to the runner and added to the machine PATH; this step keeps a rebuilt runner honest. Co-Authored-By: Claude Fable 5 --- scripts/ci/ensure-windows-toolchain.ps1 | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/scripts/ci/ensure-windows-toolchain.ps1 b/scripts/ci/ensure-windows-toolchain.ps1 index 4fa1215f..6201e5a0 100644 --- a/scripts/ci/ensure-windows-toolchain.ps1 +++ b/scripts/ci/ensure-windows-toolchain.ps1 @@ -63,3 +63,35 @@ if (-not (Test-Path $sccacheExe)) { } & $sccacheExe --version if ($env:GITHUB_PATH) { Add-Content -Path $env:GITHUB_PATH -Value $sccacheDir } + +# --- zstd: what actions/cache compresses with. Without it the toolkit falls back to gzip, +# and Git's GNU tar then shells out to a `gzip` that is NOT on the runner's PATH — every +# cache SAVE died with "Child returned status 127" / "Cannot write: Broken pipe" / exit 2, +# reported only as a ::warning:: so runs stayed green while nothing was ever cached +# (measured 2026-07-30 on windows-host). Own directory on purpose: putting Git's usr\bin on +# PATH would shadow Windows' find/sort/echo and break unrelated steps. +$zstdDir = 'C:\Users\Public\zstd' +$zstdExe = Join-Path $zstdDir 'zstd.exe' +if (-not (Test-Path $zstdExe)) { + try { + $v = '1.5.6' + $zip = Join-Path $env:TEMP "zstd-$v.zip" + Invoke-WebRequest -Uri "https://github.com/facebook/zstd/releases/download/v$v/zstd-v$v-win64.zip" -OutFile $zip + $tmp = Join-Path $env:TEMP 'zstd-extract' + Remove-Item -Recurse -Force $tmp -ErrorAction SilentlyContinue + Expand-Archive -Path $zip -DestinationPath $tmp -Force + New-Item -ItemType Directory -Force -Path $zstdDir | Out-Null + Get-ChildItem -Path $tmp -Recurse -Filter 'zstd.exe' | Select-Object -First 1 | + ForEach-Object { Copy-Item $_.FullName $zstdExe -Force } + $gitGzip = 'C:\Program Files\Git\usr\bin\gzip.exe' + if ((Test-Path $gitGzip) -and -not (Test-Path (Join-Path $zstdDir 'gzip.exe'))) { + Copy-Item $gitGzip (Join-Path $zstdDir 'gzip.exe') -Force + } + Remove-Item $zip, $tmp -Recurse -Force -ErrorAction SilentlyContinue + } + catch { Write-Warning "zstd install failed (cache saves will fall back to gzip): $_" } +} +if (Test-Path $zstdExe) { + & $zstdExe --version + if ($env:GITHUB_PATH) { Add-Content -Path $env:GITHUB_PATH -Value $zstdDir } +}