From d885df93e3c5eef05d2c15bf602be9906fd96bad Mon Sep 17 00:00:00 2001 From: Daz DeBoer Date: Sat, 13 Jun 2026 16:38:49 -0600 Subject: [PATCH] Thread Develocity trial credentials into the save-path cache options Supplies develocityAccessToken / develocityServerUrl to the gated project-entry caching feature, on the save path only. Restore stays ungated, so it keeps passing no DevelocityConfig and the credentials remain undefined. - cacheOptionsFrom gains an optional develocityConfig; when present it sets develocityServerUrl from getDevelocityUrl() and resolves develocityAccessToken via resolveAccessKeyForServer (fail-closed when the URL or matching key is absent). - complete() takes a DevelocityConfig and passes it through to cacheOptionsFrom at the save call; setup()/restore continues to call cacheOptionsFrom with no DevelocityConfig. - Both post actions (setup-gradle, dependency-submission) pass new DevelocityConfig() to complete(). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/actions/dependency-submission/post.ts | 4 ++-- sources/src/actions/setup-gradle/post.ts | 4 ++-- sources/src/setup-gradle.ts | 24 ++++++++++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/sources/src/actions/dependency-submission/post.ts b/sources/src/actions/dependency-submission/post.ts index f47f2983..4138f26a 100644 --- a/sources/src/actions/dependency-submission/post.ts +++ b/sources/src/actions/dependency-submission/post.ts @@ -1,6 +1,6 @@ import * as setupGradle from '../../setup-gradle' -import {CacheConfig, SummaryConfig} from '../../configuration' +import {CacheConfig, DevelocityConfig, SummaryConfig} from '../../configuration' import {handlePostActionError} from '../../errors' import {forceExit} from '../../force-exit' @@ -14,7 +14,7 @@ process.on('uncaughtException', e => handlePostActionError(e)) */ export async function run(): Promise { try { - await setupGradle.complete(new CacheConfig(), new SummaryConfig()) + await setupGradle.complete(new CacheConfig(), new DevelocityConfig(), new SummaryConfig()) } catch (error) { handlePostActionError(error) } diff --git a/sources/src/actions/setup-gradle/post.ts b/sources/src/actions/setup-gradle/post.ts index 17870d97..734a426f 100644 --- a/sources/src/actions/setup-gradle/post.ts +++ b/sources/src/actions/setup-gradle/post.ts @@ -1,7 +1,7 @@ import * as setupGradle from '../../setup-gradle' import * as dependencyGraph from '../../dependency-graph' -import {CacheConfig, DependencyGraphConfig, SummaryConfig} from '../../configuration' +import {CacheConfig, DependencyGraphConfig, DevelocityConfig, SummaryConfig} from '../../configuration' import {handlePostActionError} from '../../errors' import {emitDeprecationWarnings, restoreDeprecationState} from '../../deprecation-collector' import {forceExit} from '../../force-exit' @@ -19,7 +19,7 @@ export async function run(): Promise { restoreDeprecationState() emitDeprecationWarnings() - if (await setupGradle.complete(new CacheConfig(), new SummaryConfig())) { + if (await setupGradle.complete(new CacheConfig(), new DevelocityConfig(), new SummaryConfig())) { // Only submit the dependency graphs once per job await dependencyGraph.complete(new DependencyGraphConfig()) } diff --git a/sources/src/setup-gradle.ts b/sources/src/setup-gradle.ts index b42d54e1..34eef073 100644 --- a/sources/src/setup-gradle.ts +++ b/sources/src/setup-gradle.ts @@ -5,6 +5,7 @@ import * as path from 'path' import * as os from 'os' import * as jobSummary from './job-summary' import * as buildScan from './develocity/build-scan' +import {resolveAccessKeyForServer} from './develocity/short-lived-token' import {loadBuildResults, markBuildResultsProcessed} from './build-results' import {getCacheService, getProviderNote} from './cache-service-loader' @@ -54,7 +55,11 @@ export async function setup( return true } -export async function complete(cacheConfig: CacheConfig, summaryConfig: SummaryConfig): Promise { +export async function complete( + cacheConfig: CacheConfig, + develocityConfig: DevelocityConfig, + summaryConfig: SummaryConfig +): Promise { if (!core.getState(GRADLE_SETUP_VAR)) { core.info('Gradle setup post-action only performed for first gradle/actions step in workflow.') return false @@ -65,7 +70,11 @@ export async function complete(cacheConfig: CacheConfig, summaryConfig: SummaryC const gradleUserHome = core.getState(GRADLE_USER_HOME) const cacheService = await getCacheService(cacheConfig) - const cacheReport = await cacheService.save(gradleUserHome, buildResults, cacheOptionsFrom(cacheConfig)) + const cacheReport = await cacheService.save( + gradleUserHome, + buildResults, + cacheOptionsFrom(cacheConfig, develocityConfig) + ) await jobSummary.generateJobSummary(buildResults, cacheReport, getProviderNote(cacheConfig), summaryConfig) markBuildResultsProcessed() @@ -75,7 +84,14 @@ export async function complete(cacheConfig: CacheConfig, summaryConfig: SummaryC return true } -function cacheOptionsFrom(config: CacheConfig): CacheOptions { +function cacheOptionsFrom(config: CacheConfig, develocityConfig?: DevelocityConfig): CacheOptions { + // Trial credentials are threaded only on the save path (when develocityConfig is provided). + // On restore they stay undefined, which is fine: project-entry restore is ungated. + const develocityServerUrl = develocityConfig?.getDevelocityUrl() || undefined + const develocityAccessToken = + develocityConfig && develocityServerUrl + ? resolveAccessKeyForServer(develocityConfig.getDevelocityAccessKey(), develocityServerUrl) + : undefined return { disabled: config.isCacheDisabled(), readOnly: config.isCacheReadOnly(), @@ -84,6 +100,8 @@ function cacheOptionsFrom(config: CacheConfig): CacheOptions { strictMatch: config.isCacheStrictMatch(), cleanup: config.getCacheCleanupOption(), encryptionKey: config.getCacheEncryptionKey() || undefined, + develocityAccessToken, + develocityServerUrl, includes: config.getCacheIncludes(), excludes: config.getCacheExcludes() }