2022-01-03 08:52:11 +01:00
import * as c from './constants'
2022-03-01 10:50:00 +01:00
import {
downloadAndExtractJDK ,
downloadExtractAndCacheJDK ,
getLatestRelease
} from './utils'
2022-03-03 17:24:24 +01:00
import { downloadGraalVMEE } from './gds'
import { downloadTool } from '@actions/tool-cache'
2022-01-03 08:52:11 +01:00
2023-01-24 10:35:51 +01:00
const GRAALVM_CE_DL_BASE = ` https://github.com/graalvm/ ${ c . GRAALVM_RELEASES_REPO } /releases/download `
2022-01-03 13:11:04 +01:00
const GRAALVM_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'
2022-01-03 08:52:11 +01:00
const GRAALVM_TAG_PREFIX = 'vm-'
2022-03-03 17:24:24 +01:00
export async function setUpGraalVMLatest (
gdsToken : string ,
javaVersion : string
) : Promise < string > {
if ( gdsToken . length > 0 ) {
return setUpGraalVMRelease ( gdsToken , c . VERSION_LATEST , javaVersion )
}
2023-01-24 10:35:51 +01:00
const latestRelease = await getLatestRelease ( c . GRAALVM_RELEASES_REPO )
const version = findGraalVMVersion ( latestRelease )
return setUpGraalVMRelease ( gdsToken , version , javaVersion )
2022-11-02 14:00:51 +01:00
}
2023-01-24 10:35:51 +01:00
export function findGraalVMVersion ( release : c.LatestReleaseResponse [ 'data' ] ) {
const tag_name = release . tag_name
if ( ! tag_name . startsWith ( GRAALVM_TAG_PREFIX ) ) {
throw new Error ( ` Could not find latest GraalVM release: ${ tag_name } ` )
2022-01-03 08:52:11 +01:00
}
2023-01-24 10:35:51 +01:00
return tag_name . substring ( GRAALVM_TAG_PREFIX . length , tag_name . length )
2022-01-03 08:52:11 +01:00
}
2022-01-03 13:11:04 +01:00
export async function setUpGraalVMDevBuild (
2022-03-03 17:24:24 +01:00
gdsToken : string ,
2022-01-03 08:52:11 +01:00
javaVersion : string
) : Promise < string > {
2022-03-03 17:24:24 +01:00
if ( gdsToken . length > 0 ) {
throw new Error ( 'Downloading GraalVM EE dev builds is not supported' )
}
2022-01-03 13:11:04 +01:00
const latestDevBuild = await getLatestRelease ( GRAALVM_REPO_DEV_BUILDS )
2023-01-24 10:35:51 +01:00
let resolvedJavaVersion
if ( javaVersion == c . VERSION_DEV ) {
resolvedJavaVersion = findHighestJavaVersion ( latestDevBuild , c . VERSION_DEV )
} else {
resolvedJavaVersion = javaVersion
2022-01-03 08:52:11 +01:00
}
2023-01-24 10:35:51 +01:00
const downloadUrl = findDownloadUrl ( latestDevBuild , resolvedJavaVersion )
return downloadAndExtractJDK ( downloadUrl )
2022-01-03 08:52:11 +01:00
}
export async function setUpGraalVMRelease (
2022-03-03 17:24:24 +01:00
gdsToken : string ,
2022-01-03 08:52:11 +01:00
version : string ,
javaVersion : string
) : Promise < string > {
2022-03-03 17:24:24 +01:00
const isEE = gdsToken . length > 0
const toolName = determineToolName ( isEE , javaVersion )
let downloader : ( ) = > Promise < string >
if ( isEE ) {
downloader = async ( ) = > downloadGraalVMEE ( gdsToken , version , javaVersion )
} else {
2022-12-16 18:43:51 +01:00
downloader = async ( ) = > downloadGraalVMCE ( version , javaVersion )
2022-03-03 17:24:24 +01:00
}
return downloadExtractAndCacheJDK ( downloader , toolName , version )
2022-01-03 08:52:11 +01:00
}
2023-01-24 10:35:51 +01:00
export function findHighestJavaVersion (
release : c.LatestReleaseResponse [ 'data' ] ,
version : string
) : string {
const graalVMIdentifierPattern = determineGraalVMIdentifier (
false ,
version ,
'(\\d+)'
)
const expectedFileNameRegExp = new RegExp (
` ^ ${ graalVMIdentifierPattern } ${ c . GRAALVM_FILE_EXTENSION . replace (
/\./g ,
'\\.'
) } $ `
)
let highestJavaVersion = 0
for ( const asset of release . assets ) {
const matches = asset . name . match ( expectedFileNameRegExp )
if ( matches ) {
const javaVersion = + matches [ 1 ]
if ( javaVersion > highestJavaVersion ) {
highestJavaVersion = javaVersion
}
}
}
if ( highestJavaVersion > 0 ) {
return String ( highestJavaVersion )
} else {
throw new Error (
'Could not find highest Java version. Please file an issue at: https://github.com/graalvm/setup-graalvm/issues.'
)
}
}
function findDownloadUrl (
release : c.LatestReleaseResponse [ 'data' ] ,
javaVersion : string
) : string {
const graalVMIdentifier = determineGraalVMIdentifier (
false ,
c . VERSION_DEV ,
javaVersion
)
const expectedFileName = ` ${ graalVMIdentifier } ${ c . GRAALVM_FILE_EXTENSION } `
for ( const asset of release . assets ) {
if ( asset . name === expectedFileName ) {
return asset . browser_download_url
}
}
throw new Error (
` Could not find GraalVM dev build for Java ${ javaVersion } . It may no longer be available, so please consider upgrading the Java version. If you think this is a mistake, please file an issue at: https://github.com/graalvm/setup-graalvm/issues. `
)
}
2022-01-03 08:52:11 +01:00
function determineGraalVMIdentifier (
2022-03-03 17:24:24 +01:00
isEE : boolean ,
2022-01-03 08:52:11 +01:00
version : string ,
javaVersion : string
) : string {
2022-03-03 17:24:24 +01:00
return ` graalvm- ${ isEE ? 'ee' : 'ce' } -java ${ javaVersion } - ${
c . GRAALVM_PLATFORM
} - $ { c . GRAALVM_ARCH } - $ { version } `
2022-01-03 08:52:11 +01:00
}
2022-03-01 10:50:00 +01:00
2022-03-03 17:24:24 +01:00
function determineToolName ( isEE : boolean , javaVersion : string ) : string {
return ` graalvm- ${ isEE ? 'ee' : 'ce' } -java ${ javaVersion } - ${
c . GRAALVM_PLATFORM
} `
2022-03-01 10:50:00 +01:00
}
2022-12-16 18:43:51 +01:00
async function downloadGraalVMCE (
version : string ,
javaVersion : string
) : Promise < string > {
const graalVMIdentifier = determineGraalVMIdentifier (
false ,
version ,
javaVersion
)
const downloadUrl = ` ${ GRAALVM_CE_DL_BASE } / ${ GRAALVM_TAG_PREFIX } ${ version } / ${ graalVMIdentifier } ${ c . GRAALVM_FILE_EXTENSION } `
try {
return await downloadTool ( downloadUrl )
} catch ( error ) {
if ( error instanceof Error && error . message . includes ( '404' ) ) {
// Not Found
throw new Error (
2023-01-24 10:35:51 +01:00
` Failed to download ${ graalVMIdentifier } . Are you sure version: ' ${ version } ' and java-version: ' ${ javaVersion } ' are correct? `
2022-12-16 18:43:51 +01:00
)
}
throw new Error (
` Failed to download ${ graalVMIdentifier } (error: ${ error } ). `
)
}
}