2022-01-03 09:00:36 +01:00
|
|
|
import * as c from './constants'
|
2023-10-30 17:24:23 +02:00
|
|
|
import * as httpClient from '@actions/http-client'
|
2025-01-21 13:03:20 +01:00
|
|
|
import {downloadExtractAndCacheJDK} from './utils'
|
2022-03-03 17:24:24 +01:00
|
|
|
import {downloadTool} from '@actions/tool-cache'
|
2023-10-30 15:12:37 +02:00
|
|
|
import {basename} from 'path'
|
2022-01-03 09:00:36 +01:00
|
|
|
|
2023-10-30 15:12:37 +02:00
|
|
|
export const MANDREL_REPO = 'mandrel'
|
|
|
|
export const MANDREL_TAG_PREFIX = c.MANDREL_NAMESPACE
|
2022-01-03 09:00:36 +01:00
|
|
|
const MANDREL_DL_BASE = 'https://github.com/graalvm/mandrel/releases/download'
|
2023-10-30 17:03:23 +02:00
|
|
|
const DISCO_API_BASE = 'https://api.foojay.io/disco/v3.0/packages/jdks'
|
2022-01-03 09:00:36 +01:00
|
|
|
|
2023-10-30 17:24:23 +02:00
|
|
|
interface JdkData {
|
|
|
|
message: string
|
2025-01-21 13:03:20 +01:00
|
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
2023-10-30 17:24:23 +02:00
|
|
|
result: any
|
2025-01-21 13:03:20 +01:00
|
|
|
/* eslint-enable @typescript-eslint/no-explicit-any */
|
2023-10-30 17:24:23 +02:00
|
|
|
}
|
|
|
|
|
2022-01-03 09:00:36 +01:00
|
|
|
export async function setUpMandrel(
|
2023-10-30 17:24:23 +02:00
|
|
|
mandrelVersion: string,
|
2022-01-03 09:00:36 +01:00
|
|
|
javaVersion: string
|
|
|
|
): Promise<string> {
|
2023-10-30 17:24:23 +02:00
|
|
|
const version = stripMandrelNamespace(mandrelVersion)
|
2022-01-03 09:00:36 +01:00
|
|
|
let mandrelHome
|
2023-10-30 17:24:23 +02:00
|
|
|
switch (version) {
|
2023-11-03 14:21:41 +02:00
|
|
|
case '':
|
2025-01-21 13:03:20 +01:00
|
|
|
// fetch latest if no version is specified
|
|
|
|
mandrelHome = await setUpMandrelLatest(javaVersion)
|
|
|
|
break
|
2022-01-03 09:00:36 +01:00
|
|
|
case 'latest':
|
|
|
|
mandrelHome = await setUpMandrelLatest(javaVersion)
|
|
|
|
break
|
|
|
|
default:
|
2023-10-30 17:24:23 +02:00
|
|
|
mandrelHome = await setUpMandrelRelease(version, javaVersion)
|
2022-01-03 09:00:36 +01:00
|
|
|
break
|
|
|
|
}
|
|
|
|
|
|
|
|
return mandrelHome
|
|
|
|
}
|
|
|
|
|
|
|
|
async function setUpMandrelLatest(javaVersion: string): Promise<string> {
|
2023-10-30 17:03:23 +02:00
|
|
|
const latest_release_url = await getLatestMandrelReleaseUrl(javaVersion)
|
2023-10-30 17:24:23 +02:00
|
|
|
const version_tag = getTagFromURI(latest_release_url)
|
|
|
|
const version = stripMandrelNamespace(version_tag)
|
|
|
|
|
2023-10-30 17:03:23 +02:00
|
|
|
const toolName = determineToolName(javaVersion)
|
|
|
|
return downloadExtractAndCacheJDK(
|
|
|
|
async () => downloadTool(latest_release_url),
|
|
|
|
toolName,
|
|
|
|
version
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Download URIs are of the form https://github.com/graalvm/mandrel/releases/download/<tag>/<archive-name>
|
|
|
|
function getTagFromURI(uri: string): string {
|
2023-10-30 17:24:23 +02:00
|
|
|
const parts = uri.split('/')
|
2023-10-30 17:03:23 +02:00
|
|
|
try {
|
2023-10-30 17:24:23 +02:00
|
|
|
return parts[parts.length - 2]
|
2023-10-30 17:03:23 +02:00
|
|
|
} catch (error) {
|
|
|
|
throw new Error(`Failed to extract tag from URI ${uri}: ${error}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-30 17:24:23 +02:00
|
|
|
export async function getLatestMandrelReleaseUrl(
|
|
|
|
javaVersion: string
|
|
|
|
): Promise<string> {
|
2023-10-30 17:03:23 +02:00
|
|
|
const url = `${DISCO_API_BASE}?jdk_version=${javaVersion}&distribution=${c.DISTRIBUTION_MANDREL}&architecture=${c.JDK_ARCH}&operating_system=${c.JDK_PLATFORM}&latest=per_distro`
|
2023-11-03 14:08:39 +02:00
|
|
|
const _http = new httpClient.HttpClient()
|
2023-10-30 17:24:23 +02:00
|
|
|
const response = await _http.getJson<JdkData>(url)
|
|
|
|
if (response.statusCode !== 200) {
|
|
|
|
throw new Error(
|
|
|
|
`Failed to fetch latest Mandrel release for Java ${javaVersion} from DISCO API: ${response.result}`
|
|
|
|
)
|
2023-10-30 17:03:23 +02:00
|
|
|
}
|
2023-10-30 17:24:23 +02:00
|
|
|
const result = response.result?.result[0]
|
2023-10-30 17:03:23 +02:00
|
|
|
try {
|
2023-10-30 17:24:23 +02:00
|
|
|
const pkg_info_uri = result.links.pkg_info_uri
|
|
|
|
return await getLatestMandrelReleaseUrlHelper(
|
|
|
|
_http,
|
|
|
|
javaVersion,
|
|
|
|
pkg_info_uri
|
|
|
|
)
|
2023-10-30 17:03:23 +02:00
|
|
|
} catch (error) {
|
2023-10-30 17:24:23 +02:00
|
|
|
throw new Error(
|
|
|
|
`Failed to get latest Mandrel release for Java ${javaVersion} from DISCO API: ${error}`
|
|
|
|
)
|
2023-10-30 17:03:23 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-30 17:24:23 +02:00
|
|
|
async function getLatestMandrelReleaseUrlHelper(
|
|
|
|
_http: httpClient.HttpClient,
|
|
|
|
java_version: string,
|
|
|
|
pkg_info_uri: string
|
|
|
|
): Promise<string> {
|
|
|
|
const response = await _http.getJson<JdkData>(pkg_info_uri)
|
|
|
|
if (response.statusCode !== 200) {
|
|
|
|
throw new Error(
|
|
|
|
`Failed to fetch package info of latest Mandrel release for Java ${java_version} from DISCO API: ${response.result}`
|
|
|
|
)
|
2023-10-30 17:03:23 +02:00
|
|
|
}
|
2023-10-30 17:24:23 +02:00
|
|
|
const result = response.result?.result[0]
|
2023-10-30 17:03:23 +02:00
|
|
|
try {
|
2023-10-30 17:24:23 +02:00
|
|
|
return result.direct_download_uri
|
2023-10-30 17:03:23 +02:00
|
|
|
} catch (error) {
|
2023-10-30 17:24:23 +02:00
|
|
|
throw new Error(
|
|
|
|
`Failed to get download URI of latest Mandrel release for Java ${java_version} from DISCO API: ${error}`
|
|
|
|
)
|
2022-01-03 09:00:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function setUpMandrelRelease(
|
|
|
|
version: string,
|
|
|
|
javaVersion: string
|
|
|
|
): Promise<string> {
|
2022-03-01 10:50:00 +01:00
|
|
|
const toolName = determineToolName(javaVersion)
|
2022-03-03 17:24:24 +01:00
|
|
|
return downloadExtractAndCacheJDK(
|
2023-10-30 15:12:37 +02:00
|
|
|
async () => downloadMandrelJDK(version, javaVersion),
|
2022-03-03 17:24:24 +01:00
|
|
|
toolName,
|
|
|
|
version
|
|
|
|
)
|
2022-01-03 09:00:36 +01:00
|
|
|
}
|
|
|
|
|
2023-10-30 15:12:37 +02:00
|
|
|
async function downloadMandrelJDK(
|
|
|
|
version: string,
|
|
|
|
javaVersion: string
|
|
|
|
): Promise<string> {
|
|
|
|
const identifier = determineMandrelIdentifier(version, javaVersion)
|
|
|
|
const downloadUrl = `${MANDREL_DL_BASE}/${MANDREL_TAG_PREFIX}${version}/${identifier}${c.GRAALVM_FILE_EXTENSION}`
|
|
|
|
try {
|
|
|
|
return await downloadTool(downloadUrl)
|
|
|
|
} catch (error) {
|
|
|
|
if (error instanceof Error && error.message.includes('404')) {
|
|
|
|
// Not Found
|
|
|
|
throw new Error(
|
|
|
|
`Failed to download ${basename(
|
|
|
|
downloadUrl
|
|
|
|
)}. Are you sure version: '${version}' and java-version: '${javaVersion}' are correct?`
|
|
|
|
)
|
|
|
|
}
|
|
|
|
throw new Error(
|
|
|
|
`Failed to download ${basename(downloadUrl)} (error: ${error}).`
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-03 09:00:36 +01:00
|
|
|
function determineMandrelIdentifier(
|
|
|
|
version: string,
|
|
|
|
javaVersion: string
|
|
|
|
): string {
|
2022-03-08 10:47:41 +01:00
|
|
|
return `mandrel-java${javaVersion}-${c.GRAALVM_PLATFORM}-${c.GRAALVM_ARCH}-${version}`
|
2022-01-03 09:00:36 +01:00
|
|
|
}
|
2022-03-01 10:50:00 +01:00
|
|
|
|
|
|
|
function determineToolName(javaVersion: string): string {
|
|
|
|
return `mandrel-java${javaVersion}-${c.GRAALVM_PLATFORM}`
|
|
|
|
}
|
2023-10-30 17:24:23 +02:00
|
|
|
|
|
|
|
export function stripMandrelNamespace(graalVMVersion: string) {
|
|
|
|
if (graalVMVersion.startsWith(c.MANDREL_NAMESPACE)) {
|
|
|
|
return graalVMVersion.substring(
|
|
|
|
c.MANDREL_NAMESPACE.length,
|
|
|
|
graalVMVersion.length
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
return graalVMVersion
|
|
|
|
}
|
|
|
|
}
|