mirror of
https://github.com/gradle/actions.git
synced 2026-06-01 09:31:59 +00:00
ff9ae24c39
## Summary
- **New `basic` cache provider**: Adds an open-source (MIT-licensed)
caching implementation built on `@actions/cache` as an alternative to
the proprietary Enhanced Caching. Users can opt in with `cache-provider:
basic` on both `setup-gradle` and `dependency-submission` actions.
- **Revamped licensing & distribution docs**: Replaces the verbose
licensing notice block (previously shown in README, docs, and logs) with
a friendlier callout and a new dedicated
[DISTRIBUTION.md](./DISTRIBUTION.md) covering component licensing, usage
tiers, data privacy ("Safe Harbor"), and opt-out instructions.
- **Improved messaging**: Enhanced Caching and Basic Caching each
display concise, informative log messages and job summary notes instead
of the previous wall-of-text license warning.
- **New integration tests**: Adds `integ-test-basic-cache-provider.yml`
workflow that seeds and verifies the basic cache provider across
platforms, plus unit tests for `BasicCacheService` and `getCacheService`
selection logic.
- **CI workflow reorganization**: Dependency-submission integration
tests extracted into their own reusable suite
(`suite-integ-test-dependency-submission.yml`); sample project tests
moved into the caching suite.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
86 lines
3.4 KiB
TypeScript
86 lines
3.4 KiB
TypeScript
import * as cache from '@actions/cache'
|
|
import * as core from '@actions/core'
|
|
import * as glob from '@actions/glob'
|
|
import * as path from 'path'
|
|
|
|
import {BuildResult} from './build-results'
|
|
import {CacheOptions, CacheService} from './cache-service'
|
|
|
|
const PRIMARY_KEY_STATE = 'BASIC_CACHE_PRIMARY_KEY'
|
|
const RESTORED_KEY_STATE = 'BASIC_CACHE_RESTORED_KEY'
|
|
const CACHE_KEY_PREFIX = 'setup-java'
|
|
|
|
const GRADLE_BUILD_FILE_PATTERNS = [
|
|
'**/*.gradle*',
|
|
'**/gradle-wrapper.properties',
|
|
'buildSrc/**/Versions.kt',
|
|
'buildSrc/**/Dependencies.kt',
|
|
'gradle/*.versions.toml',
|
|
'**/versions.properties'
|
|
]
|
|
|
|
export class BasicCacheService implements CacheService {
|
|
async restore(gradleUserHome: string, _cacheOptions: CacheOptions): Promise<void> {
|
|
const cachePaths = getCachePaths(gradleUserHome)
|
|
const primaryKey = await computeCacheKey()
|
|
core.saveState(PRIMARY_KEY_STATE, primaryKey)
|
|
|
|
// No "restoreKeys" is set, to start with a clear cache after dependency update
|
|
// See https://github.com/actions/setup-java/issues/269
|
|
try {
|
|
const restoredKey = await cache.restoreCache(cachePaths, primaryKey)
|
|
if (restoredKey) {
|
|
core.saveState(RESTORED_KEY_STATE, restoredKey)
|
|
core.info(`Basic caching restored from cache key: ${restoredKey}`)
|
|
} else {
|
|
core.info('Basic caching did not find an entry to restore. Will start with empty state.')
|
|
}
|
|
} catch (error) {
|
|
core.warning(`Basic caching failed to restore from cache: ${error}`)
|
|
}
|
|
}
|
|
|
|
async save(gradleUserHome: string, _buildResults: BuildResult[], cacheOptions: CacheOptions): Promise<string> {
|
|
if (cacheOptions.readOnly) {
|
|
const restoredKey = core.getState(RESTORED_KEY_STATE)
|
|
if (restoredKey) {
|
|
return `Basic caching was read-only. Restored from cache key \`${restoredKey}\`.`
|
|
}
|
|
return 'Basic caching was read-only. No cache entry was found to restore.'
|
|
}
|
|
|
|
const primaryKey = core.getState(PRIMARY_KEY_STATE)
|
|
const restoredKey = core.getState(RESTORED_KEY_STATE)
|
|
|
|
if (restoredKey === primaryKey) {
|
|
core.info(`Basic caching restored entry with key \`${primaryKey}\`. Save was skipped.`)
|
|
return `Basic caching restored entry with key \`${primaryKey}\`. Save was skipped.`
|
|
}
|
|
|
|
const cachePaths = getCachePaths(gradleUserHome)
|
|
|
|
try {
|
|
await cache.saveCache(cachePaths, primaryKey)
|
|
core.info(`Basic caching saved entry with key: ${primaryKey}`)
|
|
return `Basic caching saved entry with key \`${primaryKey}\`.`
|
|
} catch (error) {
|
|
core.warning(`Basic caching failed to save entry with key \`${primaryKey}\`: ${error}`)
|
|
return `Basic caching save failed: ${error}`
|
|
}
|
|
}
|
|
}
|
|
|
|
function getCachePaths(gradleUserHome: string): string[] {
|
|
return [path.join(gradleUserHome, 'caches'), path.join(gradleUserHome, 'wrapper')]
|
|
}
|
|
|
|
async function computeCacheKey(): Promise<string> {
|
|
const fileHash = await glob.hashFiles(GRADLE_BUILD_FILE_PATTERNS.join('\n'))
|
|
if (!fileHash) {
|
|
throw new Error(
|
|
`No file in ${process.cwd()} matched to [${GRADLE_BUILD_FILE_PATTERNS}], make sure you have checked out the target repository`
|
|
)
|
|
}
|
|
return `${CACHE_KEY_PREFIX}-${process.env['RUNNER_OS']}-${process.arch}-gradle-${fileHash}`
|
|
}
|