Use new Oracle GraalVM EA builds repo.

This commit is contained in:
Fabio Niephaus
2024-02-21 10:06:08 +01:00
committed by Fabio Niephaus
parent 076347913e
commit cb063c121c
7 changed files with 175 additions and 92 deletions

View File

@@ -40,6 +40,9 @@ export const GDS_GRAALVM_PRODUCT_ID = 'D53FAE8052773FFAE0530F15000AA6C6'
export const ENV_GITHUB_EVENT_NAME = 'GITHUB_EVENT_NAME'
export const EVENT_NAME_PULL_REQUEST = 'pull_request'
export const ERROR_REQUEST =
'Please file an issue at: https://github.com/graalvm/setup-graalvm/issues.'
export const ERROR_HINT =
'If you think this is a mistake, please file an issue at: https://github.com/graalvm/setup-graalvm/issues.'
@@ -52,6 +55,22 @@ export type MatchingRefsResponse =
export type ReleasesResponse =
otypes.Endpoints['GET /repos/{owner}/{repo}/releases']['response']
export type ContentsResponse =
otypes.Endpoints['GET /repos/{owner}/{repo}/contents/{path}']['response']
export interface OracleGraalVMEAFile {
filename: string
arch: 'aarch64' | 'x64'
platform: 'darwin' | 'linux' | 'windows'
}
export interface OracleGraalVMEAVersion {
version: string
latest?: boolean
download_base_url: string
files: OracleGraalVMEAFile[]
}
function determineJDKArchitecture(): string {
switch (process.arch) {
case 'x64': {

View File

@@ -3,11 +3,10 @@ import * as semver from 'semver'
import {
downloadAndExtractJDK,
downloadExtractAndCacheJDK,
getLatestPrerelease,
getContents,
getLatestRelease,
getMatchingTags,
getTaggedRelease,
toSemVer
getTaggedRelease
} from './utils'
import {downloadGraalVMEELegacy} from './gds'
import {downloadTool} from '@actions/tool-cache'
@@ -15,7 +14,8 @@ import {basename} from 'path'
const GRAALVM_DL_BASE = 'https://download.oracle.com/graalvm'
const GRAALVM_CE_DL_BASE = `https://github.com/graalvm/${c.GRAALVM_RELEASES_REPO}/releases/download`
const ORACLE_GRAALVM_REPO_EA_BUILDS = 'oracle-graalvm-dev-builds'
const ORACLE_GRAALVM_REPO_EA_BUILDS = 'oracle-graalvm-ea-builds'
const ORACLE_GRAALVM_REPO_EA_BUILDS_LATEST_SYMBOL = 'latest-ea'
const GRAALVM_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'
const GRAALVM_JDK_TAG_PREFIX = 'jdk-'
const GRAALVM_TAG_PREFIX = 'vm-'
@@ -32,7 +32,9 @@ export async function setUpGraalVMJDK(
const toolName = determineToolName(javaVersion, false)
let downloadName = toolName
let downloadUrl: string
if (javaVersion.includes('.')) {
if (javaVersion.endsWith('-ea')) {
downloadUrl = await findLatestEABuildDownloadUrl(javaVersion)
} else if (javaVersion.includes('.')) {
if (semver.valid(javaVersion)) {
const majorJavaVersion = semver.major(javaVersion)
const minorJavaVersion = semver.minor(javaVersion)
@@ -48,8 +50,6 @@ export async function setUpGraalVMJDK(
`java-version set to '${javaVersion}'. Please make sure the java-version is set correctly. ${c.ERROR_HINT}`
)
}
} else if (javaVersion === '22-ea') {
downloadUrl = await findLatestEABuildDownloadUrl(javaVersion)
} else {
downloadUrl = `${GRAALVM_DL_BASE}/${javaVersion}/latest/${downloadName}${c.GRAALVM_FILE_EXTENSION}`
}
@@ -57,25 +57,52 @@ export async function setUpGraalVMJDK(
return downloadExtractAndCacheJDK(downloader, toolName, javaVersion)
}
async function findLatestEABuildDownloadUrl(
export async function findLatestEABuildDownloadUrl(
javaEaVersion: string
): Promise<string> {
const latestPrerelease = await getLatestPrerelease(
ORACLE_GRAALVM_REPO_EA_BUILDS
const filePath = `versions/${javaEaVersion}.json`
let response
try {
response = await getContents(ORACLE_GRAALVM_REPO_EA_BUILDS, filePath)
} catch (error) {
throw new Error(
`Unable to resolve download URL for '${javaEaVersion}'. Please make sure the java-version is set correctly. ${c.ERROR_HINT}`
)
}
if (
Array.isArray(response) ||
response.type !== 'file' ||
!response.content
) {
throw new Error(
`Unexpected response when resolving download URL for '${javaEaVersion}'. ${c.ERROR_REQUEST}`
)
}
const versionData = JSON.parse(
Buffer.from(response.content, 'base64').toString('utf-8')
)
const expectedFileNamePrefix = 'graalvm-jdk-'
const expectedFileNameSuffix = `_${c.JDK_PLATFORM}-${c.JDK_ARCH}_bin${c.GRAALVM_FILE_EXTENSION}`
for (const asset of latestPrerelease.assets) {
if (
asset.name.startsWith(expectedFileNamePrefix) &&
asset.name.endsWith(expectedFileNameSuffix)
) {
return asset.browser_download_url
let latestVersion
if (javaEaVersion === ORACLE_GRAALVM_REPO_EA_BUILDS_LATEST_SYMBOL) {
latestVersion = versionData as c.OracleGraalVMEAVersion
} else {
latestVersion = (versionData as c.OracleGraalVMEAVersion[]).find(
v => v.latest
)
if (!latestVersion) {
throw new Error(
`Unable to find latest version for '${javaEaVersion}'. ${c.ERROR_REQUEST}`
)
}
}
throw new Error(
`Could not find Oracle GraalVM build for ${javaEaVersion}. ${c.ERROR_HINT}`
const file = latestVersion.files.find(
f => f.arch === c.JDK_ARCH && f.platform === c.GRAALVM_PLATFORM
)
if (!file || !file.filename.startsWith('graalvm-jdk-')) {
throw new Error(
`Unable to find file metadata for '${javaEaVersion}'. ${c.ERROR_REQUEST}`
)
}
return `${latestVersion.download_base_url}${file.filename}`
}
export async function setUpGraalVMJDKCE(

View File

@@ -34,25 +34,6 @@ export async function exec(
}
}
export async function getLatestPrerelease(
repo: string
): Promise<c.ReleasesResponse['data'][number]> {
const githubToken = getGitHubToken()
const options = githubToken.length > 0 ? {auth: githubToken} : {}
const octokit = new GitHubDotCom(options)
const releases: c.ReleasesResponse['data'] = (
await octokit.request('GET /repos/{owner}/{repo}/releases', {
owner: c.GRAALVM_GH_USER,
repo
})
).data
const firstPrerelease = releases.find(r => r.prerelease)
if (!firstPrerelease) {
throw new Error(`Unable to find latest prerelease in ${repo}`)
}
return firstPrerelease
}
export async function getLatestRelease(
repo: string
): Promise<c.LatestReleaseResponse['data']> {
@@ -67,6 +48,22 @@ export async function getLatestRelease(
).data
}
export async function getContents(
repo: string,
path: string
): Promise<c.ContentsResponse['data']> {
const githubToken = getGitHubToken()
const options = githubToken.length > 0 ? {auth: githubToken} : {}
const octokit = new GitHubDotCom(options)
return (
await octokit.request('GET /repos/{owner}/{repo}/contents/{path}', {
owner: c.GRAALVM_GH_USER,
repo,
path
})
).data
}
export async function getTaggedRelease(
repo: string,
tag: string