Introduction
Gradle cache restore failures in GitHub Actions usually do not mean caching is broken globally. They mean the workflow is expecting a cache hit that the current key strategy, file layout, or cache backend cannot provide. This often happens after switching between setup-java cache support and manual cache blocks, changing wrapper files, or assuming local Gradle cache structure maps neatly onto CI.
Symptoms
setup-javalogs warn that the Gradle cache was not restored- Builds redownload dependencies even though caching is enabled
- Cache behavior changes after wrapper or dependency file edits
- Some branches restore caches reliably while others always miss
Common Causes
setup-javacaching and manualactions/cacheusage conflict conceptually or duplicate effort- Gradle wrapper or dependency metadata changes invalidate the cache key frequently
- The workflow expects cache hits across contexts that do not share the same key inputs
- Cache paths are incorrect or too broad for the intended Gradle data
Step-by-Step Fix
- 1.Use one Gradle cache strategy consistently
- 2.Prefer either
setup-javabuilt-in caching or an intentionally designed manual cache, not an accidental mix of both.
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
cache: gradle- 1.Confirm the key inputs that invalidate the cache
- 2.Wrapper changes and dependency descriptor changes will legitimately bust the cache. That is healthy if understood, but confusing if unexpected.
- 3.Keep Gradle-specific setup explicit
- 4.If you need extra Gradle optimization, use the Gradle action intentionally rather than adding unrelated cache paths ad hoc.
- uses: gradle/actions/setup-gradle@v3- 1.Measure whether the cache miss is actually harmful
- 2.Not every miss is a bug. The real problem is repeated expensive misses on unchanged dependency sets.
Prevention
- Pick one Gradle cache approach and document it in the workflow
- Avoid hand-built cache paths unless the built-in cache cannot satisfy the use case
- Expect legitimate cache invalidation after wrapper or dependency graph changes
- Watch build duration trends instead of assuming every cache miss needs a redesign