Compare commits

...

5 Commits

Author SHA1 Message Date
Bruno Borges 00f876fcdf Merge branch 'main' into copilot/add-force-download-option 2026-07-28 00:38:55 -04:00
Copilot e07d36bbdd Set GRAALVM_HOME for GraalVM distributions (#1146)
* Initial plan

* Set GRAALVM_HOME for GraalVM distributions

* Rebuild setup action bundle

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-07-27 22:27:24 -04:00
copilot-swe-agent[bot] ed32408250 Build force-download action bundles 2026-07-28 02:13:45 +00:00
copilot-swe-agent[bot] 98c23c3cba Add force-download input 2026-07-28 02:09:59 +00:00
copilot-swe-agent[bot] 9c42e48e88 Initial plan 2026-07-28 02:03:50 +00:00
13 changed files with 122 additions and 7 deletions
+2
View File
@@ -56,6 +56,8 @@ For more details, see the full release notes on the [releases page](https://git
- `check-latest`: Setting this option makes the action to check for the latest available version for the version spec. - `check-latest`: Setting this option makes the action to check for the latest available version for the version spec.
- `force-download`: Set to `true` to always download Java and replace any matching version in the tool cache. This can help make builds reproducible when a runner image has modified a pre-installed JDK, such as its `cacerts` file. Default value: `false`.
- `set-default`: Set to `false` to install a JDK without making it the default. When `false`, `JAVA_HOME` and `PATH` are not updated, but `JAVA_HOME_<major>_<arch>` is still set so the JDK remains discoverable. Default value: `true`. See [Installing JDK without setting as default](docs/advanced-usage.md#Installing-JDK-without-setting-as-default) for more details. - `set-default`: Set to `false` to install a JDK without making it the default. When `false`, `JAVA_HOME` and `PATH` are not updated, but `JAVA_HOME_<major>_<arch>` is still set so the JDK remains discoverable. Default value: `true`. See [Installing JDK without setting as default](docs/advanced-usage.md#Installing-JDK-without-setting-as-default) for more details.
- `problem-matcher`: Set to `false` to disable Java problem matcher annotations (compiler diagnostics and uncaught exceptions). Default value: `true`. See [Java problem matcher](docs/advanced-usage.md#java-problem-matcher-compiler-annotations) for details and annotation limits. - `problem-matcher`: Set to `false` to disable Java problem matcher annotations (compiler diagnostics and uncaught exceptions). Default value: `true`. See [Java problem matcher](docs/advanced-usage.md#java-problem-matcher-compiler-annotations) for details and annotation limits.
@@ -443,6 +443,35 @@ describe('setupJava', () => {
); );
}); });
it('should download java when force-download is enabled, even if the version is cached', async () => {
mockJavaBase = new EmptyJavaBase({
version: actualJavaVersion,
architecture: 'x86',
packageType: 'jdk',
checkLatest: false,
forceDownload: true
});
const findInToolcache = jest.fn(() => ({
version: actualJavaVersion,
path: javaPathInstalled
}));
mockJavaBase['findInToolcache'] = findInToolcache;
await expect(mockJavaBase.setupJava()).resolves.toEqual({
version: actualJavaVersion,
path: javaPathInstalled
});
expect(findInToolcache).not.toHaveBeenCalled();
expect(spyCoreInfo).toHaveBeenCalledWith('Trying to download...');
expect(spyCoreInfo).toHaveBeenCalledWith(
`Java ${actualJavaVersion} was downloaded`
);
expect(spyCoreInfo).not.toHaveBeenCalledWith(
`Resolved Java ${actualJavaVersion} from tool-cache`
);
});
it.each([ it.each([
[ [
{ {
@@ -166,6 +166,29 @@ describe('GraalVMDistribution', () => {
}); });
}); });
describe('setJavaDefault', () => {
it('should set GRAALVM_HOME for Oracle GraalVM', () => {
(distribution as any).setJavaDefault('17.0.5', '/cached/java/path');
expect(core.exportVariable).toHaveBeenCalledWith(
'GRAALVM_HOME',
'/cached/java/path'
);
});
it('should set GRAALVM_HOME for GraalVM Community', () => {
(communityDistribution as any).setJavaDefault(
'17.0.5',
'/cached/java/path'
);
expect(core.exportVariable).toHaveBeenCalledWith(
'GRAALVM_HOME',
'/cached/java/path'
);
});
});
describe('downloadTool', () => { describe('downloadTool', () => {
const javaRelease = { const javaRelease = {
version: '17.0.5', version: '17.0.5',
@@ -208,6 +208,29 @@ describe('setupJava', () => {
); );
}); });
it('java is unpacked from jdkfile when force-download is enabled', async () => {
const inputs = {
version: actualJavaVersion,
architecture: 'x86',
packageType: 'jdk',
checkLatest: false,
forceDownload: true
};
mockJavaBase = new LocalDistribution(inputs, expectedJdkFile);
await expect(mockJavaBase.setupJava()).resolves.toEqual({
version: actualJavaVersion,
path: javaPath
});
expect(spyGetToolcachePath).not.toHaveBeenCalled();
expect(spyUtilsExtractJdkFile).toHaveBeenCalledWith(expectedJdkFile);
expect(spyTcCacheDir).toHaveBeenCalled();
expect(spyCoreInfo).not.toHaveBeenCalledWith(
`Resolved Java ${actualJavaVersion} from tool-cache`
);
});
it("java is resolved from toolcache, jdkfile doesn't exist", async () => { it("java is resolved from toolcache, jdkfile doesn't exist", async () => {
const inputs = { const inputs = {
version: actualJavaVersion, version: actualJavaVersion,
+4
View File
@@ -30,6 +30,10 @@ inputs:
description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec' description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec'
required: false required: false
default: false default: false
force-download:
description: 'Set this option to always download Java and replace any matching version in the tool cache'
required: false
default: false
set-default: set-default:
description: 'Set this option to false if you want to install a JDK but not make it the default. When false, JAVA_HOME and PATH are not updated, but JAVA_HOME_<major>_<arch> is still set.' description: 'Set this option to false if you want to install a JDK but not make it the default. When false, JAVA_HOME and PATH are not updated, but JAVA_HOME_<major>_<arch> is still set.'
required: false required: false
+1
View File
@@ -97311,6 +97311,7 @@ const INPUT_DISTRIBUTION = 'distribution';
const INPUT_JDK_FILE = 'jdk-file'; const INPUT_JDK_FILE = 'jdk-file';
const INPUT_JDK_FILE_DEPRECATED = 'jdkFile'; const INPUT_JDK_FILE_DEPRECATED = 'jdkFile';
const INPUT_CHECK_LATEST = 'check-latest'; const INPUT_CHECK_LATEST = 'check-latest';
const INPUT_FORCE_DOWNLOAD = 'force-download';
const INPUT_SET_DEFAULT = 'set-default'; const INPUT_SET_DEFAULT = 'set-default';
const INPUT_PROBLEM_MATCHER = 'problem-matcher'; const INPUT_PROBLEM_MATCHER = 'problem-matcher';
const INPUT_VERIFY_SIGNATURE = 'verify-signature'; const INPUT_VERIFY_SIGNATURE = 'verify-signature';
+16 -4
View File
@@ -72088,6 +72088,7 @@ const INPUT_DISTRIBUTION = 'distribution';
const INPUT_JDK_FILE = 'jdk-file'; const INPUT_JDK_FILE = 'jdk-file';
const INPUT_JDK_FILE_DEPRECATED = 'jdkFile'; const INPUT_JDK_FILE_DEPRECATED = 'jdkFile';
const INPUT_CHECK_LATEST = 'check-latest'; const INPUT_CHECK_LATEST = 'check-latest';
const INPUT_FORCE_DOWNLOAD = 'force-download';
const INPUT_SET_DEFAULT = 'set-default'; const INPUT_SET_DEFAULT = 'set-default';
const INPUT_PROBLEM_MATCHER = 'problem-matcher'; const INPUT_PROBLEM_MATCHER = 'problem-matcher';
const INPUT_VERIFY_SIGNATURE = 'verify-signature'; const INPUT_VERIFY_SIGNATURE = 'verify-signature';
@@ -129290,6 +129291,7 @@ class JavaBase {
stable; stable;
latest; latest;
checkLatest; checkLatest;
forceDownload;
setDefault; setDefault;
verifySignature; verifySignature;
verifySignaturePublicKey; verifySignaturePublicKey;
@@ -129307,6 +129309,7 @@ class JavaBase {
this.architecture = installerOptions.architecture || external_os_default().arch(); this.architecture = installerOptions.architecture || external_os_default().arch();
this.packageType = installerOptions.packageType; this.packageType = installerOptions.packageType;
this.checkLatest = installerOptions.checkLatest; this.checkLatest = installerOptions.checkLatest;
this.forceDownload = installerOptions.forceDownload ?? false;
this.setDefault = this.setDefault =
installerOptions.setDefault !== undefined installerOptions.setDefault !== undefined
? installerOptions.setDefault ? installerOptions.setDefault
@@ -129318,7 +129321,7 @@ class JavaBase {
if (this.verifySignature && !this.supportsSignatureVerification()) { if (this.verifySignature && !this.supportsSignatureVerification()) {
throw new Error(`Input 'verify-signature' is not supported for distribution '${this.distribution}'.`); throw new Error(`Input 'verify-signature' is not supported for distribution '${this.distribution}'.`);
} }
let foundJava = this.findInToolcache(); let foundJava = this.forceDownload ? null : this.findInToolcache();
if (foundJava && !this.checkLatest && !this.latest) { if (foundJava && !this.checkLatest && !this.latest) {
info(`Resolved Java ${foundJava.version} from tool-cache`); info(`Resolved Java ${foundJava.version} from tool-cache`);
} }
@@ -129342,7 +129345,8 @@ class JavaBase {
} }
const javaRelease = await this.findPackageForDownload(this.version); const javaRelease = await this.findPackageForDownload(this.version);
info(`Resolved latest version as ${javaRelease.version}`); info(`Resolved latest version as ${javaRelease.version}`);
if (foundJava?.version === javaRelease.version) { if (!this.forceDownload &&
foundJava?.version === javaRelease.version) {
info(`Resolved Java ${foundJava.version} from tool-cache`); info(`Resolved Java ${foundJava.version} from tool-cache`);
} }
else { else {
@@ -129617,7 +129621,7 @@ class LocalDistribution extends JavaBase {
if (this.latest) { if (this.latest) {
throw new Error("The 'latest' version alias is not supported for the 'jdkfile' distribution. Please specify a concrete version."); throw new Error("The 'latest' version alias is not supported for the 'jdkfile' distribution. Please specify a concrete version.");
} }
let foundJava = this.findInToolcache(); let foundJava = this.forceDownload ? null : this.findInToolcache();
if (foundJava) { if (foundJava) {
info(`Resolved Java ${foundJava.version} from tool-cache`); info(`Resolved Java ${foundJava.version} from tool-cache`);
} }
@@ -131328,6 +131332,10 @@ class GraalVMDistribution extends JavaBase {
throw error; throw error;
} }
} }
setJavaDefault(version, toolPath) {
super.setJavaDefault(version, toolPath);
exportVariable('GRAALVM_HOME', toolPath);
}
async findPackageForDownload(range) { async findPackageForDownload(range) {
this.validateVersionRange(range); this.validateVersionRange(range);
const arch = this.getSupportedArchitecture(); const arch = this.getSupportedArchitecture();
@@ -132037,6 +132045,7 @@ async function run() {
const cache = getInput(INPUT_CACHE); const cache = getInput(INPUT_CACHE);
const cacheDependencyPath = getInput(INPUT_CACHE_DEPENDENCY_PATH); const cacheDependencyPath = getInput(INPUT_CACHE_DEPENDENCY_PATH);
const checkLatest = util_getBooleanInput(INPUT_CHECK_LATEST, false); const checkLatest = util_getBooleanInput(INPUT_CHECK_LATEST, false);
const forceDownload = util_getBooleanInput(INPUT_FORCE_DOWNLOAD, false);
const setDefault = util_getBooleanInput(INPUT_SET_DEFAULT, true); const setDefault = util_getBooleanInput(INPUT_SET_DEFAULT, true);
const verifySignature = util_getBooleanInput(INPUT_VERIFY_SIGNATURE, false); const verifySignature = util_getBooleanInput(INPUT_VERIFY_SIGNATURE, false);
const verifySignaturePublicKey = getInput(INPUT_VERIFY_SIGNATURE_PUBLIC_KEY) || undefined; const verifySignaturePublicKey = getInput(INPUT_VERIFY_SIGNATURE_PUBLIC_KEY) || undefined;
@@ -132068,6 +132077,7 @@ async function run() {
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
@@ -132086,6 +132096,7 @@ async function run() {
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
@@ -132120,11 +132131,12 @@ function getJdkFileInput() {
return jdkFile || deprecatedJdkFile; return jdkFile || deprecatedJdkFile;
} }
async function installVersion(version, options, toolchainId = 0) { async function installVersion(version, options, toolchainId = 0) {
const { distributionName, jdkFile, architecture, packageType, checkLatest, setDefault, verifySignature, verifySignaturePublicKey, toolchainIds } = options; const { distributionName, jdkFile, architecture, packageType, checkLatest, forceDownload, setDefault, verifySignature, verifySignaturePublicKey, toolchainIds } = options;
const installerOptions = { const installerOptions = {
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
+1
View File
@@ -7,6 +7,7 @@ export const INPUT_DISTRIBUTION = 'distribution';
export const INPUT_JDK_FILE = 'jdk-file'; export const INPUT_JDK_FILE = 'jdk-file';
export const INPUT_JDK_FILE_DEPRECATED = 'jdkFile'; export const INPUT_JDK_FILE_DEPRECATED = 'jdkFile';
export const INPUT_CHECK_LATEST = 'check-latest'; export const INPUT_CHECK_LATEST = 'check-latest';
export const INPUT_FORCE_DOWNLOAD = 'force-download';
export const INPUT_SET_DEFAULT = 'set-default'; export const INPUT_SET_DEFAULT = 'set-default';
export const INPUT_PROBLEM_MATCHER = 'problem-matcher'; export const INPUT_PROBLEM_MATCHER = 'problem-matcher';
export const INPUT_VERIFY_SIGNATURE = 'verify-signature'; export const INPUT_VERIFY_SIGNATURE = 'verify-signature';
+7 -2
View File
@@ -25,6 +25,7 @@ export abstract class JavaBase {
protected stable: boolean; protected stable: boolean;
protected latest: boolean; protected latest: boolean;
protected checkLatest: boolean; protected checkLatest: boolean;
protected forceDownload: boolean;
protected setDefault: boolean; protected setDefault: boolean;
protected verifySignature: boolean; protected verifySignature: boolean;
protected verifySignaturePublicKey: string | undefined; protected verifySignaturePublicKey: string | undefined;
@@ -46,6 +47,7 @@ export abstract class JavaBase {
this.architecture = installerOptions.architecture || os.arch(); this.architecture = installerOptions.architecture || os.arch();
this.packageType = installerOptions.packageType; this.packageType = installerOptions.packageType;
this.checkLatest = installerOptions.checkLatest; this.checkLatest = installerOptions.checkLatest;
this.forceDownload = installerOptions.forceDownload ?? false;
this.setDefault = this.setDefault =
installerOptions.setDefault !== undefined installerOptions.setDefault !== undefined
? installerOptions.setDefault ? installerOptions.setDefault
@@ -68,7 +70,7 @@ export abstract class JavaBase {
); );
} }
let foundJava = this.findInToolcache(); let foundJava = this.forceDownload ? null : this.findInToolcache();
if (foundJava && !this.checkLatest && !this.latest) { if (foundJava && !this.checkLatest && !this.latest) {
core.info(`Resolved Java ${foundJava.version} from tool-cache`); core.info(`Resolved Java ${foundJava.version} from tool-cache`);
} else { } else {
@@ -91,7 +93,10 @@ export abstract class JavaBase {
} }
const javaRelease = await this.findPackageForDownload(this.version); const javaRelease = await this.findPackageForDownload(this.version);
core.info(`Resolved latest version as ${javaRelease.version}`); core.info(`Resolved latest version as ${javaRelease.version}`);
if (foundJava?.version === javaRelease.version) { if (
!this.forceDownload &&
foundJava?.version === javaRelease.version
) {
core.info(`Resolved Java ${foundJava.version} from tool-cache`); core.info(`Resolved Java ${foundJava.version} from tool-cache`);
} else { } else {
core.info('Trying to download...'); core.info('Trying to download...');
+1
View File
@@ -3,6 +3,7 @@ export interface JavaInstallerOptions {
architecture: string; architecture: string;
packageType: string; packageType: string;
checkLatest: boolean; checkLatest: boolean;
forceDownload?: boolean;
setDefault?: boolean; setDefault?: boolean;
verifySignature?: boolean; verifySignature?: boolean;
verifySignaturePublicKey?: string; verifySignaturePublicKey?: string;
+5
View File
@@ -110,6 +110,11 @@ export class GraalVMDistribution extends JavaBase {
} }
} }
protected setJavaDefault(version: string, toolPath: string): void {
super.setJavaDefault(version, toolPath);
core.exportVariable('GRAALVM_HOME', toolPath);
}
protected async findPackageForDownload( protected async findPackageForDownload(
range: string range: string
): Promise<JavaDownloadRelease> { ): Promise<JavaDownloadRelease> {
+1 -1
View File
@@ -28,7 +28,7 @@ export class LocalDistribution extends JavaBase {
); );
} }
let foundJava = this.findInToolcache(); let foundJava = this.forceDownload ? null : this.findInToolcache();
if (foundJava) { if (foundJava) {
core.info(`Resolved Java ${foundJava.version} from tool-cache`); core.info(`Resolved Java ${foundJava.version} from tool-cache`);
+9
View File
@@ -29,6 +29,10 @@ async function run() {
constants.INPUT_CACHE_DEPENDENCY_PATH constants.INPUT_CACHE_DEPENDENCY_PATH
); );
const checkLatest = getBooleanInput(constants.INPUT_CHECK_LATEST, false); const checkLatest = getBooleanInput(constants.INPUT_CHECK_LATEST, false);
const forceDownload = getBooleanInput(
constants.INPUT_FORCE_DOWNLOAD,
false
);
const setDefault = getBooleanInput(constants.INPUT_SET_DEFAULT, true); const setDefault = getBooleanInput(constants.INPUT_SET_DEFAULT, true);
const verifySignature = getBooleanInput( const verifySignature = getBooleanInput(
constants.INPUT_VERIFY_SIGNATURE, constants.INPUT_VERIFY_SIGNATURE,
@@ -83,6 +87,7 @@ async function run() {
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
@@ -102,6 +107,7 @@ async function run() {
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
@@ -159,6 +165,7 @@ async function installVersion(
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
@@ -169,6 +176,7 @@ async function installVersion(
architecture, architecture,
packageType, packageType,
checkLatest, checkLatest,
forceDownload,
setDefault, setDefault,
verifySignature, verifySignature,
verifySignaturePublicKey, verifySignaturePublicKey,
@@ -212,6 +220,7 @@ interface installerInputsOptions {
architecture: string; architecture: string;
packageType: string; packageType: string;
checkLatest: boolean; checkLatest: boolean;
forceDownload: boolean;
setDefault: boolean; setDefault: boolean;
verifySignature: boolean; verifySignature: boolean;
verifySignaturePublicKey: string | undefined; verifySignaturePublicKey: string | undefined;