GitHub Actions "No files were found with the provided path"
upload-artifact resolved its path against the workspace and found zero matching files, so it warns (or errors with if-no-files-found: error) and uploads nothing, usually a wrong or premature path.
What this error means
The upload step warns "No files were found with the provided path: <path>. No artifacts will be uploaded." Downstream downloads then find nothing.
Warning: 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 not where expected
The build wrote to a different directory than the upload path, or the build step failed before producing output.
Wrong working directory or glob
The path is relative to the wrong directory, or the glob does not match the actual filenames.
How to fix it
Point the path at real output
- List the directory before upload to confirm files exist.
- Make the path relative to the correct working directory.
- Set if-no-files-found: error to fail fast on an empty match.
- 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
- Verify build output exists before uploading.
- Use if-no-files-found: error to catch empty uploads.
- Keep upload paths in sync with build output dirs.