GitHub Actions actions/upload-artifact "No files were found" (v4)
actions/upload-artifact@v4 resolves the path input as a glob relative to the workspace. When the glob matches no files - wrong directory, a build that did not run, or a typo - v4 errors (or warns) that nothing was found.
What this error means
An upload-artifact step reports that no files were found at the provided path, and downstream jobs have no artifact to download.
Error: No files were found with the provided path: dist/**. No artifacts will be uploaded.Diagnose it: was the cache hit, and was it the right one?
Cache bugs split into three shapes and they need different fixes: the cache never saved, it saved but the key never matches on restore, or it restored a stale entry through a restore-keys prefix and is now poisoning the build. The step output tells you which one you have.
- uses: actions/cache@v4
id: cache
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
- name: What happened
run: |
echo "exact hit: ${{ steps.cache.outputs.cache-hit }}"
echo "key used: ${{ steps.cache.outputs.cache-matched-key }}"Common causes
Build output missing or in another directory
The producing step failed, ran in a different working-directory, or wrote output to a path the glob does not cover.
Glob does not match
A trailing-slash, case, or relative-path mistake makes the pattern match nothing.
How to fix it
Point the path at the real output and fail loudly
- Confirm the build step produced files and where.
- Set path to the correct glob (relative to the workspace).
- Set if-no-files-found: error to fail fast instead of silently skipping.
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
if-no-files-found: errorCache limits that produce confusing failures
- Repository cache is capped at 10 GB. Past that, GitHub evicts least-recently-used entries, so a large cache can silently stop persisting.
- Caches are scoped by branch. A cache written on a feature branch is not visible to another feature branch, only to its base and its own descendants.
- An entry not read for 7 days is evicted, so a rarely-run workflow effectively never has a warm cache.
- Restoring a cache built for a different tool version is worse than a cold start, because you get a corrupted tree instead of a clean install. Always include the tool version in the key.
How to prevent it
- Set if-no-files-found: error so missing output fails the job.
- Verify the producing step ran in the expected working-directory.