diff --git a/sources/src/caching/gradle-user-home-cache.ts b/sources/src/caching/gradle-user-home-cache.ts index 180e19b..b0c47bb 100644 --- a/sources/src/caching/gradle-user-home-cache.ts +++ b/sources/src/caching/gradle-user-home-cache.ts @@ -9,6 +9,7 @@ import {CacheListener} from './cache-reporting' import {saveCache, restoreCache, cacheDebug, isCacheDebuggingEnabled, tryDelete} from './cache-utils' import {GradleHomeEntryExtractor, ConfigurationCacheEntryExtractor} from './gradle-home-extry-extractor' import {CacheConfig} from '../input-params' +import {getPredefinedToolchains, readResourceFileAsString} from './gradle-user-home-utils' const RESTORED_CACHE_KEY_KEY = 'restored-cache-key' @@ -211,14 +212,16 @@ export class GradleUserHomeCache { 'gradle-actions.inject-develocity.init.gradle' ] for (const initScriptFilename of initScriptFilenames) { - const initScriptContent = this.readResourceFileAsString('init-scripts', initScriptFilename) + const initScriptContent = readResourceFileAsString('init-scripts', initScriptFilename) const initScriptPath = path.resolve(initScriptsDir, initScriptFilename) fs.writeFileSync(initScriptPath, initScriptContent) } } private registerToolchains(): void { - const preInstalledToolchains = this.readResourceFileAsString('toolchains.xml') + const preInstalledToolchains: string | null = getPredefinedToolchains() + if (preInstalledToolchains == null) return + const m2dir = path.resolve(this.userHome, '.m2') const toolchainXmlTarget = path.resolve(m2dir, 'toolchains.xml') if (!fs.existsSync(toolchainXmlTarget)) { @@ -238,13 +241,6 @@ export class GradleUserHomeCache { } } - // TODO:DAZ Move this to a utility class - private readResourceFileAsString(...paths: string[]): string { - // Resolving relative to __dirname will allow node to find the resource at runtime - const absolutePath = path.resolve(__dirname, '..', '..', '..', 'sources', 'src', 'resources', ...paths) - return fs.readFileSync(absolutePath, 'utf8') - } - /** * When the GitHub environment ACTIONS_RUNNER_DEBUG is true, run Gradle with --info and --stacktrace. * see https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging diff --git a/sources/src/caching/gradle-user-home-utils.ts b/sources/src/caching/gradle-user-home-utils.ts new file mode 100644 index 0000000..7032678 --- /dev/null +++ b/sources/src/caching/gradle-user-home-utils.ts @@ -0,0 +1,43 @@ +import path from 'path' +import fs from 'fs' + +export function readResourceFileAsString(...paths: string[]): string { + // Resolving relative to __dirname will allow node to find the resource at runtime + const absolutePath = path.resolve(__dirname, '..', '..', '..', 'sources', 'src', 'resources', ...paths) + return fs.readFileSync(absolutePath, 'utf8') +} + +/** + * Iterate over all `JAVA_HOME_{version}_{arch}` envs and construct the toolchain.xml. + * + * @VisibleForTesting + */ +export function getPredefinedToolchains(): string | null { + const javaHomeEnvs: string[] = [] + for (const javaHomeEnvsKey in process.env) { + if (javaHomeEnvsKey.startsWith('JAVA_HOME_')) { + javaHomeEnvs.push(javaHomeEnvsKey) + } + } + if (javaHomeEnvs.length === 0) { + return null + } + // language=XML + let toolchainsXml = ` + + +` + for (const javaHomeEnv of javaHomeEnvs) { + const version = javaHomeEnv.match(/JAVA_HOME_(\d+)_/)?.[1]! + toolchainsXml += ` + + ${version} + + + \${env.${javaHomeEnv} + + \n` + } + toolchainsXml += `\n` + return toolchainsXml +} diff --git a/sources/src/resources/toolchains.xml b/sources/src/resources/toolchains.xml deleted file mode 100644 index f9ba374..0000000 --- a/sources/src/resources/toolchains.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - jdk - - 8 - Eclipse Temurin - - - ${env.JAVA_HOME_8_X64} - - - - jdk - - 11 - Eclipse Temurin - - - ${env.JAVA_HOME_11_X64} - - - - jdk - - 17 - Eclipse Temurin - - - ${env.JAVA_HOME_17_X64} - - - - jdk - - 21 - Eclipse Temurin - - - ${env.JAVA_HOME_21_X64} - - - diff --git a/sources/test/jest/predefined-toolchains.test.ts b/sources/test/jest/predefined-toolchains.test.ts new file mode 100644 index 0000000..621b25d --- /dev/null +++ b/sources/test/jest/predefined-toolchains.test.ts @@ -0,0 +1,60 @@ +import {getPredefinedToolchains} from "../../src/caching/gradle-user-home-utils"; + +describe('predefined-toolchains', () => { + const OLD_ENV = process.env + afterAll(() => { + process.env = OLD_ENV + }); + + describe('returns', () => { + it('null if no JAVA_HOME_ envs are set', async () => { + jest.resetModules() + process.env = { ...OLD_ENV } + + const predefinedToolchains = getPredefinedToolchains() + expect(predefinedToolchains).toBe(null) + }) + it('valid toolchains.xml if JAVA_HOME_ envs are set', async () => { + jest.resetModules() + process.env = { + ...OLD_ENV, + "JAVA_HOME_8_X64": "/jdks/foo_8", + "JAVA_HOME_11_X64": "/jdks/foo_11", + "JAVA_HOME_21_ARM64": "/jdks/foo_21", + } + + const predefinedToolchains = getPredefinedToolchains() + expect(predefinedToolchains).toBe( + // language=XML +` + + + + + 8 + + + \${env.JAVA_HOME_8_X64 + + + + + 11 + + + \${env.JAVA_HOME_11_X64 + + + + + 21 + + + \${env.JAVA_HOME_21_ARM64 + + + +`) + }) + }) +})