From d9458f008c0349c1d97093df274967c1472a9920 Mon Sep 17 00:00:00 2001 From: James Wald Date: Thu, 28 May 2026 21:03:20 -0400 Subject: [PATCH] Paginate through all available versions --- __tests__/distributors/zulu-installer.test.ts | 32 +++++++++++------ .../distributors/zulu-linux-installer.test.ts | 32 +++++++++++------ .../zulu-windows-installer.test.ts | 32 +++++++++++------ src/distributions/zulu/installer.ts | 34 ++++++++++++++----- 4 files changed, 91 insertions(+), 39 deletions(-) diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index 50976b37..95e7e436 100644 --- a/__tests__/distributors/zulu-installer.test.ts +++ b/__tests__/distributors/zulu-installer.test.ts @@ -17,7 +17,7 @@ describe('getAvailableVersions', () => { spyHttpClient.mockReturnValue({ statusCode: 200, headers: {}, - result: manifestData as IZuluVersions[] + result: [] as IZuluVersions[] }); spyUtilGetDownloadArchiveExtension = jest.spyOn( @@ -45,7 +45,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -54,7 +54,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -63,7 +63,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -72,7 +72,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -81,7 +81,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -90,7 +90,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -99,7 +99,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -108,7 +108,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -138,7 +138,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'macos'; - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); @@ -148,6 +148,18 @@ describe('getAvailableVersions', () => { ); it('load available versions', async () => { + spyHttpClient + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: manifestData as IZuluVersions[] + }) + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: [] as IZuluVersions[] + }); + const distribution = new ZuluDistribution({ version: '11', architecture: 'x86', diff --git a/__tests__/distributors/zulu-linux-installer.test.ts b/__tests__/distributors/zulu-linux-installer.test.ts index e3bbea0f..46f1bae9 100644 --- a/__tests__/distributors/zulu-linux-installer.test.ts +++ b/__tests__/distributors/zulu-linux-installer.test.ts @@ -18,7 +18,7 @@ describe('getAvailableVersions', () => { spyHttpClient.mockReturnValue({ statusCode: 200, headers: {}, - result: manifestData as IZuluVersions[] + result: [] as IZuluVersions[] }); spyUtilGetDownloadArchiveExtension = jest.spyOn( @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,7 +109,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -141,7 +141,7 @@ describe('getAvailableVersions', () => { distribution['getPlatformOption'] = () => 'linux'; // Override extension for linux default arch case to match util behavior spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz'); - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); @@ -151,6 +151,18 @@ describe('getAvailableVersions', () => { ); it('load available versions', async () => { + spyHttpClient + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: manifestData as IZuluVersions[] + }) + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: [] as IZuluVersions[] + }); + const distribution = new ZuluDistribution({ version: '11', architecture: 'x86', diff --git a/__tests__/distributors/zulu-windows-installer.test.ts b/__tests__/distributors/zulu-windows-installer.test.ts index bc454c99..441c0cdc 100644 --- a/__tests__/distributors/zulu-windows-installer.test.ts +++ b/__tests__/distributors/zulu-windows-installer.test.ts @@ -18,7 +18,7 @@ describe('getAvailableVersions', () => { spyHttpClient.mockReturnValue({ statusCode: 200, headers: {}, - result: manifestData as IZuluVersions[] + result: [] as IZuluVersions[] }); spyUtilGetDownloadArchiveExtension = jest.spyOn( @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,7 +109,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -139,7 +139,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'windows'; - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); @@ -149,6 +149,18 @@ describe('getAvailableVersions', () => { ); it('load available versions', async () => { + spyHttpClient + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: manifestData as IZuluVersions[] + }) + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: [] as IZuluVersions[] + }); + const distribution = new ZuluDistribution({ version: '11', architecture: 'x86', diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index 60274ce6..d37caf94 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -106,25 +106,41 @@ export class ZuluDistribution extends JavaBase { console.time('Retrieving available versions for Zulu took'); // eslint-disable-line no-console } - const requestArguments = [ + const baseRequestArguments = [ `os=${platform}`, `archive_type=${extension}`, `java_package_type=${bundleType}`, `javafx_bundled=${javafx}`, `arch=${arch}`, `release_status=${releaseStatus}`, - `availability_types=ca`, - `page=1`, - `page_size=1000` + `availability_types=ca` ].join('&'); - const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; + // need to iterate through all pages to retrieve the list of all versions + // Azul API doesn't provide a way to retrieve the count of pages so use an infinity loop + let page_index = 1; + const availableVersions: IZuluVersions[] = []; + while (true) { + const requestArguments = `${baseRequestArguments}&page=${page_index}&page_size=100`; + const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; + if (core.isDebug() && page_index === 1) { + // url is identical except page_index so print it once for debug + core.debug( + `Gathering available versions from '${availableVersionsUrl}'` + ); + } - core.debug(`Gathering available versions from '${availableVersionsUrl}'`); + const paginationPage = ( + await this.http.getJson(availableVersionsUrl) + ).result; + if (paginationPage === null || paginationPage.length === 0) { + // break infinity loop because we have reached end of pagination + break; + } - const availableVersions = - (await this.http.getJson>(availableVersionsUrl)) - .result ?? []; + availableVersions.push(...paginationPage); + page_index++; + } if (core.isDebug()) { core.startGroup('Print information about available versions');