refactor: simplify GraalVM Community release resolution

This commit is contained in:
copilot-swe-agent[bot]
2026-06-22 22:08:46 +00:00
committed by GitHub
parent 34df7e6dff
commit 651865a8a8
2 changed files with 94 additions and 107 deletions
+39 -37
View File
@@ -79086,6 +79086,7 @@ const GRAALVM_DOWNLOAD_URL = 'https://www.graalvm.org/downloads/';
const GRAALVM_COMMUNITY_RELEASES_URL = 'https://api.github.com/repos/graalvm/graalvm-ce-builds/releases?per_page=100'; const GRAALVM_COMMUNITY_RELEASES_URL = 'https://api.github.com/repos/graalvm/graalvm-ce-builds/releases?per_page=100';
const GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN = 'https://api.github.com'; const GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN = 'https://api.github.com';
const GRAALVM_COMMUNITY_DOWNLOAD_URL = 'https://github.com/graalvm/graalvm-ce-builds/releases'; const GRAALVM_COMMUNITY_DOWNLOAD_URL = 'https://github.com/graalvm/graalvm-ce-builds/releases';
const GRAALVM_COMMUNITY_ASSET_PREFIX = 'graalvm-community-jdk-';
const IS_WINDOWS = process.platform === 'win32'; const IS_WINDOWS = process.platform === 'win32';
const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform; const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform;
const GRAALVM_MIN_VERSION = 17; const GRAALVM_MIN_VERSION = 17;
@@ -79275,7 +79276,10 @@ class GraalVMCommunityDistribution extends GraalVMDistribution {
} }
const arch = this.getSupportedArchitecture(); const arch = this.getSupportedArchitecture();
const { platform, extension } = this.validateStableBuildRequest(range); const { platform, extension } = this.validateStableBuildRequest(range);
const availableVersions = yield this.getAvailableVersionsForPlatform(platform, arch, extension); // GraalVM Community asset names embed the platform, architecture and
// archive type, e.g. `graalvm-community-jdk-21.0.2_linux-x64_bin.tar.gz`.
const assetSuffix = `_${platform}-${arch}_bin.${extension}`;
const availableVersions = yield this.getAvailableVersions(assetSuffix);
const satisfiedVersion = availableVersions const satisfiedVersion = availableVersions
.filter(item => (0, util_1.isVersionSatisfies)(range, item.version)) .filter(item => (0, util_1.isVersionSatisfies)(range, item.version))
.sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0]; .sort((a, b) => -semver_1.default.compareBuild(a.version, b.version))[0];
@@ -79287,60 +79291,58 @@ class GraalVMCommunityDistribution extends GraalVMDistribution {
return satisfiedVersion; return satisfiedVersion;
}); });
} }
getAvailableVersionsForPlatform(platform, arch, extension) { getAvailableVersions(assetSuffix) {
var _a; var _a, _b;
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const headers = (0, util_1.getGitHubHttpHeaders)(); const headers = (0, util_1.getGitHubHttpHeaders)();
const availableVersions = new Map(); const versions = new Map();
let releasesUrl = GRAALVM_COMMUNITY_RELEASES_URL; let releasesUrl = GRAALVM_COMMUNITY_RELEASES_URL;
let pageCount = 0; for (let page = 0; releasesUrl && page < util_1.MAX_PAGINATION_PAGES; page++) {
while (releasesUrl) {
pageCount++;
const response = yield this.http.getJson(releasesUrl, headers); const response = yield this.http.getJson(releasesUrl, headers);
const releases = Array.isArray(response.result) ? response.result : []; const releases = (_a = response.result) !== null && _a !== void 0 ? _a : [];
if (releases.length === 0) {
break;
}
for (const release of releases) { for (const release of releases) {
if (release.draft || release.prerelease) { if (release.draft || release.prerelease) {
continue; continue;
} }
for (const asset of (_a = release.assets) !== null && _a !== void 0 ? _a : []) { for (const asset of (_b = release.assets) !== null && _b !== void 0 ? _b : []) {
const releaseForPlatform = this.toCommunityReleaseForPlatform(asset, platform, arch, extension); const version = this.extractAssetVersion(asset.name, assetSuffix);
if (releaseForPlatform) { if (version) {
availableVersions.set(releaseForPlatform.version, releaseForPlatform); versions.set(version, {
version,
url: asset.browser_download_url
});
} }
} }
} }
const nextUrl = (0, util_1.getNextPageUrlFromLinkHeader)(response.headers); releasesUrl = this.getNextReleasesUrl(response.headers);
if (nextUrl &&
!(0, util_1.validatePaginationUrl)(nextUrl, GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN)) {
core.warning(`Ignoring pagination link with unexpected origin: ${nextUrl}`);
break;
}
releasesUrl = nextUrl;
if (releases.length === 0) {
break;
}
if (pageCount >= util_1.MAX_PAGINATION_PAGES) {
core.warning(`Reached pagination safeguard limit (${util_1.MAX_PAGINATION_PAGES} pages) while listing GraalVM Community releases.`);
break;
}
} }
return [...availableVersions.values()]; return [...versions.values()];
}); });
} }
toCommunityReleaseForPlatform(asset, platform, arch, extension) { // Returns the GraalVM JDK version encoded in a release asset name when it
const match = asset.name.match(/^graalvm-community-jdk-(?<version>\d+(?:\.\d+)+)_(?<platform>linux|macos|windows)-(?<arch>x64|aarch64)_bin\.(?<extension>tar\.gz|zip)$/); // matches the requested platform/architecture/archive suffix, otherwise null.
if (!(match === null || match === void 0 ? void 0 : match.groups)) { extractAssetVersion(assetName, assetSuffix) {
if (!assetName.startsWith(GRAALVM_COMMUNITY_ASSET_PREFIX) ||
!assetName.endsWith(assetSuffix)) {
return null; return null;
} }
if (match.groups.platform !== platform || const rawVersion = assetName.slice(GRAALVM_COMMUNITY_ASSET_PREFIX.length, -assetSuffix.length);
match.groups.arch !== arch || if (!/^\d+(?:\.\d+)*$/.test(rawVersion)) {
match.groups.extension !== extension) {
return null; return null;
} }
return { return (0, util_1.convertVersionToSemver)(rawVersion);
version: (0, util_1.convertVersionToSemver)(match.groups.version), }
url: asset.browser_download_url getNextReleasesUrl(headers) {
}; const nextUrl = (0, util_1.getNextPageUrlFromLinkHeader)(headers);
if (nextUrl &&
!(0, util_1.validatePaginationUrl)(nextUrl, GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN)) {
core.warning(`Ignoring pagination link with unexpected origin: ${nextUrl}`);
return null;
}
return nextUrl;
} }
} }
exports.GraalVMCommunityDistribution = GraalVMCommunityDistribution; exports.GraalVMCommunityDistribution = GraalVMCommunityDistribution;
+55 -70
View File
@@ -30,6 +30,7 @@ const GRAALVM_COMMUNITY_RELEASES_URL =
const GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN = 'https://api.github.com'; const GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN = 'https://api.github.com';
const GRAALVM_COMMUNITY_DOWNLOAD_URL = const GRAALVM_COMMUNITY_DOWNLOAD_URL =
'https://github.com/graalvm/graalvm-ce-builds/releases'; 'https://github.com/graalvm/graalvm-ce-builds/releases';
const GRAALVM_COMMUNITY_ASSET_PREFIX = 'graalvm-community-jdk-';
const IS_WINDOWS = process.platform === 'win32'; const IS_WINDOWS = process.platform === 'win32';
const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform; const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform;
const GRAALVM_MIN_VERSION = 17; const GRAALVM_MIN_VERSION = 17;
@@ -350,11 +351,10 @@ export class GraalVMCommunityDistribution extends GraalVMDistribution {
const arch = this.getSupportedArchitecture(); const arch = this.getSupportedArchitecture();
const {platform, extension} = this.validateStableBuildRequest(range); const {platform, extension} = this.validateStableBuildRequest(range);
const availableVersions = await this.getAvailableVersionsForPlatform( // GraalVM Community asset names embed the platform, architecture and
platform, // archive type, e.g. `graalvm-community-jdk-21.0.2_linux-x64_bin.tar.gz`.
arch, const assetSuffix = `_${platform}-${arch}_bin.${extension}`;
extension const availableVersions = await this.getAvailableVersions(assetSuffix);
);
const satisfiedVersion = availableVersions const satisfiedVersion = availableVersions
.filter(item => isVersionSatisfies(range, item.version)) .filter(item => isVersionSatisfies(range, item.version))
@@ -373,24 +373,23 @@ export class GraalVMCommunityDistribution extends GraalVMDistribution {
return satisfiedVersion; return satisfiedVersion;
} }
private async getAvailableVersionsForPlatform( private async getAvailableVersions(
platform: OsVersions, assetSuffix: string
arch: SupportedArchitecture,
extension: string
): Promise<JavaDownloadRelease[]> { ): Promise<JavaDownloadRelease[]> {
const headers = getGitHubHttpHeaders(); const headers = getGitHubHttpHeaders();
const availableVersions = new Map<string, JavaDownloadRelease>(); const versions = new Map<string, JavaDownloadRelease>();
let releasesUrl: string | null = GRAALVM_COMMUNITY_RELEASES_URL; let releasesUrl: string | null = GRAALVM_COMMUNITY_RELEASES_URL;
let pageCount = 0;
while (releasesUrl) { for (let page = 0; releasesUrl && page < MAX_PAGINATION_PAGES; page++) {
pageCount++;
const response = await this.http.getJson<GraalVMCommunityRelease[]>( const response = await this.http.getJson<GraalVMCommunityRelease[]>(
releasesUrl, releasesUrl,
headers headers
); );
const releases = Array.isArray(response.result) ? response.result : []; const releases = response.result ?? [];
if (releases.length === 0) {
break;
}
for (const release of releases) { for (const release of releases) {
if (release.draft || release.prerelease) { if (release.draft || release.prerelease) {
@@ -398,74 +397,60 @@ export class GraalVMCommunityDistribution extends GraalVMDistribution {
} }
for (const asset of release.assets ?? []) { for (const asset of release.assets ?? []) {
const releaseForPlatform = this.toCommunityReleaseForPlatform( const version = this.extractAssetVersion(asset.name, assetSuffix);
asset, if (version) {
platform, versions.set(version, {
arch, version,
extension url: asset.browser_download_url
); });
if (releaseForPlatform) {
availableVersions.set(
releaseForPlatform.version,
releaseForPlatform
);
} }
} }
} }
const nextUrl = getNextPageUrlFromLinkHeader(response.headers); releasesUrl = this.getNextReleasesUrl(response.headers);
if (
nextUrl &&
!validatePaginationUrl(nextUrl, GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN)
) {
core.warning(
`Ignoring pagination link with unexpected origin: ${nextUrl}`
);
break;
}
releasesUrl = nextUrl;
if (releases.length === 0) {
break;
}
if (pageCount >= MAX_PAGINATION_PAGES) {
core.warning(
`Reached pagination safeguard limit (${MAX_PAGINATION_PAGES} pages) while listing GraalVM Community releases.`
);
break;
}
} }
return [...availableVersions.values()]; return [...versions.values()];
} }
private toCommunityReleaseForPlatform( // Returns the GraalVM JDK version encoded in a release asset name when it
asset: GraalVMCommunityAsset, // matches the requested platform/architecture/archive suffix, otherwise null.
platform: OsVersions, private extractAssetVersion(
arch: SupportedArchitecture, assetName: string,
extension: string assetSuffix: string
): JavaDownloadRelease | null { ): string | null {
const match = asset.name.match(
/^graalvm-community-jdk-(?<version>\d+(?:\.\d+)+)_(?<platform>linux|macos|windows)-(?<arch>x64|aarch64)_bin\.(?<extension>tar\.gz|zip)$/
);
if (!match?.groups) {
return null;
}
if ( if (
match.groups.platform !== platform || !assetName.startsWith(GRAALVM_COMMUNITY_ASSET_PREFIX) ||
match.groups.arch !== arch || !assetName.endsWith(assetSuffix)
match.groups.extension !== extension
) { ) {
return null; return null;
} }
return { const rawVersion = assetName.slice(
version: convertVersionToSemver(match.groups.version), GRAALVM_COMMUNITY_ASSET_PREFIX.length,
url: asset.browser_download_url -assetSuffix.length
}; );
if (!/^\d+(?:\.\d+)*$/.test(rawVersion)) {
return null;
}
return convertVersionToSemver(rawVersion);
}
private getNextReleasesUrl(
headers: Record<string, string | string[] | undefined>
): string | null {
const nextUrl = getNextPageUrlFromLinkHeader(headers);
if (
nextUrl &&
!validatePaginationUrl(nextUrl, GRAALVM_COMMUNITY_RELEASES_PAGE_ORIGIN)
) {
core.warning(
`Ignoring pagination link with unexpected origin: ${nextUrl}`
);
return null;
}
return nextUrl;
} }
} }