Add support for Oracle GraalVM via GDS.

This commit is contained in:
Fabio Niephaus
2024-10-14 11:08:40 +02:00
committed by Fabio Niephaus
parent c3163945bd
commit 4873ae0b28
9 changed files with 263 additions and 58 deletions

View File

@@ -1,5 +1,7 @@
import * as otypes from '@octokit/types'
export const ACTION_VERSION = '1.2.3'
export const INPUT_VERSION = 'version'
export const INPUT_GDS_TOKEN = 'gds-token'
export const INPUT_JAVA_VERSION = 'java-version'

View File

@@ -6,6 +6,7 @@ import * as io from '@actions/io'
import * as path from 'path'
import * as stream from 'stream'
import * as util from 'util'
import * as semver from 'semver'
import {IncomingHttpHeaders, OutgoingHttpHeaders} from 'http'
import {RetryHelper} from '@actions/tool-cache/lib/retry-helper'
import {calculateSHA256} from './utils'
@@ -26,13 +27,26 @@ interface GDSErrorResponse {
readonly message: string
}
export async function downloadGraalVM(
gdsToken: string,
javaVersion: string
): Promise<string> {
const userAgent = `GraalVMGitHubAction/${c.ACTION_VERSION} (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
const baseArtifact = await fetchArtifact(
userAgent,
'isBase:True',
javaVersion
)
return downloadArtifact(gdsToken, userAgent, baseArtifact)
}
export async function downloadGraalVMEELegacy(
gdsToken: string,
version: string,
javaVersion: string
): Promise<string> {
const userAgent = `GraalVMGitHubAction/1.2.3 (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
const baseArtifact = await fetchArtifact(
const userAgent = `GraalVMGitHubAction/${c.ACTION_VERSION} (arch:${c.GRAALVM_ARCH}; os:${c.GRAALVM_PLATFORM}; java:${javaVersion})`
const baseArtifact = await fetchArtifactEE(
userAgent,
'isBase:True',
version,
@@ -42,6 +56,49 @@ export async function downloadGraalVMEELegacy(
}
export async function fetchArtifact(
userAgent: string,
metadata: string,
javaVersion: string
): Promise<GDSArtifact> {
const http = new httpClient.HttpClient(userAgent)
let filter
if (javaVersion.includes('.')) {
filter = `metadata=version:${javaVersion}`
} else {
filter = `sortBy=timeCreated&sortOrder=DESC&limit=1` // latest and only one item
}
let majorJavaVersion
if (semver.valid(javaVersion)) {
majorJavaVersion = semver.major(javaVersion)
} else {
majorJavaVersion = javaVersion
}
const catalogOS = c.IS_MACOS ? 'macos' : c.GRAALVM_PLATFORM
const requestUrl = `${c.GDS_BASE}/artifacts?productId=${c.GDS_GRAALVM_PRODUCT_ID}&displayName=Oracle%20GraalVM&${filter}&metadata=java:jdk${majorJavaVersion}&metadata=os:${catalogOS}&metadata=arch:${c.GRAALVM_ARCH}&metadata=${metadata}&status=PUBLISHED&responseFields=id&responseFields=checksum`
core.debug(`Requesting ${requestUrl}`)
const response = await http.get(requestUrl, {accept: 'application/json'})
if (response.message.statusCode !== 200) {
throw new Error(
`Unable to find GraalVM for JDK ${javaVersion}. Are you sure java-version: '${javaVersion}' is correct?`
)
}
const artifactResponse = JSON.parse(
await response.readBody()
) as GDSArtifactsResponse
if (artifactResponse.items.length !== 1) {
throw new Error(
artifactResponse.items.length > 1
? `Found more than one GDS artifact. ${c.ERROR_HINT}`
: `Unable to find GDS artifact. Are you sure java-version: '${javaVersion}' is correct?`
)
}
return artifactResponse.items[0]
}
export async function fetchArtifactEE(
userAgent: string,
metadata: string,
version: string,

View File

@@ -1,4 +1,5 @@
import * as c from './constants'
import * as core from '@actions/core'
import * as semver from 'semver'
import {
downloadAndExtractJDK,
@@ -8,7 +9,7 @@ import {
getMatchingTags,
getTaggedRelease
} from './utils'
import {downloadGraalVMEELegacy} from './gds'
import {downloadGraalVM, downloadGraalVMEELegacy} from './gds'
import {downloadTool} from '@actions/tool-cache'
import {basename} from 'path'
@@ -23,13 +24,27 @@ const GRAALVM_TAG_PREFIX = 'vm-'
// Support for GraalVM for JDK 17 and later
export async function setUpGraalVMJDK(
javaVersionOrDev: string
javaVersionOrDev: string,
gdsToken: string
): Promise<string> {
if (javaVersionOrDev === c.VERSION_DEV) {
return setUpGraalVMJDKDevBuild()
}
const isTokenProvided = gdsToken.length > 0
let javaVersion = javaVersionOrDev
const toolName = determineToolName(javaVersion, false)
if (javaVersionOrDev === '17' && !isTokenProvided) {
core.warning(
'This build uses the last update of Oracle GraalVM for JDK 17 under the GFTC. More details: https://github.com/marketplace/actions/github-action-for-graalvm#notes-on-oracle-graalvm-for-jdk-17'
)
return setUpGraalVMJDK('17.0.12', gdsToken)
}
if (isTokenProvided) {
// Download from GDS
const downloader = async () => downloadGraalVM(gdsToken, javaVersion)
return downloadExtractAndCacheJDK(downloader, toolName, javaVersion)
}
// Download from oracle.com
let downloadName = toolName
let downloadUrl: string
if (javaVersion.endsWith('-ea')) {

View File

@@ -59,7 +59,7 @@ async function run(): Promise<void> {
}
switch (distribution) {
case c.DISTRIBUTION_GRAALVM:
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion, gdsToken)
break
case c.DISTRIBUTION_GRAALVM_COMMUNITY:
graalVMHome = await graalvm.setUpGraalVMJDKCE(javaVersion)
@@ -80,7 +80,7 @@ async function run(): Promise<void> {
core.info(
`This build is using the new Oracle GraalVM. To select a specific distribution, use the 'distribution' option (see https://github.com/graalvm/setup-graalvm/tree/main#options).`
)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion, gdsToken)
}
break
default:
@@ -98,7 +98,7 @@ async function run(): Promise<void> {
core.info(
`This build is using the new Oracle GraalVM. To select a specific distribution, use the 'distribution' option (see https://github.com/graalvm/setup-graalvm/tree/main#options).`
)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion, gdsToken)
} else {
graalVMHome = await graalvm.setUpGraalVMLatest_22_X(
gdsToken,
@@ -119,7 +119,7 @@ async function run(): Promise<void> {
core.warning(
`GraalVM dev builds are only available for JDK 21. This build is now using a stable release of GraalVM for JDK ${javaVersion}.`
)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion)
graalVMHome = await graalvm.setUpGraalVMJDK(javaVersion, gdsToken)
} else {
graalVMHome = await graalvm.setUpGraalVMJDKDevBuild()
}