Instead of always installing and using the latest Gradle version for cache cleanup, we now require at least Gradle 8.9. This avoids downloading and installing Gradle if the version on PATH is sufficient to perform cache cleanup.
89 lines
3.0 KiB
TypeScript
89 lines
3.0 KiB
TypeScript
import * as core from '@actions/core'
|
|
import * as exec from '@actions/exec'
|
|
|
|
import fs from 'fs'
|
|
import path from 'path'
|
|
import * as provisioner from '../execution/provision'
|
|
|
|
export class CacheCleaner {
|
|
private readonly gradleUserHome: string
|
|
private readonly tmpDir: string
|
|
|
|
constructor(gradleUserHome: string, tmpDir: string) {
|
|
this.gradleUserHome = gradleUserHome
|
|
this.tmpDir = tmpDir
|
|
}
|
|
|
|
async prepare(): Promise<string> {
|
|
// Save the current timestamp
|
|
const timestamp = Date.now().toString()
|
|
core.saveState('clean-timestamp', timestamp)
|
|
return timestamp
|
|
}
|
|
|
|
async forceCleanup(): Promise<void> {
|
|
const cleanTimestamp = core.getState('clean-timestamp')
|
|
await this.forceCleanupFilesOlderThan(cleanTimestamp)
|
|
}
|
|
|
|
// Visible for testing
|
|
async forceCleanupFilesOlderThan(cleanTimestamp: string): Promise<void> {
|
|
// Run a dummy Gradle build to trigger cache cleanup
|
|
const cleanupProjectDir = path.resolve(this.tmpDir, 'dummy-cleanup-project')
|
|
fs.mkdirSync(cleanupProjectDir, {recursive: true})
|
|
fs.writeFileSync(
|
|
path.resolve(cleanupProjectDir, 'settings.gradle'),
|
|
'rootProject.name = "dummy-cleanup-project"'
|
|
)
|
|
fs.writeFileSync(
|
|
path.resolve(cleanupProjectDir, 'init.gradle'),
|
|
`
|
|
beforeSettings { settings ->
|
|
def cleanupTime = ${cleanTimestamp}
|
|
|
|
settings.caches {
|
|
cleanup = Cleanup.ALWAYS
|
|
|
|
releasedWrappers.removeUnusedEntriesOlderThan.set(cleanupTime)
|
|
snapshotWrappers.removeUnusedEntriesOlderThan.set(cleanupTime)
|
|
downloadedResources.removeUnusedEntriesOlderThan.set(cleanupTime)
|
|
createdResources.removeUnusedEntriesOlderThan.set(cleanupTime)
|
|
buildCache.removeUnusedEntriesOlderThan.set(cleanupTime)
|
|
}
|
|
}
|
|
`
|
|
)
|
|
fs.writeFileSync(path.resolve(cleanupProjectDir, 'build.gradle'), 'task("noop") {}')
|
|
|
|
// Gradle >= 8.9 required for cache cleanup
|
|
const executable = await provisioner.provisionGradleAtLeast('8.9')
|
|
|
|
await core.group('Executing Gradle to clean up caches', async () => {
|
|
core.info(`Cleaning up caches last used before ${cleanTimestamp}`)
|
|
await this.executeCleanupBuild(executable, cleanupProjectDir)
|
|
})
|
|
}
|
|
|
|
private async executeCleanupBuild(executable: string, cleanupProjectDir: string): Promise<void> {
|
|
const args = [
|
|
'-g',
|
|
this.gradleUserHome,
|
|
'-I',
|
|
'init.gradle',
|
|
'--info',
|
|
'--no-daemon',
|
|
'--no-scan',
|
|
'--build-cache',
|
|
'-DGITHUB_DEPENDENCY_GRAPH_ENABLED=false',
|
|
'noop'
|
|
]
|
|
|
|
const result = await exec.getExecOutput(executable, args, {
|
|
cwd: cleanupProjectDir,
|
|
silent: true
|
|
})
|
|
|
|
core.info(result.stdout)
|
|
}
|
|
}
|