mirror of
https://github.com/gradle/actions.git
synced 2026-04-19 18:12:58 +08: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>
102 lines
4.2 KiB
TypeScript
102 lines
4.2 KiB
TypeScript
import * as fs from 'fs'
|
|
import * as path from 'path'
|
|
import {pathToFileURL} from 'url'
|
|
|
|
import {CacheConfig, CacheProvider} from './configuration'
|
|
import {BasicCacheService} from './cache-service-basic'
|
|
import {BuildResult} from './build-results'
|
|
import {CacheOptions, CacheService} from './cache-service'
|
|
|
|
const NOOP_CACHING_REPORT = `
|
|
[Cache was disabled](https://github.com/gradle/actions/blob/main/docs/setup-gradle.md#disabling-caching). Gradle User Home was not restored from or saved to the cache.
|
|
`
|
|
|
|
const ENHANCED_CACHE_MESSAGE = `Enhanced Caching: This build is using the proprietary 'gradle-actions-caching' provider for optimized caching support. See https://github.com/gradle/actions/blob/main/DISTRIBUTION.md for terms of use and opt-out instructions.`
|
|
|
|
const ENHANCED_CACHE_SUMMARY = `
|
|
> [!NOTE]
|
|
> ### ⚡️ Enhanced Caching enabled
|
|
> This build provides optimized caching support via the proprietary **gradle-actions-caching** provider.
|
|
> See [DISTRIBUTION.md](https://github.com/gradle/actions/blob/main/DISTRIBUTION.md) for terms of use and opt-out instructions.
|
|
`
|
|
|
|
const BASIC_CACHE_MESSAGE = `Basic Caching: This build uses the open-source caching provider for reliable, path-based caching of Gradle dependencies. Upgrade available: for faster builds and advanced features, consider switching to the Enhanced Caching provider. See https://github.com/gradle/actions/blob/main/DISTRIBUTION.md for details.`
|
|
|
|
const BASIC_CACHE_SUMMARY = `
|
|
> [!NOTE]
|
|
> ### 🛡️ Basic Caching enabled
|
|
> This build uses the open-source caching provider for reliable, path-based caching of Gradle dependencies.
|
|
>
|
|
> **Upgrade Available:** For faster builds and advanced features, consider switching to the **Enhanced Caching** provider.
|
|
> See [DISTRIBUTION.md](https://github.com/gradle/actions/blob/main/DISTRIBUTION.md) for details.`
|
|
|
|
class NoOpCacheService implements CacheService {
|
|
async restore(_gradleUserHome: string, _cacheOptions: CacheOptions): Promise<void> {
|
|
return
|
|
}
|
|
|
|
async save(_gradleUserHome: string, _buildResults: BuildResult[], _cacheOptions: CacheOptions): Promise<string> {
|
|
return NOOP_CACHING_REPORT
|
|
}
|
|
}
|
|
|
|
class LicenseWarningCacheService implements CacheService {
|
|
private delegate: CacheService
|
|
private summary: string
|
|
|
|
constructor(delegate: CacheService, summary: string) {
|
|
this.delegate = delegate
|
|
this.summary = summary
|
|
}
|
|
|
|
async restore(gradleUserHome: string, cacheOptions: CacheOptions): Promise<void> {
|
|
await this.delegate.restore(gradleUserHome, cacheOptions)
|
|
}
|
|
|
|
async save(gradleUserHome: string, buildResults: BuildResult[], cacheOptions: CacheOptions): Promise<string> {
|
|
const cachingReport = await this.delegate.save(gradleUserHome, buildResults, cacheOptions)
|
|
return `${cachingReport}\n${this.summary}`
|
|
}
|
|
}
|
|
|
|
export async function getCacheService(cacheConfig: CacheConfig): Promise<CacheService> {
|
|
if (cacheConfig.isCacheDisabled()) {
|
|
logCacheMessage('Cache is disabled: will not restore state from previous builds.')
|
|
return new NoOpCacheService()
|
|
}
|
|
|
|
if (cacheConfig.getCacheProvider() === CacheProvider.Basic) {
|
|
logCacheMessage(BASIC_CACHE_MESSAGE)
|
|
return new LicenseWarningCacheService(new BasicCacheService(), BASIC_CACHE_SUMMARY)
|
|
}
|
|
|
|
logCacheMessage(ENHANCED_CACHE_MESSAGE)
|
|
const cacheService = await loadVendoredCacheService()
|
|
if (cacheConfig.isCacheLicenseAccepted()) {
|
|
return cacheService
|
|
}
|
|
|
|
return new LicenseWarningCacheService(cacheService, ENHANCED_CACHE_SUMMARY)
|
|
}
|
|
|
|
export async function loadVendoredCacheService(): Promise<CacheService> {
|
|
const vendoredLibraryPath = findVendoredLibraryPath()
|
|
const moduleUrl = pathToFileURL(vendoredLibraryPath).href
|
|
return (await import(moduleUrl)) as CacheService
|
|
}
|
|
|
|
function findVendoredLibraryPath(): string {
|
|
const moduleDir = import.meta.dirname
|
|
const absolutePath = path.resolve(moduleDir, '../../../sources/vendor/gradle-actions-caching/index.js')
|
|
|
|
if (fs.existsSync(absolutePath)) {
|
|
return absolutePath
|
|
}
|
|
|
|
throw new Error(`Unable to locate vendored cache library at ${absolutePath}.`)
|
|
}
|
|
|
|
export function logCacheMessage(message: string): void {
|
|
console.info(message)
|
|
}
|