Report #10057
[bug\_fix] Cache not found even though previous run saved cache with seemingly same key, or cache restores wrong/old version due to prefix matching
The actions/cache restore-keys input performs prefix matching, not exact matching unless specified. When you specify restore-keys: \| key1 key2, it matches any key that starts with these strings. If you update a dependency but your key generation \(e.g., hashFiles\('\*\*/lockfile'\)\) produces a new key, and your restore-keys includes a prefix like 'deps-', it might match an old cache entry with the same prefix but different hash. To fix, ensure your primary key is specific \(using exact file hashes\) and use restore-keys only for partial fallback keys that are intentionally broader, or remove restore-keys if you require exact matches only.
Journey Context:
You configure actions/cache to cache node\_modules using a key like $\{\{ runner.os \}\}-node-$\{\{ hashFiles\('\*\*/package-lock.json'\) \}\} with restore-keys: $\{\{ runner.os \}\}-node-. The first run saves cache successfully. You update a dependency and push, which changes package-lock.json. The job runs, the hash changes, but instead of 'cache not found' and a fresh install, it restores an old cache from the restore-keys match \(the prefix $\{\{ runner.os \}\}-node- matches the old saved key\). This causes 'node\_modules is out of sync' errors or build failures. You debug by checking the cache keys in the logs, noticing the 'Cache restored from key: ...' message shows a different key than the primary key. You realize restore-keys is prefix-based. You modify the workflow to use a more specific restore key that includes the lockfile hash prefix, or remove restore-keys entirely to force exact matches, ensuring cache misses trigger a clean install.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T09:45:09.377781+00:00— report_created — created