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 108 additions and 40 deletions

View File

@ -35,6 +35,9 @@ jobs:
] ]
components: [''] components: ['']
include: include:
- java-version: 'latest-ea'
distribution: 'graalvm'
os: ubuntu-latest
- java-version: '22-ea' - java-version: '22-ea'
distribution: 'graalvm' distribution: 'graalvm'
os: ubuntu-latest os: ubuntu-latest

View File

@ -2,7 +2,11 @@ import * as path from 'path'
import * as graalvm from '../src/graalvm' import * as graalvm from '../src/graalvm'
import {expect, test} from '@jest/globals' import {expect, test} from '@jest/globals'
import {getTaggedRelease} from '../src/utils' import {getTaggedRelease} from '../src/utils'
import {findGraalVMVersion, findHighestJavaVersion} from '../src/graalvm' import {
findGraalVMVersion,
findHighestJavaVersion,
findLatestEABuildDownloadUrl
} from '../src/graalvm'
import {GRAALVM_RELEASES_REPO} from '../src/constants' import {GRAALVM_RELEASES_REPO} from '../src/constants'
process.env['RUNNER_TOOL_CACHE'] = path.join(__dirname, 'TOOL_CACHE') process.env['RUNNER_TOOL_CACHE'] = path.join(__dirname, 'TOOL_CACHE')
@ -79,3 +83,21 @@ test('find version/javaVersion', async () => {
} }
expect(error.message).toContain('Could not find highest Java version.') expect(error.message).toContain('Could not find highest Java version.')
}) })
test('find version/javaVersion', async () => {
let url22EA = await findLatestEABuildDownloadUrl('22-ea')
expect(url22EA).not.toBe('')
let urlLatestEA = await findLatestEABuildDownloadUrl('latest-ea')
expect(urlLatestEA).not.toBe('')
let error = new Error('unexpected')
try {
await findLatestEABuildDownloadUrl('8-ea')
} catch (err) {
if (!(err instanceof Error)) {
fail(`Unexpected non-Error: ${err}`)
}
error = err
}
expect(error.message).toContain('Unable to resolve download URL for')
})

BIN
dist/cleanup/index.js generated vendored

Binary file not shown.

BIN
dist/main/index.js generated vendored

Binary file not shown.

View File

@ -40,6 +40,9 @@ export const GDS_GRAALVM_PRODUCT_ID = 'D53FAE8052773FFAE0530F15000AA6C6'
export const ENV_GITHUB_EVENT_NAME = 'GITHUB_EVENT_NAME' export const ENV_GITHUB_EVENT_NAME = 'GITHUB_EVENT_NAME'
export const EVENT_NAME_PULL_REQUEST = 'pull_request' 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 = export const ERROR_HINT =
'If you think this is a mistake, please file an issue at: https://github.com/graalvm/setup-graalvm/issues.' '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 = export type ReleasesResponse =
otypes.Endpoints['GET /repos/{owner}/{repo}/releases']['response'] 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 { function determineJDKArchitecture(): string {
switch (process.arch) { switch (process.arch) {
case 'x64': { case 'x64': {

View File

@ -3,11 +3,10 @@ import * as semver from 'semver'
import { import {
downloadAndExtractJDK, downloadAndExtractJDK,
downloadExtractAndCacheJDK, downloadExtractAndCacheJDK,
getLatestPrerelease, getContents,
getLatestRelease, getLatestRelease,
getMatchingTags, getMatchingTags,
getTaggedRelease, getTaggedRelease
toSemVer
} from './utils' } from './utils'
import {downloadGraalVMEELegacy} from './gds' import {downloadGraalVMEELegacy} from './gds'
import {downloadTool} from '@actions/tool-cache' 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_DL_BASE = 'https://download.oracle.com/graalvm'
const GRAALVM_CE_DL_BASE = `https://github.com/graalvm/${c.GRAALVM_RELEASES_REPO}/releases/download` 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_REPO_DEV_BUILDS = 'graalvm-ce-dev-builds'
const GRAALVM_JDK_TAG_PREFIX = 'jdk-' const GRAALVM_JDK_TAG_PREFIX = 'jdk-'
const GRAALVM_TAG_PREFIX = 'vm-' const GRAALVM_TAG_PREFIX = 'vm-'
@ -32,7 +32,9 @@ export async function setUpGraalVMJDK(
const toolName = determineToolName(javaVersion, false) const toolName = determineToolName(javaVersion, false)
let downloadName = toolName let downloadName = toolName
let downloadUrl: string let downloadUrl: string
if (javaVersion.includes('.')) { if (javaVersion.endsWith('-ea')) {
downloadUrl = await findLatestEABuildDownloadUrl(javaVersion)
} else if (javaVersion.includes('.')) {
if (semver.valid(javaVersion)) { if (semver.valid(javaVersion)) {
const majorJavaVersion = semver.major(javaVersion) const majorJavaVersion = semver.major(javaVersion)
const minorJavaVersion = semver.minor(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}` `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 { } else {
downloadUrl = `${GRAALVM_DL_BASE}/${javaVersion}/latest/${downloadName}${c.GRAALVM_FILE_EXTENSION}` downloadUrl = `${GRAALVM_DL_BASE}/${javaVersion}/latest/${downloadName}${c.GRAALVM_FILE_EXTENSION}`
} }
@ -57,26 +57,53 @@ export async function setUpGraalVMJDK(
return downloadExtractAndCacheJDK(downloader, toolName, javaVersion) return downloadExtractAndCacheJDK(downloader, toolName, javaVersion)
} }
async function findLatestEABuildDownloadUrl( export async function findLatestEABuildDownloadUrl(
javaEaVersion: string javaEaVersion: string
): Promise<string> { ): Promise<string> {
const latestPrerelease = await getLatestPrerelease( const filePath = `versions/${javaEaVersion}.json`
ORACLE_GRAALVM_REPO_EA_BUILDS let response
) try {
const expectedFileNamePrefix = 'graalvm-jdk-' response = await getContents(ORACLE_GRAALVM_REPO_EA_BUILDS, filePath)
const expectedFileNameSuffix = `_${c.JDK_PLATFORM}-${c.JDK_ARCH}_bin${c.GRAALVM_FILE_EXTENSION}` } catch (error) {
for (const asset of latestPrerelease.assets) {
if (
asset.name.startsWith(expectedFileNamePrefix) &&
asset.name.endsWith(expectedFileNameSuffix)
) {
return asset.browser_download_url
}
}
throw new Error( throw new Error(
`Could not find Oracle GraalVM build for ${javaEaVersion}. ${c.ERROR_HINT}` `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')
)
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}`
)
}
}
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( export async function setUpGraalVMJDKCE(
javaVersionOrDev: string javaVersionOrDev: string

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( export async function getLatestRelease(
repo: string repo: string
): Promise<c.LatestReleaseResponse['data']> { ): Promise<c.LatestReleaseResponse['data']> {
@ -67,6 +48,22 @@ export async function getLatestRelease(
).data ).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( export async function getTaggedRelease(
repo: string, repo: string,
tag: string tag: string