From c33fd40eab3d92b564d7dd25bbfdd462e4b7aba2 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Sat, 26 Sep 2026 21:49:25 +0300 Subject: [PATCH] ci: reuse compiler state on every os and save caches only from master --- .github/workflows/ci.yml | 91 +++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e773dbc..5471489d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,10 @@ env: # Persist both Zig caches; local build outputs otherwise stay in the uncached vendor tree. ZIG_GLOBAL_CACHE_DIR: ${{ github.workspace }}/.zig-cache ZIG_LOCAL_CACHE_DIR: ${{ github.workspace }}/.zig-cache + # PR caches are visible only to their own PR, and every save pushes the + # repository toward GitHub's cache limit, evicting the master caches PRs + # restore from. Only branch pushes save. + SAVE_CACHES: ${{ github.event_name == 'push' }} concurrency: group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -91,7 +95,17 @@ jobs: with: bun-version: 1.3.14 + # Zig downloads come from ziglang.org or a random community mirror and + # vary from seconds to minutes; reuse the verified install instead. + - name: Restore Zig compiler + id: zig-compiler + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ${{ runner.temp }}/herdr-zig-0.16.0 + key: zig-compiler-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0 + - name: Install Zig + if: steps.zig-compiler.outputs.cache-hit != 'true' uses: vercel-labs/setup-zig@83c1594f26b86da8a9a8ddd9b5ee5f3af0f96943 # v1.0.2 with: version: 0.16.0 @@ -99,24 +113,39 @@ jobs: # Zig's C-header cache keys include the compiler installation path. - name: Stabilize Zig installation path on Unix if: matrix.kind == 'unix' + env: + ZIG_RESTORED: ${{ steps.zig-compiler.outputs.cache-hit }} run: | stable_zig="$RUNNER_TEMP/herdr-zig-0.16.0" - mv "$(dirname "$(command -v zig)")" "$stable_zig" + if [ "$ZIG_RESTORED" != "true" ]; then + mv "$(dirname "$(command -v zig)")" "$stable_zig" + fi echo "$stable_zig" >> "$GITHUB_PATH" echo "ZIG=$stable_zig/zig" >> "$GITHUB_ENV" - name: Stabilize Zig installation path on Windows if: matrix.kind == 'windows' shell: pwsh + env: + ZIG_RESTORED: ${{ steps.zig-compiler.outputs.cache-hit }} run: | - $source = Split-Path (Get-Command zig).Source $stable = Join-Path $env:RUNNER_TEMP "herdr-zig-0.16.0" - Move-Item -LiteralPath $source -Destination $stable + if ($env:ZIG_RESTORED -ne "true") { + $source = Split-Path (Get-Command zig).Source + Move-Item -LiteralPath $source -Destination $stable + } $stable | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append "ZIG=$(Join-Path $stable 'zig.exe')" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + - name: Save Zig compiler + if: steps.zig-compiler.outputs.cache-hit != 'true' && env.SAVE_CACHES == 'true' + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ${{ runner.temp }}/herdr-zig-0.16.0 + key: zig-compiler-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0 + - name: Restore Zig build cache - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: .zig-cache key: zig-build-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0-${{ github.run_id }}-${{ github.run_attempt }} @@ -128,12 +157,11 @@ jobs: with: cache-bin: false key: ${{ matrix.os }} + save-if: ${{ env.SAVE_CACHES }} - # Save before rust-cache's post-step removes incremental state. Cargo still - # rebuilds workspace targets; only rustc's validated query state is retained. - - name: Restore Windows incremental compiler state - if: matrix.kind == 'windows' - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + # Cargo still rebuilds workspace targets; only rustc's validated query state is retained. + - name: Restore incremental compiler state + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: target/debug/incremental key: ci-incremental-v1-${{ runner.os }}-${{ runner.arch }}-${{ env.RUST_TOOLCHAIN_VERSION }}-${{ env.CARGO_PROFILE_DEV_DEBUG }}-${{ env.CARGO_PROFILE_TEST_DEBUG }}-${{ hashFiles('Cargo.lock', 'Cargo.toml', '.cargo/config.toml', 'build.rs') }}-${{ github.sha }} @@ -142,7 +170,7 @@ jobs: - name: Run Linux lint if: runner.os == 'Linux' - run: just lint + run: CARGO_INCREMENTAL=1 just lint - name: Run Linux tests if: runner.os == 'Linux' @@ -150,7 +178,7 @@ jobs: - name: Run macOS checks if: runner.os == 'macOS' - run: just ci '${{ matrix.nextest_filter }}' + run: CARGO_INCREMENTAL=1 just ci '${{ matrix.nextest_filter }}' - name: Check scalar libghostty with runtime safety if: runner.os == 'Linux' @@ -174,6 +202,21 @@ jobs: $exe = Join-Path $PWD "target\debug\herdr.exe" .\scripts\windows_smoke_conpty_path.ps1 -ExePath $exe -Session "ci-windows-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" + # Save before rust-cache's post-step removes incremental state. + - name: Save incremental compiler state + if: env.SAVE_CACHES == 'true' + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: target/debug/incremental + key: ci-incremental-v1-${{ runner.os }}-${{ runner.arch }}-${{ env.RUST_TOOLCHAIN_VERSION }}-${{ env.CARGO_PROFILE_DEV_DEBUG }}-${{ env.CARGO_PROFILE_TEST_DEBUG }}-${{ hashFiles('Cargo.lock', 'Cargo.toml', '.cargo/config.toml', 'build.rs') }}-${{ github.sha }} + + - name: Save Zig build cache + if: env.SAVE_CACHES == 'true' + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: .zig-cache + key: zig-build-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0-${{ github.run_id }}-${{ github.run_attempt }} + windows-conpty-package: name: Windows ConPTY package runs-on: windows-2022 @@ -190,22 +233,34 @@ jobs: toolchain: ${{ env.RUST_TOOLCHAIN_VERSION }} targets: x86_64-pc-windows-msvc + - name: Restore Zig compiler + id: zig-compiler + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ${{ runner.temp }}/herdr-zig-0.16.0 + key: zig-compiler-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0 + - name: Install Zig + if: steps.zig-compiler.outputs.cache-hit != 'true' uses: vercel-labs/setup-zig@83c1594f26b86da8a9a8ddd9b5ee5f3af0f96943 # v1.0.2 with: version: 0.16.0 - name: Stabilize Zig installation path shell: pwsh + env: + ZIG_RESTORED: ${{ steps.zig-compiler.outputs.cache-hit }} run: | - $source = Split-Path (Get-Command zig).Source $stable = Join-Path $env:RUNNER_TEMP "herdr-zig-0.16.0" - Move-Item -LiteralPath $source -Destination $stable + if ($env:ZIG_RESTORED -ne "true") { + $source = Split-Path (Get-Command zig).Source + Move-Item -LiteralPath $source -Destination $stable + } $stable | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append "ZIG=$(Join-Path $stable 'zig.exe')" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: Restore Zig build cache - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: .zig-cache key: zig-build-v1-conpty-package-windows-2022-${{ runner.arch }}-0.16.0-${{ github.run_id }}-${{ github.run_attempt }} @@ -217,10 +272,18 @@ jobs: with: cache-bin: false key: conpty-package-windows-2022 + save-if: ${{ env.SAVE_CACHES }} - name: Build Herdr run: cargo build --locked --target x86_64-pc-windows-msvc + - name: Save Zig build cache + if: env.SAVE_CACHES == 'true' + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: .zig-cache + key: zig-build-v1-conpty-package-windows-2022-${{ runner.arch }}-0.16.0-${{ github.run_id }}-${{ github.run_attempt }} + - name: Verify invalid bundle is rejected and system override recovers shell: pwsh run: |