From 4f4c2b6b9125a1a73363ae681bd352536af19bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Sat, 22 Aug 2026 18:27:07 +0200 Subject: [PATCH] Fix CI: Gitea Actions cache keys never actually changed Confirmed via Gitea's own documentation (about.gitea.com's actions-cache tutorial): Gitea Actions doesn't support the built-in hashFiles() expression function GitHub Actions provides - it silently evaluates to an empty string rather than erroring, so all three cache keys (emsdk-${{hashFiles(...)}}, etc.) were actually just the constant strings "emsdk-", "deps-wasm32-", "libwinevbs-wasm32-" on every run, regardless of whether scripts/versions.sh or patches/ actually changed - this is why caching "didn't work properly": correctness-wise it's worse than no caching, since a stale cache from before a version/patch bump would keep being reused indefinitely instead of invalidating. Replaced with a plain sha256sum-based step that hashes the same inputs by hand and exposes them via GITHUB_OUTPUT - no dependency on Gitea gaining hashFiles() support, and verified locally to produce distinct, non-empty hashes. Co-Authored-By: Claude Sonnet 5 --- .gitea/workflows/ci.yml | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 9a00586..7bc2b4b 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -16,23 +16,36 @@ jobs: sudo apt-get update sudo apt-get install -y bison cmake curl python3 + # Gitea Actions doesn't support the built-in hashFiles() expression + # function (unlike GitHub Actions) - it silently evaluates to an empty + # string, which turned every cache key below into the same constant + # string regardless of what actually changed, so a cache entry from + # before a dependency-version or patch change would still be reused + # forever. Hash the same inputs by hand instead. + - name: Compute cache keys + id: cache-keys + run: | + echo "emsdk=$(sha256sum scripts/versions.sh | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" + echo "deps-wasm32=$(cat scripts/versions.sh $(find patches -type f | sort) | sha256sum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" + echo "libwinevbs=$(cat scripts/versions.sh $(find patches/libwinevbs -type f | sort) | sha256sum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" + - name: Cache emsdk uses: https://github.com/actions/cache@v4 with: path: emsdk - key: emsdk-${{ hashFiles('scripts/versions.sh') }} + key: emsdk-${{ steps.cache-keys.outputs.emsdk }} - name: Cache wasm32 dependency builds uses: https://github.com/actions/cache@v4 with: path: build/deps-wasm32 - key: deps-wasm32-${{ hashFiles('scripts/versions.sh', 'patches/**') }} + key: deps-wasm32-${{ steps.cache-keys.outputs.deps-wasm32 }} - name: Cache libwinevbs build uses: https://github.com/actions/cache@v4 with: path: vendor/libwinevbs/build - key: libwinevbs-wasm32-${{ hashFiles('scripts/versions.sh', 'patches/libwinevbs/**') }} + key: libwinevbs-wasm32-${{ steps.cache-keys.outputs.libwinevbs }} - name: Setup (fetch + patch vendor sources) run: ./scripts/setup.sh @@ -77,23 +90,36 @@ jobs: sudo apt-get update sudo apt-get install -y bison cmake curl python3 + # Gitea Actions doesn't support the built-in hashFiles() expression + # function (unlike GitHub Actions) - it silently evaluates to an empty + # string, which turned every cache key below into the same constant + # string regardless of what actually changed, so a cache entry from + # before a dependency-version or patch change would still be reused + # forever. Hash the same inputs by hand instead. + - name: Compute cache keys + id: cache-keys + run: | + echo "emsdk=$(sha256sum scripts/versions.sh | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" + echo "deps-wasm32=$(cat scripts/versions.sh $(find patches -type f | sort) | sha256sum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" + echo "libwinevbs=$(cat scripts/versions.sh $(find patches/libwinevbs -type f | sort) | sha256sum | cut -d' ' -f1)" >> "$GITHUB_OUTPUT" + - name: Cache emsdk uses: https://github.com/actions/cache@v4 with: path: emsdk - key: emsdk-${{ hashFiles('scripts/versions.sh') }} + key: emsdk-${{ steps.cache-keys.outputs.emsdk }} - name: Cache wasm32 dependency builds uses: https://github.com/actions/cache@v4 with: path: build/deps-wasm32 - key: deps-wasm32-${{ hashFiles('scripts/versions.sh', 'patches/**') }} + key: deps-wasm32-${{ steps.cache-keys.outputs.deps-wasm32 }} - name: Cache libwinevbs build uses: https://github.com/actions/cache@v4 with: path: vendor/libwinevbs/build - key: libwinevbs-wasm32-${{ hashFiles('scripts/versions.sh', 'patches/libwinevbs/**') }} + key: libwinevbs-wasm32-${{ steps.cache-keys.outputs.libwinevbs }} - name: Setup (fetch + patch vendor sources) run: ./scripts/setup.sh