diff --git a/__tests__/installer.test.ts b/__tests__/installer.test.ts index ff2d61b5..542d8f43 100644 --- a/__tests__/installer.test.ts +++ b/__tests__/installer.test.ts @@ -156,4 +156,32 @@ describe('installer tests', () => { expect(thrown).toBe(true); return; }); + + it('wrong maven version of Maven has to throw error', async () => { + let thrown = false; + try { + await installer.getMaven('2-3-4'); + } catch (e) { + thrown = true; + } + expect(thrown).toBe(true); + }); + + it('Installs version of Maven and stores it to cache', async () => { + await installer.getMaven('3.6.3'); + const mvnDir = path.join(toolDir, 'mvn', '3.6.3', 'x64'); + + expect(fs.existsSync(`${mvnDir}.complete`)).toBe(true); + expect(fs.existsSync(path.join(mvnDir))).toBe(true); + }, 100000); + + it('Uses version of Maven installed in cache', async () => { + const mvnDir: string = path.join(toolDir, 'mvn', '3.6.3', 'x64'); + console.log(mvnDir); + await io.mkdirP(mvnDir); + fs.writeFileSync(`${mvnDir}.complete`, 'hello'); + // This will throw if it doesn't find it in the cache (because no such version exists) + await installer.getMaven('3.6.3'); + return; + }); }); diff --git a/action.yml b/action.yml index 8212ec95..e862b73b 100644 --- a/action.yml +++ b/action.yml @@ -9,6 +9,9 @@ inputs: Early access versions can be specified in the form of e.g. 14-ea, 14.0.0-ea, or 14.0.0-ea.28' required: true + maven-version: + description: 'Version of maven, does not setup maven if version is not provided. + check available versions here https://downloads.apache.org/maven/' maven-ca-cert-b64: description: 'CA cert in the format of a base64 blob used to connect to private maven repo protected by MTLS' diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 87609ede..e5e52d2d 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -1029,7 +1029,7 @@ module.exports = require("child_process"); "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_MAVEN_SECURITY_SETTINGS_B64 = exports.INPUT_MAVEN_SETTINGS_B64 = exports.INPUT_MAVEN_KEYSTORE_PASSWORD = exports.INPUT_MAVEN_KEYSTORE_P12_B64 = exports.INPUT_MAVEN_CA_CERT_B64 = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_JDK_FILE = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.INPUT_VERSION = void 0; +exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_MAVEN_VERSION = exports.INPUT_MAVEN_SECURITY_SETTINGS_B64 = exports.INPUT_MAVEN_SETTINGS_B64 = exports.INPUT_MAVEN_KEYSTORE_PASSWORD = exports.INPUT_MAVEN_KEYSTORE_P12_B64 = exports.INPUT_MAVEN_CA_CERT_B64 = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_JDK_FILE = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.INPUT_VERSION = void 0; exports.INPUT_VERSION = 'version'; exports.INPUT_JAVA_VERSION = 'java-version'; exports.INPUT_ARCHITECTURE = 'architecture'; @@ -1046,6 +1046,7 @@ exports.INPUT_MAVEN_KEYSTORE_P12_B64 = 'maven-keystore-p12-b64'; exports.INPUT_MAVEN_KEYSTORE_PASSWORD = 'maven-keystore-password'; exports.INPUT_MAVEN_SETTINGS_B64 = 'maven-settings-b64'; exports.INPUT_MAVEN_SECURITY_SETTINGS_B64 = 'maven-security-settings-b64'; +exports.INPUT_MAVEN_VERSION = 'maven-version'; exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined; exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE'; exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint'; diff --git a/dist/setup/index.js b/dist/setup/index.js index 8ee7ae36..aec00b63 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -11056,7 +11056,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.setupMaven = exports.validateOptions = void 0; +exports.setupMaven = exports.isValidOptions = exports.validateOptions = void 0; const core = __importStar(__webpack_require__(470)); const fs = __importStar(__webpack_require__(747)); const path = __importStar(__webpack_require__(622)); @@ -11064,17 +11064,29 @@ const constants = __importStar(__webpack_require__(694)); const os = __importStar(__webpack_require__(87)); const io = __importStar(__webpack_require__(1)); function validateOptions(opts) { - if ((opts.caCert === '' || + if (opts.caCert === '' || opts.keystore === '' || opts.password === '' || - opts.securitySettings === '', - opts.settings === '')) { + opts.securitySettings === '' || + opts.settings === '') { core.debug('maven options set is not valid: some field is empty'); return false; } return true; } exports.validateOptions = validateOptions; +function isValidOptions(mvnOpts) { + if ((mvnOpts.caCert !== '' || + mvnOpts.keystore !== '' || + mvnOpts.password !== '' || + mvnOpts.securitySettings !== '', + mvnOpts.settings !== '') && + !validateOptions(mvnOpts)) { + return false; + } + return true; +} +exports.isValidOptions = isValidOptions; function setupMaven(opts) { return __awaiter(this, void 0, void 0, function* () { const settingsDir = path.join(core.getInput(constants.INPUT_SETTINGS_PATH) || os.homedir(), core.getInput(constants.INPUT_SETTINGS_PATH) ? '' : '.m2'); @@ -30166,7 +30178,7 @@ exports.StaticRangeImpl = StaticRangeImpl; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_MAVEN_SECURITY_SETTINGS_B64 = exports.INPUT_MAVEN_SETTINGS_B64 = exports.INPUT_MAVEN_KEYSTORE_PASSWORD = exports.INPUT_MAVEN_KEYSTORE_P12_B64 = exports.INPUT_MAVEN_CA_CERT_B64 = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_JDK_FILE = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.INPUT_VERSION = void 0; +exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_MAVEN_VERSION = exports.INPUT_MAVEN_SECURITY_SETTINGS_B64 = exports.INPUT_MAVEN_SETTINGS_B64 = exports.INPUT_MAVEN_KEYSTORE_PASSWORD = exports.INPUT_MAVEN_KEYSTORE_P12_B64 = exports.INPUT_MAVEN_CA_CERT_B64 = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_JDK_FILE = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.INPUT_VERSION = void 0; exports.INPUT_VERSION = 'version'; exports.INPUT_JAVA_VERSION = 'java-version'; exports.INPUT_ARCHITECTURE = 'architecture'; @@ -30183,6 +30195,7 @@ exports.INPUT_MAVEN_KEYSTORE_P12_B64 = 'maven-keystore-p12-b64'; exports.INPUT_MAVEN_KEYSTORE_PASSWORD = 'maven-keystore-password'; exports.INPUT_MAVEN_SETTINGS_B64 = 'maven-settings-b64'; exports.INPUT_MAVEN_SECURITY_SETTINGS_B64 = 'maven-security-settings-b64'; +exports.INPUT_MAVEN_VERSION = 'maven-version'; exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined; exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE'; exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint'; @@ -33363,12 +33376,8 @@ function run() { settings: core.getInput(constants.INPUT_MAVEN_SETTINGS_B64), securitySettings: core.getInput(constants.INPUT_MAVEN_SECURITY_SETTINGS_B64) }; - if ((mvnOpts.caCert !== '' || - mvnOpts.keystore !== '' || - mvnOpts.password !== '' || - mvnOpts.securitySettings !== '', - mvnOpts.settings !== '') && - !maven_1.validateOptions(mvnOpts)) { + const mvnVersion = core.getInput(constants.INPUT_MAVEN_VERSION); + if (!maven_1.isValidOptions(mvnOpts)) { throw new Error('Some of the Maven options is empty: please check maven-* parameters'); } const arch = core.getInput(constants.INPUT_ARCHITECTURE, { required: true }); @@ -33380,6 +33389,7 @@ function run() { }); const jdkFile = core.getInput(constants.INPUT_JDK_FILE, { required: false }); yield installer.getJava(version, arch, jdkFile, javaPackage); + yield installer.getMaven(mvnVersion); const matchersPath = path.join(__dirname, '..', '..', '.github'); core.info(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); const id = core.getInput(constants.INPUT_SERVER_ID, { required: false }); @@ -38708,7 +38718,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getJava = void 0; +exports.getJava = exports.getMaven = void 0; const core = __importStar(__webpack_require__(470)); const io = __importStar(__webpack_require__(1)); const exec = __importStar(__webpack_require__(986)); @@ -38720,6 +38730,31 @@ const semver = __importStar(__webpack_require__(280)); const util = __importStar(__webpack_require__(322)); const tempDirectory = util.getTempDir(); const IS_WINDOWS = util.isWindows(); +function getMaven(version) { + return __awaiter(this, void 0, void 0, function* () { + const tmpVersions = version.split('.'); + if (tmpVersions.length < 2) { + throw new Error(`wrong version is set(${version}): supported version template: major.minor.patch`); + } + const majorVersion = tmpVersions[0]; + let toolPath = tc.find('mvn', version); + if (toolPath) { + core.debug(`Tool found in cache ${toolPath}`); + } + else { + core.debug(`Downloading Maven from https://downloads.apache.org/maven/maven-${majorVersion}`); + const url = path.join(`https:///downloads.apache.org/maven/maven-${majorVersion}`, version, `binaries/apache-maven-${version}-bin.tar.gz`); + console.log(url); + const mvnTarFile = yield tc.downloadTool(url); + let tempDir = path.join(tempDirectory, 'temp_' + Math.floor(Math.random() * 2000000000)); + yield extractFiles(mvnTarFile, '.tar.gz', tempDir); + core.debug(`maven extracted to ${tempDir}`); + toolPath = yield tc.cacheDir(path.join(tempDir, `apache-maven-${version}`), 'mvn', version, 'x64'); + } + core.exportVariable('MAVEN_HOME', toolPath); + }); +} +exports.getMaven = getMaven; function getJava(version, arch, jdkFile, javaPackage) { return __awaiter(this, void 0, void 0, function* () { let toolPath = tc.find(javaPackage, version); diff --git a/package-lock.json b/package-lock.json index e818bc19..8656ba83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "setup-java", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -13,7 +14,7 @@ "@actions/http-client": "^1.0.9", "@actions/io": "^1.0.0", "@actions/tool-cache": "^1.6.1", - "@tradeshift/actions-credentials-yaml": "^0.7.0", + "jtest": "^0.0.1", "semver": "^6.1.1", "xmlbuilder2": "^2.4.0" }, @@ -603,15 +604,6 @@ "node": ">=8.0" } }, - "node_modules/@tradeshift/actions-credentials-yaml": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@tradeshift/actions-credentials-yaml/-/actions-credentials-yaml-0.7.0.tgz", - "integrity": "sha512-FBHqPvlnqL71DQJJB8aV0WUR/hDoeL3Mf+wpTD1DoxgoPH93LvwiChyNa2NybqENJB9nm85ylK+4pgUxwUoRBw==", - "dependencies": { - "js-base64": "^3.6.0", - "yaml": "^1.10.0" - } - }, "node_modules/@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -3425,11 +3417,6 @@ "node": ">=6" } }, - "node_modules/js-base64": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.6.0.tgz", - "integrity": "sha512-wVdUBYQeY2gY73RIlPrysvpYx+2vheGo8Y1SNQv/BzHToWpAZzJU7Z6uheKMAe+GLSBig5/Ps2nxg/8tRB73xg==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3554,6 +3541,11 @@ "verror": "1.10.0" } }, + "node_modules/jtest": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jtest/-/jtest-0.0.1.tgz", + "integrity": "sha1-oNwTkRpH+bK3ldg/kc07Po14D8k=" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -5872,14 +5864,6 @@ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, - "node_modules/yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", @@ -6434,15 +6418,6 @@ "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==" }, - "@tradeshift/actions-credentials-yaml": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@tradeshift/actions-credentials-yaml/-/actions-credentials-yaml-0.7.0.tgz", - "integrity": "sha512-FBHqPvlnqL71DQJJB8aV0WUR/hDoeL3Mf+wpTD1DoxgoPH93LvwiChyNa2NybqENJB9nm85ylK+4pgUxwUoRBw==", - "requires": { - "js-base64": "^3.6.0", - "yaml": "^1.10.0" - } - }, "@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -8701,11 +8676,6 @@ } } }, - "js-base64": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.6.0.tgz", - "integrity": "sha512-wVdUBYQeY2gY73RIlPrysvpYx+2vheGo8Y1SNQv/BzHToWpAZzJU7Z6uheKMAe+GLSBig5/Ps2nxg/8tRB73xg==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8812,6 +8782,11 @@ "verror": "1.10.0" } }, + "jtest": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jtest/-/jtest-0.0.1.tgz", + "integrity": "sha1-oNwTkRpH+bK3ldg/kc07Po14D8k=" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -10683,11 +10658,6 @@ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" - }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/package.json b/package.json index d3299388..562e1b1a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@actions/http-client": "^1.0.9", "@actions/io": "^1.0.0", "@actions/tool-cache": "^1.6.1", + "jtest": "^0.0.1", "semver": "^6.1.1", "xmlbuilder2": "^2.4.0" }, diff --git a/src/constants.ts b/src/constants.ts index a8dcfb44..cbbdbe8a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -9,11 +9,13 @@ export const INPUT_SERVER_PASSWORD = 'server-password'; export const INPUT_SETTINGS_PATH = 'settings-path'; export const INPUT_GPG_PRIVATE_KEY = 'gpg-private-key'; export const INPUT_GPG_PASSPHRASE = 'gpg-passphrase'; + export const INPUT_MAVEN_CA_CERT_B64 = 'maven-ca-cert-b64'; export const INPUT_MAVEN_KEYSTORE_P12_B64 = 'maven-keystore-p12-b64'; export const INPUT_MAVEN_KEYSTORE_PASSWORD = 'maven-keystore-password'; export const INPUT_MAVEN_SETTINGS_B64 = 'maven-settings-b64'; export const INPUT_MAVEN_SECURITY_SETTINGS_B64 = 'maven-security-settings-b64'; +export const INPUT_MAVEN_VERSION = 'maven-version'; export const INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined; export const INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE'; diff --git a/src/installer.ts b/src/installer.ts index b48eeb0b..000ed32a 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -11,6 +11,51 @@ import * as util from './util'; const tempDirectory = util.getTempDir(); const IS_WINDOWS = util.isWindows(); +export async function getMaven(version: string): Promise { + const tmpVersions = version.split('.'); + if (tmpVersions.length < 2) { + throw new Error( + `wrong version is set(${version}): supported version template: major.minor.patch` + ); + } + const majorVersion = tmpVersions[0]; + + let toolPath = tc.find('mvn', version); + + if (toolPath) { + core.debug(`Tool found in cache ${toolPath}`); + } else { + core.debug( + `Downloading Maven from https://downloads.apache.org/maven/maven-${majorVersion}` + ); + + const url = path.join( + `https:///downloads.apache.org/maven/maven-${majorVersion}`, + version, + `binaries/apache-maven-${version}-bin.tar.gz` + ); + + console.log(url); + const mvnTarFile = await tc.downloadTool(url); + + let tempDir: string = path.join( + tempDirectory, + 'temp_' + Math.floor(Math.random() * 2000000000) + ); + await extractFiles(mvnTarFile, '.tar.gz', tempDir); + + core.debug(`maven extracted to ${tempDir}`); + toolPath = await tc.cacheDir( + path.join(tempDir, `apache-maven-${version}`), + 'mvn', + version, + 'x64' + ); + } + + core.exportVariable('MAVEN_HOME', toolPath); +} + export async function getJava( version: string, arch: string, diff --git a/src/maven.ts b/src/maven.ts index e6b4763b..e59ddd25 100644 --- a/src/maven.ts +++ b/src/maven.ts @@ -15,11 +15,11 @@ export interface MavenOpts { export function validateOptions(opts: MavenOpts): boolean { if ( - (opts.caCert === '' || - opts.keystore === '' || - opts.password === '' || - opts.securitySettings === '', - opts.settings === '') + opts.caCert === '' || + opts.keystore === '' || + opts.password === '' || + opts.securitySettings === '' || + opts.settings === '' ) { core.debug('maven options set is not valid: some field is empty'); return false; diff --git a/src/setup-java.ts b/src/setup-java.ts index ffdf39ce..f8f4ce6d 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -23,6 +23,8 @@ async function run() { ) }; + const mvnVersion = core.getInput(constants.INPUT_MAVEN_VERSION); + if (!isValidOptions(mvnOpts)) { throw new Error( 'Some of the Maven options is empty: please check maven-* parameters' @@ -40,6 +42,9 @@ async function run() { const jdkFile = core.getInput(constants.INPUT_JDK_FILE, {required: false}); await installer.getJava(version, arch, jdkFile, javaPackage); + if (mvnVersion) { + await installer.getMaven(mvnVersion); + } const matchersPath = path.join(__dirname, '..', '..', '.github'); core.info(`##[add-matcher]${path.join(matchersPath, 'java.json')}`);