From 391f48b965b627d941a9179201307dbab58b2896 Mon Sep 17 00:00:00 2001 From: Julien Dubois Date: Thu, 6 Aug 2026 10:14:01 +0200 Subject: [PATCH] Include gradle.properties in Gradle cache key Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- README.md | 2 +- __tests__/cache.test.ts | 45 ++++++++++++++++++++++++++++++++------- dist/cleanup/377.index.js | 1 + dist/setup/377.index.js | 1 + src/cache.ts | 1 + 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 619e62e1d..0f1d0f209 100644 --- a/README.md +++ b/README.md @@ -274,7 +274,7 @@ The primary dependency cache key is `setup-java--- { await expect(restore('gradle', '')).rejects.toThrow( `No file in ${projectRoot( workspace - )} matched to [**/*.gradle*,**/gradle-wrapper.properties,buildSrc/**/Versions.kt,buildSrc/**/Dependencies.kt,gradle/*.versions.toml,**/versions.properties], make sure you have checked out the target repository` + )} matched to [**/*.gradle*,**/gradle.properties,**/gradle-wrapper.properties,buildSrc/**/Versions.kt,buildSrc/**/Dependencies.kt,gradle/*.versions.toml,**/versions.properties], make sure you have checked out the target repository` ); }); it('downloads cache based on build.gradle', async () => { @@ -351,7 +352,7 @@ describe('dependency cache', () => { await restore('gradle', ''); expect(spyCacheRestore).toHaveBeenCalled(); expect(spyGlobHashFiles).toHaveBeenCalledWith( - '**/*.gradle*\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' + '**/*.gradle*\n**/gradle.properties\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' ); expect(spyWarning).not.toHaveBeenCalled(); expect(spyInfo).toHaveBeenCalledWith('gradle cache is not found'); @@ -362,7 +363,7 @@ describe('dependency cache', () => { await restore('gradle', ''); expect(spyCacheRestore).toHaveBeenCalled(); expect(spyGlobHashFiles).toHaveBeenCalledWith( - '**/*.gradle*\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' + '**/*.gradle*\n**/gradle.properties\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' ); expect(spyWarning).not.toHaveBeenCalled(); expect(spyInfo).toHaveBeenCalledWith('gradle cache is not found'); @@ -374,7 +375,7 @@ describe('dependency cache', () => { await restore('gradle', ''); expect(spyCacheRestore).toHaveBeenCalled(); expect(spyGlobHashFiles).toHaveBeenCalledWith( - '**/*.gradle*\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' + '**/*.gradle*\n**/gradle.properties\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' ); expect(spyWarning).not.toHaveBeenCalled(); expect(spyInfo).toHaveBeenCalledWith('gradle cache is not found'); @@ -386,11 +387,39 @@ describe('dependency cache', () => { await restore('gradle', ''); expect(spyCacheRestore).toHaveBeenCalled(); expect(spyGlobHashFiles).toHaveBeenCalledWith( - '**/*.gradle*\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' + '**/*.gradle*\n**/gradle.properties\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' ); expect(spyWarning).not.toHaveBeenCalled(); expect(spyInfo).toHaveBeenCalledWith('gradle cache is not found'); }); + it('changes the cache key when gradle.properties changes', async () => { + const buildFile = join(workspace, 'build.gradle'); + const propertiesFile = join(workspace, 'gradle.properties'); + createFile(buildFile); + createFile(propertiesFile, 'dependencyVersion=1.0.0'); + spyGlobHashFiles.mockImplementation(async (pattern: string) => { + if (pattern === '**/gradle-wrapper.properties') { + return ''; + } + + const files = [buildFile]; + if (pattern.split('\n').includes('**/gradle.properties')) { + files.push(propertiesFile); + } + const hash = createHash('sha256'); + files.forEach(file => hash.update(fs.readFileSync(file))); + return hash.digest('hex'); + }); + + await restore('gradle', ''); + const firstKey = spyCacheRestore.mock.calls[0][1]; + + fs.writeFileSync(propertiesFile, 'dependencyVersion=2.0.0'); + await restore('gradle', ''); + const secondKey = spyCacheRestore.mock.calls[1][1]; + + expect(secondKey).not.toBe(firstKey); + }); it('restores the gradle wrapper distribution cache independently of the main cache', async () => { createFile(join(workspace, 'build.gradle')); @@ -529,7 +558,7 @@ describe('dependency cache', () => { await restore('gradle', ''); expect(spyCacheRestore).toHaveBeenCalled(); expect(spyGlobHashFiles).toHaveBeenCalledWith( - '**/*.gradle*\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' + '**/*.gradle*\n**/gradle.properties\n**/gradle-wrapper.properties\nbuildSrc/**/Versions.kt\nbuildSrc/**/Dependencies.kt\ngradle/*.versions.toml\n**/versions.properties' ); expect(spyWarning).not.toHaveBeenCalled(); expect(spyInfo).toHaveBeenCalledWith('gradle cache is not found'); @@ -1027,9 +1056,9 @@ function createStateForSuccessfulRestore() { }); } -function createFile(path: string) { +function createFile(path: string, contents = '') { core.info(`created a file at ${path}`); - fs.writeFileSync(path, ''); + fs.writeFileSync(path, contents); } function deferred() { diff --git a/dist/cleanup/377.index.js b/dist/cleanup/377.index.js index 27392263d..b6de55952 100644 --- a/dist/cleanup/377.index.js +++ b/dist/cleanup/377.index.js @@ -56,6 +56,7 @@ const supportedPackageManager = [ // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle pattern: [ '**/*.gradle*', + '**/gradle.properties', '**/gradle-wrapper.properties', 'buildSrc/**/Versions.kt', 'buildSrc/**/Dependencies.kt', diff --git a/dist/setup/377.index.js b/dist/setup/377.index.js index 42a360536..743d977dd 100644 --- a/dist/setup/377.index.js +++ b/dist/setup/377.index.js @@ -56,6 +56,7 @@ const supportedPackageManager = [ // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle pattern: [ '**/*.gradle*', + '**/gradle.properties', '**/gradle-wrapper.properties', 'buildSrc/**/Versions.kt', 'buildSrc/**/Dependencies.kt', diff --git a/src/cache.ts b/src/cache.ts index 27ad4d5b0..a73fb44a8 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -82,6 +82,7 @@ const supportedPackageManager: PackageManager[] = [ // https://github.com/actions/cache/blob/0638051e9af2c23d10bb70fa9beffcad6cff9ce3/examples.md#java---gradle pattern: [ '**/*.gradle*', + '**/gradle.properties', '**/gradle-wrapper.properties', 'buildSrc/**/Versions.kt', 'buildSrc/**/Dependencies.kt',