Fix GitHub Actions Cache Path Validation Errors
Resumo
Pixel’s announcement explains why GitHub Actions can show a cache Path Validation Error even when a job succeeds: the save step found no matching files, and the message may appear only in the collapsed post step. It covers common causes, including skipped build steps and cache directories that differ across operating systems, helping the community troubleshoot missing caches.
DEV Community
GitHub Actions Path Validation Error caching, on a green job
A GitHub Actions Path Validation Error caching line means the glob in your path input matched nothing when the post step ran, so no archive was built and nothing was uploaded. The job stays green, because the action writes that line with core.info rather than as a warning annotation. The throw sits above the try block, so it is caught by the action rather than by the toolkit, and logWarning routes it to core.info. What this error means Every run installs from scratch and every run is successful. There is no red step, no annotation in the run summary, and the restore step near the top of the job reports a miss in the ordinary way that a first run would. The only evidence is one line inside the collapsed post step at the very bottom, which says that the paths specified for caching do not exist and that no cache is being saved. Because it is not an annotation, it does not appear in the run summary, it does not show in the job list, and searching the repository for failed runs will never surface it. ```Reconstructed: the message is thrown by @actions/cache saveCache and the [warning] prefix is added by logWarning in actions/cache v6.1.0. Not captured from a run [warning]Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.
Common causes
The directory is created by a step that did not run
A cache step wraps a build that was skipped by an if:, or that lives in another job, or that failed earlier while the workflow carried on. The post step then runs against a workspace where the directory was never created, matches nothing, and says so quietly.
The tool writes somewhere other than where you cached
Package manager store locations move between versions and between operating systems. Caching a hard-coded home-relative path on a Windows runner, or a Linux default on macOS, gives a path that is correct in general and absent on this runner. Asking the tool for its own path is the durable fix.
A later step deleted or moved the directory
A cleanup step, a container that mounted over the location, or a build that relocates its output between phases can all leave the path empty by the time the post step runs. The post step is the last thing in the job, so it sees the end state and not the state the cache step was written for.
The path input resolved to an empty string
An expression that produced nothing, or a multi-line input where the only line was a comment, leaves the action with no patterns at all. This is the second message rather than the first, and it is worth reading which one you have before changing anything.
How to fix it
Find the line before you change the path
- Open a run and expand the last step, named Post followed by your cache step name.
- Look for a line starting
[warning]Path Validation Error; it is plain output, not an annotation. - If the line names paths not existing, the directory was absent at the end of the job.
- If it says at least one path is required, the
pathinput itself was empty and the expression that builds it is the bug.
Ask the tool where its cache is
Hard-coded store paths are the most common cause of a path that exists on one runner and not another. Resolve it at run time and feed it into the cache step, which keeps working across matrix operating systems and across tool upgrades.
.github/workflows/ci.yml (illustrative)
- id: pip
run: echo "dir=$(pip cache dir)" >> "$GITHUB_OUTPUT"
- uses: actions/cache@v6
with:
path: ${{ steps.pip.outputs.dir }}
key: pip-${{ runner.os }}-${{ hashFiles('**/requirements*.txt') }}
Make the absence loud The action will not fail for you, so add the check yourself while you are settling this. One line at the end of the job turns a silent miss into a red step that names the directory, and it costs nothing once the path is right..github/workflows/ci.yml (illustrative) name: Assert the cache path exists if...

Powered by Readybot.io