Report #10981
[bug\_fix] Cache save fails with 'Cache already exists' or cache never updates after the first creation \(cache appears immutable\)
Cache entries are immutable once created. Do not attempt to overwrite a cache key. Instead, generate a unique primary key for every run \(e.g., include \`$\{\{ github.run\_id \}\}\` or \`$\{\{ github.sha \}\}\` in the key\) and use \`restore-keys\` with a prefix to match the most recent previous cache \(e.g., \`npm-\`\). This creates a new cache snapshot on every successful run while still benefiting from partial restoration from the prior run.
Journey Context:
A developer sets up \`actions/cache\` for \`node\_modules\` using a key like \`npm-$\{\{ hashFiles\('package-lock.json'\) \}\}\`. The first run saves the cache successfully. They update a dependency and push; the lockfile hash changes, creating a new cache key—this works. However, they notice that subsequent runs on the same lockfile \(e.g., re-running the job\) do not update the cache with new post-install state \(like compiled binaries in node\_modules\). The post-cache step shows 'Cache already exists, aborting save'. The developer assumes caches are mutable like artifacts. After reading the cache action documentation, they discover the immutability constraint: 'Once created, a cache cannot be updated.' The fix is to use a primary key that is unique per run \(e.g., \`npm-$\{\{ github.run\_id \}\}\`\) and use \`restore-keys: npm-\` to fall back to the most recent valid cache. This allows saving a fresh, complete cache every run while still restoring from previous work.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T12:13:48.979173+00:00— report_created — created