Create toolchains.xml dynamically based on envs

This commit is contained in:
hfhbd 2024-04-09 20:39:16 +02:00 committed by daz
parent 6832731061
commit 99b05e0979
No known key found for this signature in database
4 changed files with 115 additions and 54 deletions

View File

@ -7,8 +7,9 @@ import fs from 'fs'
import {generateCacheKey} from './cache-key' import {generateCacheKey} from './cache-key'
import {CacheListener} from './cache-reporting' import {CacheListener} from './cache-reporting'
import {saveCache, restoreCache, cacheDebug, isCacheDebuggingEnabled, tryDelete} from './cache-utils' import {saveCache, restoreCache, cacheDebug, isCacheDebuggingEnabled, tryDelete} from './cache-utils'
import {GradleHomeEntryExtractor, ConfigurationCacheEntryExtractor} from './gradle-home-extry-extractor'
import {CacheConfig} from '../configuration' import {CacheConfig} from '../configuration'
import {GradleHomeEntryExtractor, ConfigurationCacheEntryExtractor} from './gradle-home-extry-extractor'
import {getPredefinedToolchains, readResourceFileAsString} from './gradle-user-home-utils'
const RESTORED_CACHE_KEY_KEY = 'restored-cache-key' const RESTORED_CACHE_KEY_KEY = 'restored-cache-key'
@ -211,14 +212,16 @@ export class GradleUserHomeCache {
'gradle-actions.inject-develocity.init.gradle' 'gradle-actions.inject-develocity.init.gradle'
] ]
for (const initScriptFilename of initScriptFilenames) { for (const initScriptFilename of initScriptFilenames) {
const initScriptContent = this.readResourceFileAsString('init-scripts', initScriptFilename) const initScriptContent = readResourceFileAsString('init-scripts', initScriptFilename)
const initScriptPath = path.resolve(initScriptsDir, initScriptFilename) const initScriptPath = path.resolve(initScriptsDir, initScriptFilename)
fs.writeFileSync(initScriptPath, initScriptContent) fs.writeFileSync(initScriptPath, initScriptContent)
} }
} }
private registerToolchains(): void { 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 m2dir = path.resolve(this.userHome, '.m2')
const toolchainXmlTarget = path.resolve(m2dir, 'toolchains.xml') const toolchainXmlTarget = path.resolve(m2dir, 'toolchains.xml')
if (!fs.existsSync(toolchainXmlTarget)) { 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. * 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 * see https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging

View File

@ -0,0 +1,44 @@
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 = `<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<!-- JDK Toolchains installed by default on GitHub-hosted runners -->
`
for (const javaHomeEnv of javaHomeEnvs) {
const version = javaHomeEnv.match(/JAVA_HOME_(\d+)_/)?.[1]!
toolchainsXml += ` <toolchain>
<type>jdk</type>
<provides>
<version>${version}</version>
</provides>
<configuration>
<jdkHome>\${env.${javaHomeEnv}}</jdkHome>
</configuration>
</toolchain>\n`
}
toolchainsXml += `</toolchains>\n`
return toolchainsXml
}

View File

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<!-- JDK Toolchains installed by default on GitHub-hosted runners -->
<toolchain>
<type>jdk</type>
<provides>
<version>8</version>
<vendor>Eclipse Temurin</vendor>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_8_X64}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>Eclipse Temurin</vendor>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_11_X64}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>17</version>
<vendor>Eclipse Temurin</vendor>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_17_X64}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>21</version>
<vendor>Eclipse Temurin</vendor>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_21_X64}</jdkHome>
</configuration>
</toolchain>
</toolchains>

View File

@ -0,0 +1,65 @@
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 = {
"JAVA_HOME": "/jdks/foo_8"
}
const predefinedToolchains = getPredefinedToolchains()
expect(predefinedToolchains).toBe(null)
})
it('valid toolchains.xml if JAVA_HOME_ envs are set', async () => {
jest.resetModules()
process.env = {
"JAVA_HOME": "/jdks/foo_8",
"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
`<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<!-- JDK Toolchains installed by default on GitHub-hosted runners -->
<toolchain>
<type>jdk</type>
<provides>
<version>8</version>
</provides>
<configuration>
<jdkHome>\${env.JAVA_HOME_8_X64}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
</provides>
<configuration>
<jdkHome>\${env.JAVA_HOME_11_X64}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>21</version>
</provides>
<configuration>
<jdkHome>\${env.JAVA_HOME_21_ARM64}</jdkHome>
</configuration>
</toolchain>
</toolchains>
`)
})
})
})