setup-graalvm/src/liberica.ts

98 lines
3.4 KiB
TypeScript
Raw Normal View History

import * as c from './constants.js'
2024-02-20 17:14:10 +03:00
import * as semver from 'semver'
import { downloadExtractAndCacheJDK, getTaggedRelease, getMatchingTags } from './utils.js'
2025-02-10 09:16:33 +01:00
import { downloadTool } from '@actions/tool-cache'
import { spawnSync } from 'child_process'
2024-02-20 17:14:10 +03:00
const LIBERICA_GH_USER = 'bell-sw'
const LIBERICA_RELEASES_REPO = 'LibericaNIK'
const LIBERICA_JDK_TAG_PREFIX = 'jdk-'
const LIBERICA_VM_PREFIX = 'bellsoft-liberica-vm-'
2025-02-10 09:16:33 +01:00
export async function setUpLiberica(javaVersion: string, javaPackage: string): Promise<string> {
2024-02-20 17:14:10 +03:00
const resolvedJavaVersion = await findLatestLibericaJavaVersion(javaVersion)
const downloadUrl = await findLibericaURL(resolvedJavaVersion, javaPackage)
const toolName = determineToolName(javaVersion, javaPackage)
2025-02-10 09:16:33 +01:00
return downloadExtractAndCacheJDK(async () => downloadTool(downloadUrl), toolName, javaVersion)
2024-02-20 17:14:10 +03:00
}
2025-02-10 09:16:33 +01:00
export async function findLatestLibericaJavaVersion(javaVersion: string): Promise<string> {
2024-02-20 17:14:10 +03:00
const matchingRefs = await getMatchingTags(
LIBERICA_GH_USER,
LIBERICA_RELEASES_REPO,
`${LIBERICA_JDK_TAG_PREFIX}${javaVersion}`
)
const noMatch = '0.0.1'
let bestMatch = noMatch
const prefixLength = `refs/tags/${LIBERICA_JDK_TAG_PREFIX}`.length
const patternLength = javaVersion.length
for (const matchingRef of matchingRefs) {
const version = matchingRef.ref.substring(prefixLength)
if (
semver.valid(version) &&
// pattern '17.0.1' should match '17.0.1+12' but not '17.0.10'
2025-02-10 09:16:33 +01:00
(version.length <= patternLength || !isDigit(version.charAt(patternLength))) &&
2024-02-20 17:14:10 +03:00
semver.compareBuild(version, bestMatch) == 1
) {
bestMatch = version
}
}
if (bestMatch === noMatch) {
throw new Error(
`Unable to find the latest version for JDK${javaVersion}. Please make sure the java-version is set correctly. ${c.ERROR_HINT}`
)
}
return bestMatch
}
2025-02-10 09:16:33 +01:00
export async function findLibericaURL(javaVersion: string, javaPackage: string): Promise<string> {
2024-02-20 17:14:10 +03:00
const release = await getTaggedRelease(
LIBERICA_GH_USER,
LIBERICA_RELEASES_REPO,
LIBERICA_JDK_TAG_PREFIX + javaVersion
)
const platform = determinePlatformPart()
2025-02-10 09:16:33 +01:00
const assetPrefix = `${LIBERICA_VM_PREFIX}${determineVariantPart(javaPackage)}openjdk${javaVersion}`
2024-02-20 17:14:10 +03:00
const assetSuffix = `-${platform}${c.GRAALVM_FILE_EXTENSION}`
for (const asset of release.assets) {
2025-02-10 09:16:33 +01:00
if (asset.name.startsWith(assetPrefix) && asset.name.endsWith(assetSuffix)) {
2024-02-20 17:14:10 +03:00
return asset.browser_download_url
}
}
throw new Error(
2024-03-18 16:35:51 +03:00
`Unable to find asset for java-version: ${javaVersion}, java-package: ${javaPackage}, platform: ${platform}. ${c.ERROR_REQUEST}`
2024-02-20 17:14:10 +03:00
)
}
function determineToolName(javaVersion: string, javaPackage: string) {
const variant = determineVariantPart(javaPackage)
const platform = determinePlatformPart()
2024-03-18 16:35:51 +03:00
return `${LIBERICA_VM_PREFIX}${variant}${platform}`
2024-02-20 17:14:10 +03:00
}
function determineVariantPart(javaPackage: string) {
return javaPackage !== null && javaPackage.includes('+fx') ? 'full-' : ''
2024-02-20 17:14:10 +03:00
}
function determinePlatformPart() {
2024-02-22 11:15:19 +03:00
if (isMuslBasedLinux()) {
return `linux-${c.JDK_ARCH}-musl`
} else {
return `${c.JDK_PLATFORM}-${c.GRAALVM_ARCH}`
}
}
function isMuslBasedLinux() {
if (c.IS_LINUX) {
const output = spawnSync('ldd', ['--version']).stderr.toString('utf8')
2024-03-18 16:35:51 +03:00
if (output.includes('musl')) {
2024-02-22 11:15:19 +03:00
return true
}
}
return false
2024-02-20 17:14:10 +03:00
}
function isDigit(c: string) {
return c.charAt(0) >= '0' && c.charAt(0) <= '9'
}