2025-02-17 10:53:29 +01:00
|
|
|
import * as c from './constants.js'
|
2024-02-20 17:14:10 +03:00
|
|
|
import * as semver from 'semver'
|
2025-02-17 10:53:29 +01:00
|
|
|
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)
|
2024-03-06 15:40:00 +03:00
|
|
|
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
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2024-03-06 15:40:00 +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
|
|
|
}
|
|
|
|
|
2024-03-06 15:40:00 +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'
|
|
|
|
}
|