2022-12-13 12:45:14 +01:00
import fs from 'fs' ;
2019-07-10 10:54:25 -04:00
import * as core from '@actions/core' ;
2026-07-08 14:45:00 +05:30
import * as auth from './auth.js' ;
2023-03-09 14:49:35 +02:00
import {
getBooleanInput ,
isCacheFeatureAvailable ,
getVersionFromFileContent
2026-07-08 14:45:00 +05:30
} from './util.js' ;
import * as toolchains from './toolchains.js' ;
import * as constants from './constants.js' ;
import { restore } from './cache.js' ;
2019-07-11 22:57:54 -04:00
import * as path from 'path' ;
2026-07-08 14:45:00 +05:30
import { fileURLToPath } from 'url' ;
import { getJavaDistribution } from './distributions/distribution-factory.js' ;
import { JavaInstallerOptions } from './distributions/base-models.js' ;
import { configureMavenArgs } from './maven-args.js' ;
2019-07-10 10:54:25 -04:00
async function run() {
2019-07-10 23:11:48 -04:00
try {
2022-12-13 12:45:14 +01:00
const versions = core . getMultilineInput ( constants . INPUT_JAVA_VERSION ) ;
2026-07-07 20:49:12 +02:00
let distributionName = core . getInput ( constants . INPUT_DISTRIBUTION ) ;
2022-12-13 12:45:14 +01:00
const versionFile = core . getInput ( constants . INPUT_JAVA_VERSION_FILE ) ;
2021-04-05 13:02:27 +03:00
const architecture = core . getInput ( constants . INPUT_ARCHITECTURE ) ;
const packageType = core . getInput ( constants . INPUT_JAVA_PACKAGE ) ;
2026-07-08 12:44:58 -04:00
const jdkFile = getJdkFileInput ( ) ;
2021-08-20 01:19:35 +08:00
const cache = core . getInput ( constants . INPUT_CACHE ) ;
2023-11-23 00:43:14 +09:00
const cacheDependencyPath = core . getInput (
constants . INPUT_CACHE_DEPENDENCY_PATH
) ;
2021-04-05 13:02:27 +03:00
const checkLatest = getBooleanInput ( constants . INPUT_CHECK_LATEST , false ) ;
2026-07-07 18:38:57 +02:00
const setDefault = getBooleanInput ( constants . INPUT_SET_DEFAULT , true ) ;
2026-06-29 13:19:49 +01:00
const verifySignature = getBooleanInput (
constants . INPUT_VERIFY_SIGNATURE ,
false
) ;
const verifySignaturePublicKey =
core . getInput ( constants . INPUT_VERIFY_SIGNATURE_PUBLIC_KEY ) || undefined ;
2022-01-16 17:33:29 +01:00
let toolchainIds = core . getMultilineInput ( constants . INPUT_MVN_TOOLCHAIN_ID ) ;
2022-12-13 12:45:14 +01:00
core . startGroup ( 'Installed distributions' ) ;
2022-01-16 17:33:29 +01:00
if ( versions . length !== toolchainIds . length ) {
toolchainIds = [ ] ;
}
2021-04-05 13:02:27 +03:00
2022-12-13 12:45:14 +01:00
if ( ! versions . length && ! versionFile ) {
throw new Error ( 'java-version or java-version-file input expected' ) ;
}
if ( ! versions . length ) {
2023-03-09 14:49:35 +02:00
core . debug (
'java-version input is empty, looking for java-version-file input'
) ;
const content = fs . readFileSync ( versionFile ) . toString ( ) . trim ( ) ;
2022-12-13 12:45:14 +01:00
2026-07-07 20:49:12 +02:00
const versionInfo = getVersionFromFileContent (
2024-03-12 19:15:42 +05:30
content ,
distributionName ,
versionFile
) ;
2026-07-07 20:49:12 +02:00
core . debug ( ` Parsed version from file ' ${ versionInfo ? . version } ' ` ) ;
2022-12-13 12:45:14 +01:00
2026-07-07 20:49:12 +02:00
if ( ! versionInfo ) {
2023-03-09 14:49:35 +02:00
throw new Error (
` No supported version was found in file ${ versionFile } `
) ;
2022-09-08 15:26:54 +02:00
}
2026-07-07 20:49:12 +02:00
// Use distribution from file if available, otherwise use the input
if ( versionInfo . distribution ) {
core . info (
` Using distribution ' ${ versionInfo . distribution } ' from ${ versionFile } `
) ;
distributionName = versionInfo . distribution ;
} else if ( ! distributionName ) {
throw new Error (
'distribution input is required when not specified in the version file'
) ;
}
2022-12-13 12:45:14 +01:00
2026-07-07 20:49:12 +02:00
const installerInputsOptions : installerInputsOptions = {
architecture ,
packageType ,
checkLatest ,
setDefault ,
verifySignature ,
verifySignaturePublicKey ,
distributionName ,
jdkFile ,
toolchainIds
} ;
await installVersion ( versionInfo . version , installerInputsOptions ) ;
} else {
// When using java-version input, distribution is still required
if ( ! distributionName ) {
throw new Error ( 'distribution input is required' ) ;
}
const installerInputsOptions : installerInputsOptions = {
architecture ,
packageType ,
checkLatest ,
setDefault ,
verifySignature ,
verifySignaturePublicKey ,
distributionName ,
jdkFile ,
toolchainIds
} ;
for ( const [ index , version ] of versions . entries ( ) ) {
await installVersion ( version , installerInputsOptions , index ) ;
}
2019-08-13 16:24:39 -04:00
}
2022-09-08 15:26:54 +02:00
core . endGroup ( ) ;
2026-07-08 14:45:00 +05:30
const matchersPath = path . join (
path . dirname ( fileURLToPath ( import . meta . url ) ) ,
'..' ,
'..' ,
'.github'
) ;
2020-07-15 19:53:39 -06:00
core . info ( ` ##[add-matcher] ${ path . join ( matchersPath , 'java.json' ) } ` ) ;
2021-04-05 13:02:27 +03:00
await auth . configureAuthentication ( ) ;
2026-07-02 17:12:50 -04:00
configureMavenArgs ( ) ;
2022-04-01 00:39:57 +05:30
if ( cache && isCacheFeatureAvailable ( ) ) {
2023-11-23 00:43:14 +09:00
await restore ( cache , cacheDependencyPath ) ;
2021-08-20 01:19:35 +08:00
}
2019-07-10 23:11:48 -04:00
} catch ( error ) {
2023-11-29 19:41:46 +05:30
core . setFailed ( ( error as Error ) . message ) ;
2019-07-10 23:11:48 -04:00
}
2019-07-10 10:54:25 -04:00
}
run ( ) ;
2022-12-13 12:45:14 +01:00
2026-07-08 12:44:58 -04:00
function getJdkFileInput ( ) : string {
const jdkFile = core . getInput ( constants . INPUT_JDK_FILE ) ;
const deprecatedJdkFile = core . getInput ( constants . INPUT_JDK_FILE_DEPRECATED ) ;
if ( deprecatedJdkFile ) {
core . warning (
` The ' ${ constants . INPUT_JDK_FILE_DEPRECATED } ' input is deprecated and may be removed in a future release. Please use ' ${ constants . INPUT_JDK_FILE } ' instead. `
) ;
}
return jdkFile || deprecatedJdkFile ;
}
2023-03-09 14:49:35 +02:00
async function installVersion (
version : string ,
options : installerInputsOptions ,
toolchainId = 0
) {
2022-12-13 12:45:14 +01:00
const {
distributionName ,
jdkFile ,
architecture ,
packageType ,
checkLatest ,
2026-07-07 18:38:57 +02:00
setDefault ,
2026-06-29 13:19:49 +01:00
verifySignature ,
verifySignaturePublicKey ,
2022-12-13 12:45:14 +01:00
toolchainIds
} = options ;
const installerOptions : JavaInstallerOptions = {
architecture ,
packageType ,
checkLatest ,
2026-07-07 18:38:57 +02:00
setDefault ,
2026-06-29 13:19:49 +01:00
verifySignature ,
verifySignaturePublicKey ,
2022-12-13 12:45:14 +01:00
version
} ;
2023-03-09 14:49:35 +02:00
const distribution = getJavaDistribution (
distributionName ,
installerOptions ,
jdkFile
) ;
2022-12-13 12:45:14 +01:00
if ( ! distribution ) {
2023-03-09 14:49:35 +02:00
throw new Error (
` No supported distribution was found for input ${ distributionName } `
) ;
2022-12-13 12:45:14 +01:00
}
const result = await distribution . setupJava ( ) ;
2026-07-09 15:20:59 -04:00
// When the `latest` alias is used, the literal input isn't a real version, so
// pass the resolved version to the toolchains configuration instead.
const isLatest = version . trim ( ) . toLowerCase ( ) === 'latest' ;
const toolchainVersion = isLatest ? result.version : version ;
2022-12-13 12:45:14 +01:00
await toolchains . configureToolchains (
2026-07-09 15:20:59 -04:00
toolchainVersion ,
2022-12-13 12:45:14 +01:00
distributionName ,
result . path ,
toolchainIds [ toolchainId ]
) ;
core . info ( '' ) ;
core . info ( 'Java configuration:' ) ;
core . info ( ` Distribution: ${ distributionName } ` ) ;
core . info ( ` Version: ${ result . version } ` ) ;
core . info ( ` Path: ${ result . path } ` ) ;
core . info ( '' ) ;
}
interface installerInputsOptions {
architecture : string ;
packageType : string ;
checkLatest : boolean ;
2026-07-07 18:38:57 +02:00
setDefault : boolean ;
2026-06-29 13:19:49 +01:00
verifySignature : boolean ;
verifySignaturePublicKey : string | undefined ;
2022-12-13 12:45:14 +01:00
distributionName : string ;
jdkFile : string ;
toolchainIds : Array < string > ;
}