Skip to content

Conversation

schdief
Copy link

@schdief schdief commented Oct 2, 2025

Description:

Microsoft JDK Distribution Refactoring

Summary

The Microsoft JDK installer has been refactored to fetch version information directly from the official Microsoft Learn documentation page instead of using a static JSON file stored in the repository.

Problems Solved

  1. Rate Limiting: The previous implementation fetched a JSON file from GitHub API, which could hit rate limits during workflow executions
  2. Outdated Versions: The static JSON file (microsoft-openjdk-versions.json) was outdated and didn't contain the latest Microsoft JDK releases
  3. Manual Updates Required: Every new Microsoft JDK release required manual updates to the JSON file

Files Modified

1. src/distributions/microsoft/installer.ts

Purpose: Core implementation of Microsoft JDK version fetching and installation

Changes:

  • ❌ Removed: getGitHubHttpHeaders import (no longer needed)
  • ❌ Removed: TypedResponse import (no longer needed)
  • ✅ Changed: getAvailableVersions() method - now fetches from Microsoft Learn instead of GitHub API
  • ✅ Added: parseVersionsFromHtml() method - extracts versions from HTML using regex
  • ✅ Added: generateDownloadFiles() method - dynamically creates download URLs

Before:

// Fetched static JSON from GitHub repository
const fileUrl = `https://api.github.com/repos/actions/setup-java/contents/microsoft-openjdk-versions.json`;
response = await this.http.getJson<tc.IToolRelease[]>(fileUrl, headers);

After:

// Fetches and parses Microsoft Learn page
const learnUrl = 'https://learn.microsoft.com/en-us/java/openjdk/download';
const response = await this.http.get(learnUrl);
const body = await response.readBody();
const releases = this.parseVersionsFromHtml(body);

Key Methods

getAvailableVersions()

  • Fetches the Microsoft Learn download page
  • Parses HTML to extract version information
  • Returns a structured list of available releases

parseVersionsFromHtml(html: string)

  • Uses regex pattern /OpenJDK\s+(\d+\.\d+\.\d+)(?:\s+LTS)?/gi to find version numbers
  • Extracts unique versions (e.g., 25.0.0, 21.0.8, 17.0.16, 11.0.28)
  • Sorts versions in descending order (newest first)

generateDownloadFiles(version: string, majorVersion: string)

  • Creates download file entries for all supported platforms and architectures
  • Generates aka.ms download URLs following Microsoft's naming convention
  • Supports:
    • Platforms: Linux, macOS, Windows
    • Architectures: x64, aarch64
    • Extensions: tar.gz (Linux/macOS), zip (Windows)

2. __tests__/distributors/microsoft-installer.test.ts

Purpose: Unit tests for Microsoft JDK installer

Changes:

  • ❌ Removed: data from '../data/microsoft.json' import
  • ❌ Removed: Mock for getJson method
  • ✅ Added: Mock HTML response with current versions
  • ✅ Added: Mock for get method returning HTML
  • ✅ Updated: Test expectations to use latest versions (25.0.0, 21.0.8, 17.0.16, 11.0.28)
  • ✅ Improved: Test descriptions with platform prefixes

Test Version Updates:

Old Version New Version Description
21.0.0 21.0.8 Latest JDK 21 LTS
17.0.7 17.0.16 Latest JDK 17 LTS
11.0.19 11.0.28 Latest JDK 11 LTS
N/A 25.0.0 New JDK 25 LTS

3. docs/advanced-usage.md

Purpose: User documentation for advanced usage scenarios

Changes:

  • ❌ Removed: Instructions about GitHub API rate limiting
  • ❌ Removed: Workaround using token input to increase rate limits
  • ✅ Added: Explanation that versions are now fetched from Microsoft Learn
  • ✅ Added: Note about the October 2025 change
  • ✅ Updated: Network access requirements (now learn.microsoft.com and aka.ms instead of github.com)
  • ✅ Simplified: Instructions for air-gapped environments

Before:

When dynamically downloading the Microsoft Build of OpenJDK distribution, 
`setup-java` makes a request to `actions/setup-java` to get available 
versions on github.com (outside of the appliance). These calls to 
`actions/setup-java` are made via unauthenticated requests, which are 
limited to 60 requests per hour per IP.

To get a higher rate limit, you can generate a personal access token...

After:

When dynamically downloading the Microsoft Build of OpenJDK distribution, 
`setup-java` fetches available versions directly from Microsoft Learn and 
downloads the JDK from `aka.ms` (Microsoft's content delivery network).

**Note:** As of October 2025, the action no longer uses the GitHub API 
to fetch version information, eliminating previous rate-limiting issues.

4. Files Deleted

src/distributions/microsoft/microsoft-openjdk-versions.json

  • Status: ❌ Deleted - No longer needed
  • Previous size: 839 lines with outdated version information
  • Last version listed: 21.0.2 (outdated)
  • Reason: Versions are now fetched dynamically from Microsoft Learn

Benefits

  1. No Rate Limiting: Direct HTTP GET requests to learn.microsoft.com don't count against GitHub API rate limits
  2. Always Up-to-Date: Automatically detects new versions as soon as Microsoft publishes them
  3. No Maintenance Required: No need to manually update version lists
  4. More Reliable: Fetches from the authoritative source (Microsoft Learn)

Impact Analysis

Users

No action required - Changes are transparent to users
Better experience - Always get latest versions
Fewer failures - No more rate limiting issues

Contributors

Less maintenance - No need to update version JSON files
Easier testing - Can test against live Microsoft releases

Operations

Reduced GitHub API usage - No more API calls for version info
Better reliability - Fetches from authoritative source
Self-updating - New versions available immediately after Microsoft releases


Network Requirements Change

Before

  • api.github.com - To fetch version information
  • aka.ms - To download JDK binaries
  • GitHub API token recommended to avoid rate limits

After

  • learn.microsoft.com - To fetch version information
  • aka.ms - To download JDK binaries
  • No authentication required
  • No rate limits for version discovery

Backward Compatibility

100% Compatible - Existing workflows continue to work unchanged
Same API - No changes to action inputs or outputs
Same behavior - Downloads and installs JDK the same way
Better versions - Now includes latest releases that were missing before


Current Supported Versions (as of Oct 2025)

Based on the refactored implementation, the following versions are automatically detected:

  • OpenJDK 25.0.0 LTS (Latest)
  • OpenJDK 21.0.8 LTS
  • OpenJDK 17.0.16 LTS
  • OpenJDK 11.0.28 LTS

Download URL Pattern

The download URLs follow Microsoft's standard pattern:

https://aka.ms/download-jdk/microsoft-jdk-{version}-{os}-{arch}.{ext}

Where:

  • {version}: Version number (e.g., 21.0.8)
  • {os}: Operating system (linux, macos, windows)
  • {arch}: Architecture (x64, aarch64)
  • {ext}: File extension (tar.gz, zip)

Example URLs

https://aka.ms/download-jdk/microsoft-jdk-21.0.8-linux-x64.tar.gz
https://aka.ms/download-jdk/microsoft-jdk-21.0.8-macos-aarch64.tar.gz
https://aka.ms/download-jdk/microsoft-jdk-21.0.8-windows-x64.zip

Testing

Running Tests

npm test -- microsoft-installer.test.ts

Testing Checklist

  • Unit tests updated and passing
  • Version parsing works correctly
  • Download URLs are properly formatted
  • All platforms supported (Linux, macOS, Windows)
  • All architectures supported (x64, aarch64)
  • Documentation updated
  • Backward compatibility maintained

Rollback Plan (If Needed)

If issues are discovered, rollback requires:

  1. Revert changes to installer.ts
  2. Revert changes to test file
  3. Restore old getAvailableVersions() method
  4. Recreate microsoft-openjdk-versions.json file with updated versions
  5. Revert documentation changes

Note: The old JSON file has been deleted. If needed, it can be retrieved from git history (commit before this refactoring).


Success Metrics

  • ✅ No GitHub API rate limit errors for Microsoft JDK
  • ✅ Latest Microsoft JDK versions available immediately
  • ✅ Reduced maintenance burden on repository maintainers
  • ✅ Improved reliability for GHES users
  • ✅ Zero regression in existing functionality

References

Related issue:
image

#645

Check list:

  • Mark if documentation changes are required.
  • Mark if tests were added or updated to cover the changes.

…crosoft Learn

- Removed dependency on static JSON file for version info
- Implemented HTML parsing to dynamically retrieve available JDK versions
- Updated unit tests to reflect new version fetching method
- Revised documentation to reflect changes in version retrieval and network requirements
- Deleted outdated JSON file as it is no longer needed
@schdief schdief requested a review from a team as a code owner October 2, 2025 14:25
@schdief
Copy link
Author

schdief commented Oct 2, 2025

tested it from my fork repo, works as can be seen below

You may find this change to drastic and it may break if MS changes their website. Alternative I could also provide a GitHub Action to this repo, that updates the previously used static json file and bakes it into the action, to keep it up to date and avoid the rate limiting on GHES.

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant