cache restore on versions 3 and 4 not working
The functionality of the cache action seems to be completely broken.
Configurations attempted:
- save/restore actions @v4
- save/restore actions @v3
- base cache action @v4
- base cache action @v3
Experimental Workflow and Results
The cache is being accessed on the same branch, in the same workflow (and later, if the first set of jobs pass).
These screenshots pertain to the run of base cache action @v3, they are consistent across all configurations.
Cache version 2 works as expected.
Would definitely prefer to use the most recent versions.
~Cause of the above issue is a difference in the actions/checkout version. There must be a difference in the way they reference the branch.~
Im currently getting:
Failed to save: Unable to reserve cache with key db09ccc890352b660ddd94bbcf7ce4b880b254099c5050c6059b00b0b4c5777e, another job may be creating this cache. More details: Cache already exists.
Not sure if its related but even deleting all caches it wont recreate them...
Same issue here. Have been wracking my brain why this doesn't work and then wanted to eventually open an issue and found out there's one already. Trying v2 now as recommended above.
upd: v2 works as expected
@mark-jordanovic-lewis just to ensure, do you have exactly same value in the "path" parameter both in save and restore? I had different and restore failed too.
Correct. Same parameters in each use of the action.
We are seeing similar issues on v4 where the cache is not found despite clearly existing, only 1/5 runs are picked up correctly, is the cache action not reliable-ish?
I encountered the same issue. Save v4 + restore v2 cannot work as well. Using save v2 + restore v2 can resolve the problem. However, it seems that Node.js 16 is going to be deprecated.
I encountered the same issue. Save v4 + restore v2 cannot work as well. Using save v2 + restore v2 can resolve the problem. However, it seems that Node.js 16 is going to be deprecated.
I just found the reason: in v4, the path for restore and save must be the same. The error message doesn't give such information.
@njzjz I'm encountering this problem too and the paths are the same for me
#1
El dom, 26 de may. de 2024 19:55, Wout Mertens @.***> escribió:
@njzjz https://github.com/njzjz I'm encountering this problem too and the paths are the same for me
— Reply to this email directly, view it on GitHub https://github.com/actions/cache/issues/1361#issuecomment-2132119284, or unsubscribe https://github.com/notifications/unsubscribe-auth/BGG5ZMWZ5SQ7TVB3OGEP663ZEGINXAVCNFSM6AAAAABE574CB6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMZSGEYTSMRYGQ . You are receiving this because you are subscribed to this thread.Message ID: @.***>
Facing the same issue, any fix anytime soon?
I encountered the same issue. Save v4 + restore v2 cannot work as well. Using save v2 + restore v2 can resolve the problem. However, it seems that Node.js 16 is going to be deprecated.
restore v2 does not exist. it's only cache v2
I can also confirm that v2 works, but v4 is completely broken. I am running a job with a matrix and am consistently getting failures because it cannot save nor restore the cache correctly.
To be frank I'm surprised how a core action like "cache" is still broken and no (visible) steps are taken to fix it... At times github actions seem completely unreliable for anything beyond small open-source stuff that isn't mission-critical.
I hit this too. I was using actions/[email protected] to save a virtual env and some other things, specifying a literal path on that job, and then setting job outputs for the different things in the path (like outputs: venv-path: my-venv). Then in another job, I used actions/cache/[email protected] and referenced the same list of paths but via output variables (like paths: ${{ needs.setup-env.outputs.venv-path }}). As others have described, I could see the cache being created (and the setup-env job could pick up its own cache), but the downstream jobs say they can't find the cache. Changing both lists to be literal instead fixed the issue.
Variations of this issue seem to be reported in a number of other issues:
- https://github.com/actions/cache/issues/1198
- https://github.com/actions/cache/issues/1194
- and possibly https://github.com/actions/cache/issues/1275
@markfickett my paths are static and I'm experiencing this issue.
The problem is that it's intermittent.
Also confirming v4 is broken. I’m using static paths as well. I downgraded to v2 and everything works now.
@bethanyj28 @robherley @kotewar sorry about the pings but I cant believe this has been sitting here broken for so long
I have some workflows in which v3 and v4 work consistently and some that fail consistently. I'm not seeing the intermittant success/fail but I do see inconsistenty across workflows.
Cache Experiment Workflow
Amendmenent
Path in cache-container-file has a leading ./. Removal of this results in a cache hit in container-read-container-cache.
on:
push:
jobs:
# Cache files `cache-file-runner` and `cache-file-container`
cache-file-runner:
runs-on: ubuntu-22.04
steps:
- name: Create cache-file
run: |
touch cache-file-runner
echo "I am in ubuntu-latest-runner cache" > cache-file-runner
- uses: actions/cache/save@v4
with:
path: cache-file-runner
key: ${{ github.sha }}-cache-file-runner
enableCrossOsArchive: true
cache-file-container:
runs-on: ubuntu-22.04
container:
image: ubuntu:22.04
steps:
- name: Create cache-file
run: |
touch cache-file-container
echo "I am in ubuntu-latest-container cache" > cache-file-container
- uses: actions/cache/save@v4
with:
path: ./cache-file-container
key: ${{ github.sha }}-cache-file-container
enableCrossOsArchive: true
# Read each of the cache files from the runner
runner-read-runner-cache:
runs-on: ubuntu-22.04
needs: ["cache-file-runner", "cache-file-container"]
steps:
- uses: actions/cache/restore@v4
with:
path: cache-file-runner
key: ${{ github.sha }}-cache-file-runner
- name: Check cache-file
run: |
if [ -f "cache-file-runner" ]
then
echo "Found cached file"
else
echo "Cache not restored"
fi
runner-read-container-cache:
runs-on: ubuntu-22.04
needs: ["cache-file-runner", "cache-file-container"]
steps:
- uses: actions/cache/restore@v4
with:
path: cache-file-container
key: ${{ github.sha }}-cache-file-container
- name: Check cache-file
run: |
if [ -f "cache-file-container" ]
then
echo "Found cached file"
else
echo "Cache not restored"
fi
# Read each of the cache files from the container
container-read-runner-cache:
runs-on: ubuntu-22.04
needs: ["cache-file-runner", "cache-file-container"]
container:
image: ubuntu:22.04
steps:
- uses: actions/cache/restore@v4
with:
path: cache-file-runner
key: ${{ github.sha }}-cache-file-runner
- name: Check cache-file
run: |
if [ -f "cache-file-runner" ]
then
echo "Found cached file"
else
echo "Cache not restored"
fi
container-read-container-cache:
runs-on: ubuntu-22.04
needs: ["cache-file-runner", "cache-file-container"]
container:
image: ubuntu:22.04
steps:
- uses: actions/cache/restore@v4
with:
path: cache-file-container
key: ${{ github.sha }}-cache-file-container
- name: Check cache-file
run: |
if [ -f "cache-file-container" ]
then
echo "Found cached file"
else
echo "Cache not restored"
fi
# CrossOs access
runner-crossOS-read-container-cache:
runs-on: ubuntu-22.04
needs: ["cache-file-runner", "cache-file-container"]
steps:
- uses: actions/cache/restore@v4
with:
path: cache-file-container
key: ${{ github.sha }}-cache-file-container
enableCrossOsArchive: true
- name: Check cache-file
run: |
if [ -f "cache-file-container" ]
then
echo "Found cached file"
else
echo "Cache not restored"
fi
container-crossOS-read-runner-cache:
runs-on: ubuntu-22.04
needs: ["cache-file-runner", "cache-file-container"]
container:
image: ubuntu:22.04
steps:
- uses: actions/cache/restore@v4
with:
path: cache-file-runner
key: ${{ github.sha }}-cache-file-runner
enableCrossOsArchive: true
- name: Check cache-file
run: |
if [ -f "cache-file-runner" ]
then
echo "Found cached file"
else
echo "Cache not restored"
fi
Results
Cache code
I don't really see much in the cache restore code that would lead to this behavior other than how the cache path in Azure is calculated. I think this uses the below function to create a path on the fly? Couldn't see the encodeURI function in the code so can't comment on that.
function createTempDirectory() {
return __awaiter(this, void 0, void 0, function* () {
const IS_WINDOWS = process.platform === 'win32';
let tempDirectory = process.env['RUNNER_TEMP'] || '';
if (!tempDirectory) {
let baseLocation;
if (IS_WINDOWS) {
// On Windows use the USERPROFILE env variable
baseLocation = process.env['USERPROFILE'] || 'C:\\';
}
else {
if (process.platform === 'darwin') {
baseLocation = '/Users';
}
else {
baseLocation = '/home';
}
}
tempDirectory = path.join(baseLocation, 'actions', 'temp');
}
const dest = path.join(tempDirectory, (0, uuid_1.v4)()); <<< uuid_1.v4 call???
yield io.mkdirP(dest);
return dest;
});
}
exp
but my JS is not good enough to really debug this.
@mark-jordanovic-lewis I am not sure about other jobs, but for container-read-container-cache, you just need to change path: cache-file-container to path: ./cache-file-container to match the path in cache-file-container.
@mark-jordanovic-lewis I am not sure about other jobs, but for
container-read-container-cache, you just need to changepath: cache-file-containertopath: ./cache-file-containerto match the path incache-file-container.
Correct. Thanks @njzjz.
I just realized I had a trailing slash in one of the places and not the others. Now I made sure all the path strings are exactly the same and it seems to work without issues.
I confirm that caching works after:
- Prefixing each path of the
path:value with./; - Having the exact same
path:value for save and restore (I had wildcards in the save action path).