From a3e6ce2153fa695e13226f8273de18260700ff4e Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 15 Nov 2019 16:01:13 -0800 Subject: [PATCH 01/61] Adding maven auth support --- __tests__/auth.test.ts | 36 ++++++++++++++++++++++++++++++++ lib/auth.js | 47 ++++++++++++++++++++++++++++++++++++++++++ lib/setup-java.js | 45 ++++++++++++++++++++++++++++++++++++++++ src/auth.ts | 31 ++++++++++++++++++++++++++++ src/setup-java.ts | 8 +++++++ 5 files changed, 167 insertions(+) create mode 100644 __tests__/auth.test.ts create mode 100644 lib/auth.js create mode 100644 lib/setup-java.js create mode 100644 src/auth.ts diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts new file mode 100644 index 00000000..937d119d --- /dev/null +++ b/__tests__/auth.test.ts @@ -0,0 +1,36 @@ +import io = require('@actions/io'); +import fs = require('fs'); +import path = require('path'); +import child_process = require('child_process'); + +const m2Dir = path.join(__dirname, '.m2'); +const settingsFile = path.join(m2Dir, 'settings.xml'); + +import * as auth from '../src/auth'; + +describe('auth tests', () => { + beforeAll(async () => { + await io.rmRF(m2Dir); + }, 300000); + + afterAll(async () => { + try { + await io.rmRF(m2Dir); + } catch { + console.log('Failed to remove test directories'); + } + }, 100000); + + it('Creates settings.xml file with username and password', async () => { + const username = 'bluebottle'; + const password = 'SingleOrigin'; + + await auth.configAuthentication(username, password); + + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( + auth.generate(username, password) + ); + }, 100000); +}); diff --git a/lib/auth.js b/lib/auth.js new file mode 100644 index 00000000..33e643be --- /dev/null +++ b/lib/auth.js @@ -0,0 +1,47 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __importStar(require("fs")); +const os = __importStar(require("os")); +const path = __importStar(require("path")); +const io = __importStar(require("@actions/io")); +function configAuthentication(username, password) { + return __awaiter(this, void 0, void 0, function* () { + const directory = path.join(os.homedir(), '.m2'); + yield io.mkdirP(directory); + yield write(directory, generate(username, password)); + }); +} +exports.configAuthentication = configAuthentication; +// only exported for testing purposes +function generate(username = '${actions.username}', password = '${actions.password}') { + return ` + + + ${username} + ${password} + + + + `; +} +exports.generate = generate; +function write(directory, settings) { + return __awaiter(this, void 0, void 0, function* () { + return fs.writeFileSync(path.join(directory, 'settings.xml'), settings); + }); +} diff --git a/lib/setup-java.js b/lib/setup-java.js new file mode 100644 index 00000000..1028cf84 --- /dev/null +++ b/lib/setup-java.js @@ -0,0 +1,45 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const core = __importStar(require("@actions/core")); +const installer = __importStar(require("./installer")); +const auth = __importStar(require("./auth")); +const path = __importStar(require("path")); +function run() { + return __awaiter(this, void 0, void 0, function* () { + try { + let version = core.getInput('version'); + if (!version) { + version = core.getInput('java-version', { required: true }); + } + const arch = core.getInput('architecture', { required: true }); + const jdkFile = core.getInput('jdkFile', { required: false }) || ''; + yield installer.getJava(version, arch, jdkFile); + const username = core.getInput('username', { required: false }); + const password = core.getInput('password', { required: false }); + if (username && password) { + yield auth.configAuthentication(username, password); + } + const matchersPath = path.join(__dirname, '..', '.github'); + console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); + } + catch (error) { + core.setFailed(error.message); + } + }); +} +run(); diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 00000000..328c54f7 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,31 @@ +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import * as core from '@actions/core'; +import * as io from '@actions/io'; + +export async function configAuthentication(username: string, password: string) { + const directory: string = path.join(os.homedir(), '.m2'); + await io.mkdirP(directory); + await write(directory, generate(username, password)); +} + +// only exported for testing purposes +export function generate( + username = '${actions.username}', + password = '${actions.password}' +) { + return ` + + + ${username} + ${password} + + + + `; +} + +async function write(directory: string, settings: string) { + return fs.writeFileSync(path.join(directory, 'settings.xml'), settings); +} diff --git a/src/setup-java.ts b/src/setup-java.ts index 1d26bffe..e6b179ed 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -1,5 +1,6 @@ import * as core from '@actions/core'; import * as installer from './installer'; +import * as auth from './auth'; import * as path from 'path'; async function run() { @@ -14,6 +15,13 @@ async function run() { await installer.getJava(version, arch, jdkFile, javaPackage); + const username = core.getInput('username', {required: false}); + const password = core.getInput('password', {required: false}); + + if (username && password) { + await auth.configAuthentication(username, password); + } + const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); } catch (error) { From 56b5af70cfb7ccc2f15b5c6106ac6b0fb91c1432 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Wed, 20 Nov 2019 10:23:50 -0800 Subject: [PATCH 02/61] ignore vscode directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 370c1f6e..e6dc0cc5 100644 --- a/.gitignore +++ b/.gitignore @@ -93,3 +93,4 @@ typings/ # DynamoDB Local files .dynamodb/ +.vscode/ From 56eacf97f5ab81cf3d99d685fb9faf78c9028a0f Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Wed, 20 Nov 2019 10:25:21 -0800 Subject: [PATCH 03/61] move required parameters to auth module username and password are required from within the auth module now. Update the tests to ensure this is the case. --- __tests__/auth.test.ts | 34 ++++++++++++++++++++++++++----- src/auth.ts | 46 ++++++++++++++++++++++++++---------------- src/setup-java.ts | 4 +--- 3 files changed, 59 insertions(+), 25 deletions(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 937d119d..4a3119d3 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -1,15 +1,22 @@ import io = require('@actions/io'); import fs = require('fs'); +import os = require('os'); import path = require('path'); -import child_process = require('child_process'); -const m2Dir = path.join(__dirname, '.m2'); -const settingsFile = path.join(m2Dir, 'settings.xml'); +// make the os.homedir() call be local to the tests +jest.doMock('os', () => { + return { + homedir: jest.fn(() => __dirname) + }; +}); import * as auth from '../src/auth'; +const m2Dir = path.join(__dirname, auth.M2_DIR); +const settingsFile = path.join(m2Dir, auth.SETTINGS_FILE); + describe('auth tests', () => { - beforeAll(async () => { + beforeEach(async () => { await io.rmRF(m2Dir); }, 300000); @@ -21,7 +28,7 @@ describe('auth tests', () => { } }, 100000); - it('Creates settings.xml file with username and password', async () => { + it('creates settings.xml with username and password', async () => { const username = 'bluebottle'; const password = 'SingleOrigin'; @@ -33,4 +40,21 @@ describe('auth tests', () => { auth.generate(username, password) ); }, 100000); + + it('does not create settings.xml without username and / or password', async () => { + await auth.configAuthentication('FOO', ''); + + expect(fs.existsSync(m2Dir)).toBe(false); + expect(fs.existsSync(settingsFile)).toBe(false); + + await auth.configAuthentication('', 'BAR'); + + expect(fs.existsSync(m2Dir)).toBe(false); + expect(fs.existsSync(settingsFile)).toBe(false); + + await auth.configAuthentication('', ''); // BAZ!!! + + expect(fs.existsSync(m2Dir)).toBe(false); + expect(fs.existsSync(settingsFile)).toBe(false); + }, 100000); }); diff --git a/src/auth.ts b/src/auth.ts index 328c54f7..252423a8 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -4,28 +4,40 @@ import * as path from 'path'; import * as core from '@actions/core'; import * as io from '@actions/io'; +export const M2_DIR = '.m2'; +export const SETTINGS_FILE = 'settings.xml'; + export async function configAuthentication(username: string, password: string) { - const directory: string = path.join(os.homedir(), '.m2'); - await io.mkdirP(directory); - await write(directory, generate(username, password)); + if (username && password) { + core.debug(`configAuthentication with ${username} and a password`); + const directory: string = path.join(os.homedir(), M2_DIR); + await io.mkdirP(directory); + core.debug(`created directory ${directory}`); + await write(directory, generate(username, password)); + } else { + core.debug( + `no auth without username: ${username} and password: ${password}` + ); + } } // only exported for testing purposes -export function generate( - username = '${actions.username}', - password = '${actions.password}' -) { - return ` - - - ${username} - ${password} - - - - `; +export function generate(username: string, password: string) { + return ` + + + + ${username} + ${password} + + + + `; } async function write(directory: string, settings: string) { - return fs.writeFileSync(path.join(directory, 'settings.xml'), settings); + const options = {encoding: 'utf-8'}; + const location = path.join(directory, SETTINGS_FILE); + core.debug(`writing ${location}`); + return fs.writeFileSync(location, settings, options); } diff --git a/src/setup-java.ts b/src/setup-java.ts index e6b179ed..9e52f9b1 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -18,9 +18,7 @@ async function run() { const username = core.getInput('username', {required: false}); const password = core.getInput('password', {required: false}); - if (username && password) { - await auth.configAuthentication(username, password); - } + await auth.configAuthentication(username, password); const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); From 86e89385e588f397a8029c26279d630dee37462a Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Wed, 20 Nov 2019 10:25:37 -0800 Subject: [PATCH 04/61] Add generated auth and setup-java --- lib/auth.js | 42 ++++++++++++++++++++++++++++-------------- lib/setup-java.js | 4 +--- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/lib/auth.js b/lib/auth.js index 33e643be..4bfc3c7c 100644 --- a/lib/auth.js +++ b/lib/auth.js @@ -18,30 +18,44 @@ Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs")); const os = __importStar(require("os")); const path = __importStar(require("path")); +const core = __importStar(require("@actions/core")); const io = __importStar(require("@actions/io")); +exports.M2_DIR = '.m2'; +exports.SETTINGS_FILE = 'settings.xml'; function configAuthentication(username, password) { return __awaiter(this, void 0, void 0, function* () { - const directory = path.join(os.homedir(), '.m2'); - yield io.mkdirP(directory); - yield write(directory, generate(username, password)); + if (username && password) { + core.debug(`configAuthentication with ${username} and a password`); + const directory = path.join(os.homedir(), exports.M2_DIR); + yield io.mkdirP(directory); + core.debug(`created directory ${directory}`); + yield write(directory, generate(username, password)); + } + else { + core.debug(`no auth without username: ${username} and password: ${password}`); + } }); } exports.configAuthentication = configAuthentication; // only exported for testing purposes -function generate(username = '${actions.username}', password = '${actions.password}') { - return ` - - - ${username} - ${password} - - - - `; +function generate(username, password) { + return ` + + + + ${username} + ${password} + + + + `; } exports.generate = generate; function write(directory, settings) { return __awaiter(this, void 0, void 0, function* () { - return fs.writeFileSync(path.join(directory, 'settings.xml'), settings); + const options = { encoding: 'utf-8' }; + const location = path.join(directory, exports.SETTINGS_FILE); + core.debug(`writing ${location}`); + return fs.writeFileSync(location, settings, options); }); } diff --git a/lib/setup-java.js b/lib/setup-java.js index 1028cf84..a000d4e6 100644 --- a/lib/setup-java.js +++ b/lib/setup-java.js @@ -31,9 +31,7 @@ function run() { yield installer.getJava(version, arch, jdkFile); const username = core.getInput('username', { required: false }); const password = core.getInput('password', { required: false }); - if (username && password) { - yield auth.configAuthentication(username, password); - } + yield auth.configAuthentication(username, password); const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); } From 1b0417032a879685f08952bdd927ad3015219aee Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 09:52:58 -0800 Subject: [PATCH 05/61] Move auth to the bottom of setup --- src/setup-java.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/setup-java.ts b/src/setup-java.ts index 9e52f9b1..99026e34 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -15,13 +15,16 @@ async function run() { await installer.getJava(version, arch, jdkFile, javaPackage); + const matchersPath = path.join(__dirname, '..', '.github'); + console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); + const username = core.getInput('username', {required: false}); const password = core.getInput('password', {required: false}); - await auth.configAuthentication(username, password); + if (username && password) { + await auth.configAuthentication(username, password); + } - const matchersPath = path.join(__dirname, '..', '.github'); - console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); } catch (error) { core.setFailed(error.message); } From b0e5cf270d5e17b8428c466710bc07c39725573a Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 12:40:08 -0800 Subject: [PATCH 06/61] Support ids --- __tests__/auth.test.ts | 16 +++++++++++----- src/auth.ts | 9 +++++---- src/setup-java.ts | 5 +++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 4a3119d3..8e5efd4e 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -29,30 +29,36 @@ describe('auth tests', () => { }, 100000); it('creates settings.xml with username and password', async () => { + const id = 'packages'; const username = 'bluebottle'; const password = 'SingleOrigin'; - await auth.configAuthentication(username, password); + await auth.configAuthentication(id, username, password); expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( - auth.generate(username, password) + auth.generate(id, username, password) ); }, 100000); it('does not create settings.xml without username and / or password', async () => { - await auth.configAuthentication('FOO', ''); + await auth.configAuthentication('FOO', '', ''); expect(fs.existsSync(m2Dir)).toBe(false); expect(fs.existsSync(settingsFile)).toBe(false); - await auth.configAuthentication('', 'BAR'); + await auth.configAuthentication('', 'BAR', ''); expect(fs.existsSync(m2Dir)).toBe(false); expect(fs.existsSync(settingsFile)).toBe(false); - await auth.configAuthentication('', ''); // BAZ!!! + await auth.configAuthentication('', '', 'BAZ'); + + expect(fs.existsSync(m2Dir)).toBe(false); + expect(fs.existsSync(settingsFile)).toBe(false); + + await auth.configAuthentication('', '', ''); expect(fs.existsSync(m2Dir)).toBe(false); expect(fs.existsSync(settingsFile)).toBe(false); diff --git a/src/auth.ts b/src/auth.ts index 252423a8..d3c13bc1 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -7,13 +7,13 @@ import * as io from '@actions/io'; export const M2_DIR = '.m2'; export const SETTINGS_FILE = 'settings.xml'; -export async function configAuthentication(username: string, password: string) { - if (username && password) { +export async function configAuthentication(id: string, username: string, password: string) { + if (id && username && password) { core.debug(`configAuthentication with ${username} and a password`); const directory: string = path.join(os.homedir(), M2_DIR); await io.mkdirP(directory); core.debug(`created directory ${directory}`); - await write(directory, generate(username, password)); + await write(directory, generate(id, username, password)); } else { core.debug( `no auth without username: ${username} and password: ${password}` @@ -22,11 +22,12 @@ export async function configAuthentication(username: string, password: string) { } // only exported for testing purposes -export function generate(username: string, password: string) { +export function generate(id: string, username: string, password: string) { return ` + ${id} ${username} ${password} diff --git a/src/setup-java.ts b/src/setup-java.ts index 99026e34..2a731164 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -18,11 +18,12 @@ async function run() { const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); + const id = core.getInput('id', {required: false}); const username = core.getInput('username', {required: false}); const password = core.getInput('password', {required: false}); - if (username && password) { - await auth.configAuthentication(username, password); + if (id && username && password) { + await auth.configAuthentication(id, username, password); } } catch (error) { From dc5f78f54d4e2452492208bb2dd5164231dc2623 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 12:40:45 -0800 Subject: [PATCH 07/61] generated and pretty files --- lib/auth.js | 9 +++++---- lib/setup-java.js | 9 ++++++--- src/auth.ts | 6 +++++- src/setup-java.ts | 1 - 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/auth.js b/lib/auth.js index 4bfc3c7c..9b03d1cd 100644 --- a/lib/auth.js +++ b/lib/auth.js @@ -22,14 +22,14 @@ const core = __importStar(require("@actions/core")); const io = __importStar(require("@actions/io")); exports.M2_DIR = '.m2'; exports.SETTINGS_FILE = 'settings.xml'; -function configAuthentication(username, password) { +function configAuthentication(id, username, password) { return __awaiter(this, void 0, void 0, function* () { - if (username && password) { + if (id && username && password) { core.debug(`configAuthentication with ${username} and a password`); const directory = path.join(os.homedir(), exports.M2_DIR); yield io.mkdirP(directory); core.debug(`created directory ${directory}`); - yield write(directory, generate(username, password)); + yield write(directory, generate(id, username, password)); } else { core.debug(`no auth without username: ${username} and password: ${password}`); @@ -38,11 +38,12 @@ function configAuthentication(username, password) { } exports.configAuthentication = configAuthentication; // only exported for testing purposes -function generate(username, password) { +function generate(id, username, password) { return ` + ${id} ${username} ${password} diff --git a/lib/setup-java.js b/lib/setup-java.js index a000d4e6..ce1e3760 100644 --- a/lib/setup-java.js +++ b/lib/setup-java.js @@ -29,11 +29,14 @@ function run() { const arch = core.getInput('architecture', { required: true }); const jdkFile = core.getInput('jdkFile', { required: false }) || ''; yield installer.getJava(version, arch, jdkFile); - const username = core.getInput('username', { required: false }); - const password = core.getInput('password', { required: false }); - yield auth.configAuthentication(username, password); const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); + const id = core.getInput('id', { required: false }); + const username = core.getInput('username', { required: false }); + const password = core.getInput('password', { required: false }); + if (id && username && password) { + yield auth.configAuthentication(id, username, password); + } } catch (error) { core.setFailed(error.message); diff --git a/src/auth.ts b/src/auth.ts index d3c13bc1..4979045c 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -7,7 +7,11 @@ import * as io from '@actions/io'; export const M2_DIR = '.m2'; export const SETTINGS_FILE = 'settings.xml'; -export async function configAuthentication(id: string, username: string, password: string) { +export async function configAuthentication( + id: string, + username: string, + password: string +) { if (id && username && password) { core.debug(`configAuthentication with ${username} and a password`); const directory: string = path.join(os.homedir(), M2_DIR); diff --git a/src/setup-java.ts b/src/setup-java.ts index 2a731164..39f5466b 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -25,7 +25,6 @@ async function run() { if (id && username && password) { await auth.configAuthentication(id, username, password); } - } catch (error) { core.setFailed(error.message); } From 24327359f8649bb465e20dee2b6d8c8cce2c1272 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 12:53:22 -0800 Subject: [PATCH 08/61] use server-id instead of ambigous id --- src/setup-java.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/setup-java.ts b/src/setup-java.ts index 39f5466b..419b9ea4 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -18,7 +18,7 @@ async function run() { const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); - const id = core.getInput('id', {required: false}); + const id = core.getInput('server-id', {required: false}); const username = core.getInput('username', {required: false}); const password = core.getInput('password', {required: false}); From b8a0027e2cdcd55e80a1bd0c14f91d9e18a4273e Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 12:54:29 -0800 Subject: [PATCH 09/61] Use console.log where appropriate --- lib/auth.js | 6 +++--- lib/setup-java.js | 2 +- src/auth.ts | 8 +++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/auth.js b/lib/auth.js index 9b03d1cd..f8d795a7 100644 --- a/lib/auth.js +++ b/lib/auth.js @@ -25,14 +25,14 @@ exports.SETTINGS_FILE = 'settings.xml'; function configAuthentication(id, username, password) { return __awaiter(this, void 0, void 0, function* () { if (id && username && password) { - core.debug(`configAuthentication with ${username} and a password`); + console.log(`creating ${exports.SETTINGS_FILE} with server-id: ${id}, username: ${username}, and a password`); const directory = path.join(os.homedir(), exports.M2_DIR); yield io.mkdirP(directory); core.debug(`created directory ${directory}`); yield write(directory, generate(id, username, password)); } else { - core.debug(`no auth without username: ${username} and password: ${password}`); + core.debug(`no ${exports.SETTINGS_FILE} without server-id: ${id}, username: ${username}, and a password`); } }); } @@ -56,7 +56,7 @@ function write(directory, settings) { return __awaiter(this, void 0, void 0, function* () { const options = { encoding: 'utf-8' }; const location = path.join(directory, exports.SETTINGS_FILE); - core.debug(`writing ${location}`); + console.log(`writing ${location}`); return fs.writeFileSync(location, settings, options); }); } diff --git a/lib/setup-java.js b/lib/setup-java.js index ce1e3760..5372cbb6 100644 --- a/lib/setup-java.js +++ b/lib/setup-java.js @@ -31,7 +31,7 @@ function run() { yield installer.getJava(version, arch, jdkFile); const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); - const id = core.getInput('id', { required: false }); + const id = core.getInput('server-id', { required: false }); const username = core.getInput('username', { required: false }); const password = core.getInput('password', { required: false }); if (id && username && password) { diff --git a/src/auth.ts b/src/auth.ts index 4979045c..b61b357d 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -13,14 +13,16 @@ export async function configAuthentication( password: string ) { if (id && username && password) { - core.debug(`configAuthentication with ${username} and a password`); + console.log( + `creating ${SETTINGS_FILE} with server-id: ${id}, username: ${username}, and a password` + ); const directory: string = path.join(os.homedir(), M2_DIR); await io.mkdirP(directory); core.debug(`created directory ${directory}`); await write(directory, generate(id, username, password)); } else { core.debug( - `no auth without username: ${username} and password: ${password}` + `no ${SETTINGS_FILE} without server-id: ${id}, username: ${username}, and a password` ); } } @@ -43,6 +45,6 @@ export function generate(id: string, username: string, password: string) { async function write(directory: string, settings: string) { const options = {encoding: 'utf-8'}; const location = path.join(directory, SETTINGS_FILE); - core.debug(`writing ${location}`); + console.log(`writing ${location}`); return fs.writeFileSync(location, settings, options); } From 4450e92d7814b023e1185a4c81037df93697bcd4 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 13:00:30 -0800 Subject: [PATCH 10/61] Use gitattributes to ignore generated lib js files --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..33c66243 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +lib/*.js -diff -merge +lib/*.js linguist-generated=true From 18983b8d3d6bbec73377e2c02d64915f1d0be621 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 13:10:44 -0800 Subject: [PATCH 11/61] Update gitattributes and remove lib files --- .gitattributes | 4 +-- dist/index.js | Bin 161897 -> 164736 bytes lib/auth.js | 62 ---------------------------------------------- lib/setup-java.js | 46 ---------------------------------- 4 files changed, 2 insertions(+), 110 deletions(-) delete mode 100644 lib/auth.js delete mode 100644 lib/setup-java.js diff --git a/.gitattributes b/.gitattributes index 33c66243..f787af87 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -lib/*.js -diff -merge -lib/*.js linguist-generated=true +dist/index.js -diff -merge +dist/index.js linguist-generated=true diff --git a/dist/index.js b/dist/index.js index 2ec6b325bd1000aba1e998286d251c4ffe4171c0..b904df6cd48ed9cfe58d3e4085c5748d9aacf465 100644 GIT binary patch delta 122 zcmaF)fwQ5VYr{g8$=ifpPc~rV+&q<4hH-jcDbt$Ck3|h8zu*+w{F&`A_v9JeZ>J}0 zXOx(}pn!>O^FiSN#^%Gk?T2|8w;$$ZYD_`MO->SRoPN59$rvugzC9mq iNoc!d9g_s}WNukQkm|{=*@~w3)iHrN+p`;)M415k^BiUX diff --git a/lib/auth.js b/lib/auth.js deleted file mode 100644 index f8d795a7..00000000 --- a/lib/auth.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __importStar(require("fs")); -const os = __importStar(require("os")); -const path = __importStar(require("path")); -const core = __importStar(require("@actions/core")); -const io = __importStar(require("@actions/io")); -exports.M2_DIR = '.m2'; -exports.SETTINGS_FILE = 'settings.xml'; -function configAuthentication(id, username, password) { - return __awaiter(this, void 0, void 0, function* () { - if (id && username && password) { - console.log(`creating ${exports.SETTINGS_FILE} with server-id: ${id}, username: ${username}, and a password`); - const directory = path.join(os.homedir(), exports.M2_DIR); - yield io.mkdirP(directory); - core.debug(`created directory ${directory}`); - yield write(directory, generate(id, username, password)); - } - else { - core.debug(`no ${exports.SETTINGS_FILE} without server-id: ${id}, username: ${username}, and a password`); - } - }); -} -exports.configAuthentication = configAuthentication; -// only exported for testing purposes -function generate(id, username, password) { - return ` - - - - ${id} - ${username} - ${password} - - - - `; -} -exports.generate = generate; -function write(directory, settings) { - return __awaiter(this, void 0, void 0, function* () { - const options = { encoding: 'utf-8' }; - const location = path.join(directory, exports.SETTINGS_FILE); - console.log(`writing ${location}`); - return fs.writeFileSync(location, settings, options); - }); -} diff --git a/lib/setup-java.js b/lib/setup-java.js deleted file mode 100644 index 5372cbb6..00000000 --- a/lib/setup-java.js +++ /dev/null @@ -1,46 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const core = __importStar(require("@actions/core")); -const installer = __importStar(require("./installer")); -const auth = __importStar(require("./auth")); -const path = __importStar(require("path")); -function run() { - return __awaiter(this, void 0, void 0, function* () { - try { - let version = core.getInput('version'); - if (!version) { - version = core.getInput('java-version', { required: true }); - } - const arch = core.getInput('architecture', { required: true }); - const jdkFile = core.getInput('jdkFile', { required: false }) || ''; - yield installer.getJava(version, arch, jdkFile); - const matchersPath = path.join(__dirname, '..', '.github'); - console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); - const id = core.getInput('server-id', { required: false }); - const username = core.getInput('username', { required: false }); - const password = core.getInput('password', { required: false }); - if (id && username && password) { - yield auth.configAuthentication(id, username, password); - } - } - catch (error) { - core.setFailed(error.message); - } - }); -} -run(); From 495409509c39e58df677cd2e8a96dba0f80357d6 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 15 Nov 2019 16:01:13 -0800 Subject: [PATCH 12/61] parent 52c60e0768c1c2fabcab3acf97aa77c5dbc32dfa author Bryan Clark 1573862473 -0800 committer Bryan Clark 1574976093 -0800 Adding maven auth support ignore vscode directory move required parameters to auth module username and password are required from within the auth module now. Update the tests to ensure this is the case. Add generated auth and setup-java Move auth to the bottom of setup Support ids generated and pretty files use server-id instead of ambigous id Use console.log where appropriate Adding maven auth support ignore vscode directory move required parameters to auth module username and password are required from within the auth module now. Update the tests to ensure this is the case. Add generated auth and setup-java Move auth to the bottom of setup generated and pretty files use server-id instead of ambigous id --- lib/auth.js | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 lib/auth.js diff --git a/lib/auth.js b/lib/auth.js new file mode 100644 index 00000000..9b03d1cd --- /dev/null +++ b/lib/auth.js @@ -0,0 +1,62 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __importStar(require("fs")); +const os = __importStar(require("os")); +const path = __importStar(require("path")); +const core = __importStar(require("@actions/core")); +const io = __importStar(require("@actions/io")); +exports.M2_DIR = '.m2'; +exports.SETTINGS_FILE = 'settings.xml'; +function configAuthentication(id, username, password) { + return __awaiter(this, void 0, void 0, function* () { + if (id && username && password) { + core.debug(`configAuthentication with ${username} and a password`); + const directory = path.join(os.homedir(), exports.M2_DIR); + yield io.mkdirP(directory); + core.debug(`created directory ${directory}`); + yield write(directory, generate(id, username, password)); + } + else { + core.debug(`no auth without username: ${username} and password: ${password}`); + } + }); +} +exports.configAuthentication = configAuthentication; +// only exported for testing purposes +function generate(id, username, password) { + return ` + + + + ${id} + ${username} + ${password} + + + + `; +} +exports.generate = generate; +function write(directory, settings) { + return __awaiter(this, void 0, void 0, function* () { + const options = { encoding: 'utf-8' }; + const location = path.join(directory, exports.SETTINGS_FILE); + core.debug(`writing ${location}`); + return fs.writeFileSync(location, settings, options); + }); +} From 1085a2b8cf57feaccd2de1c5c7c0429486066290 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 12:54:29 -0800 Subject: [PATCH 13/61] Use console.log where appropriate Update gitattributes and remove lib files --- lib/auth.js | 62 ----------------------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 lib/auth.js diff --git a/lib/auth.js b/lib/auth.js deleted file mode 100644 index 9b03d1cd..00000000 --- a/lib/auth.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __importStar(require("fs")); -const os = __importStar(require("os")); -const path = __importStar(require("path")); -const core = __importStar(require("@actions/core")); -const io = __importStar(require("@actions/io")); -exports.M2_DIR = '.m2'; -exports.SETTINGS_FILE = 'settings.xml'; -function configAuthentication(id, username, password) { - return __awaiter(this, void 0, void 0, function* () { - if (id && username && password) { - core.debug(`configAuthentication with ${username} and a password`); - const directory = path.join(os.homedir(), exports.M2_DIR); - yield io.mkdirP(directory); - core.debug(`created directory ${directory}`); - yield write(directory, generate(id, username, password)); - } - else { - core.debug(`no auth without username: ${username} and password: ${password}`); - } - }); -} -exports.configAuthentication = configAuthentication; -// only exported for testing purposes -function generate(id, username, password) { - return ` - - - - ${id} - ${username} - ${password} - - - - `; -} -exports.generate = generate; -function write(directory, settings) { - return __awaiter(this, void 0, void 0, function* () { - const options = { encoding: 'utf-8' }; - const location = path.join(directory, exports.SETTINGS_FILE); - core.debug(`writing ${location}`); - return fs.writeFileSync(location, settings, options); - }); -} From c8f8a264b4ccd08f0ca57e0656f9475f4953cef4 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 14:13:35 -0800 Subject: [PATCH 14/61] Add publish section to README --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 568fd1be..d57bbdd0 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,28 @@ jobs: - run: java -cp java HelloWorldApp ``` +Publising to an Apache Maven Repository: +```yaml +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 1.8 + uses: actions/setup-java@master + with: + java-version: 1.8 + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + username: ${{ github.actor }} # username for server authentication + password: ${{ github.token }} # password or token for authentication + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy +``` + # License The scripts and documentation in this project are released under the [MIT License](LICENSE) From 7d69f8015bb2278c61cd7a41d97c190353d4d452 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 14:13:43 -0800 Subject: [PATCH 15/61] build index.js --- dist/index.js | Bin 164736 -> 167575 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/index.js b/dist/index.js index b904df6cd48ed9cfe58d3e4085c5748d9aacf465..a2d7b8459dabe05e7eee05a51199a41a5ff48a7a 100644 GIT binary patch delta 193 zcmZo@=bAp3Yl92V}QtAE{hz1$>O#3;39(=fhO8P5-RS*f_nfj>#Ay zB&x$GIlZo&$qT5JZTdzN#@Ew#RzP`|YM7G2!uk7viuN`z86osl>}TYkF3`vnG<`w? MlgReVbxdnn03usSiU0rr delta 59 zcmbO}m#d+jYl92VWEqjSlmGJxZFc6>VQelJYcCgL++HrmG$S7*I(Z9U>GXANOvcmS OcQFZXf8EKnh6MncW){)_ From d1d9006723dec017027b4a6a5d8d5c00edb904e8 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 14:18:30 -0800 Subject: [PATCH 16/61] Add fields to action.yml --- action.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/action.yml b/action.yml index 2bcf1ff4..912a09c4 100644 --- a/action.yml +++ b/action.yml @@ -16,6 +16,15 @@ inputs: jdkFile: description: 'Path to where the compressed JDK is located. The path could be in your source repository or a local path on the agent.' required: false + server-id: + description: 'ID of the distributionManagement repository in the pom.xml file.' + required: false + username: + description: 'Username for authentication to the Apache Maven server.' + required: false + password: + description: 'Passowrd or token for authentication to the Apache Maven server.' + required: false runs: using: 'node12' main: 'dist/index.js' From cda418e54a15b6290a2659671b1b82c78716d1ff Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 14:22:38 -0800 Subject: [PATCH 17/61] Update index.js --- dist/index.js | Bin 167575 -> 170414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/index.js b/dist/index.js index a2d7b8459dabe05e7eee05a51199a41a5ff48a7a..182c0797d17dc7cddfc4f45293a8ae68a29edfec 100644 GIT binary patch delta 72 zcmbO}muuZ-t_?CGn|CO&GEV*=%D!1c)Sq#3KA-XA0#Ui?x@}C2lVjNprtd$-C;^ma aZ7$<)FXLz2UdGRqR0UG9{eK(N40Zse1sQz+ delta 33 pcmZ3tnQQu7t_?CG%{DUaHZqLcZDg4Clukb|jY()b<5Z@#EC9@y3y1&! From d2eada383a9872f380c29fb1527b01a5ed7c8c8a Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 14:48:36 -0800 Subject: [PATCH 18/61] direct ncc to setup-java --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aa088e8f..28d0e0be 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "tsc", "format": "prettier --write **/*.ts", "format-check": "prettier --check **/*.ts", - "release": "ncc build && git add -f dist/", + "release": "ncc build lib/setup-java.js && git add -f dist/index.js", "test": "jest" }, "repository": { From ade090c5cf2d27d9efad6eff0763ff6c5f27c632 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 28 Nov 2019 14:48:39 -0800 Subject: [PATCH 19/61] Update index.js --- dist/index.js | Bin 170414 -> 157530 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/index.js b/dist/index.js index 182c0797d17dc7cddfc4f45293a8ae68a29edfec..c01c0f396189c7757106968d7fd57cf4e16e0a7c 100644 GIT binary patch delta 20880 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 C2Z`PQ delta 20274 zcmeHv2Xs``y71a3A!X9bq?a=(WYTBS!vF~-pcDlHQbI^3$s`O(W`>ywJqE;rO3im+ zgB4J(1+Ivqh~5iW!3MVb)a&!vu3qoG50R%{pFW?yZ|{AkN{atlZ~gaQ>(5%5IcJ~U zzOui5=1=EBAAU^r$UT9i7VZr^L8>5TXEofr;|z>{cmZu`B#WqFKDh>>cP7)<8;Rj) zGYcCVU;y{`o_~lef(UkG%;Xc zm~JgC+M4ppe1odpYH>K_5hdbkZAH|9x? z=4(dStFDad3#D{Au!IC3pEXx{G!jss3`2OX0lc#S_+?wc zMoWhSuf1;NX;yo$(K(Jrwvha2_^6crp#>H2H+V~R zt)yI1_0z6al1sO>5}7`XSIMe=m1&L5YIizH%nnDN2}#Jm4fJ9wNr_gq_ZS@x*H+~9 zG}TCSbe54MQInD6)4@qn9KFX#66w=MGM28(lnTS0)<&n@Z0XXX%B5*-L}!IZ_PN+e7!X6OFjpX%B?x`XD-?outzL zsFc(oCkINajC5roUhlMr&_8ydad3Y-Zt0D7v`L<^C(}tCq=a{-B~?-^`-r5O1(J$J z&%%$}Ohgr!*PLgduXd1`G|5D!(H0XTZ3rX|`HqlcU{eGie>n)?k1tgB^5XC&{F%*$3?;8T1LfLRx@+M*_XrNi+dv zH5JH@Nsk?V_|Nx_$i<@-UxMdd;!7&m!GZGPp?J2cR*%LGmlh8MOG_krN-Z@^M)C|J z2KX2z2P!K(T-&h5)Giz4cEP+QRNpS?Xj{9K6Mzg!Z*7+>^oMq78C~2VT?wrjiS(%s zDPAz^+Z|F7&Av#kq%%!YDP3=pw4nP-C@j{f>9Z!OoMwMc;;5=qDxtNVQa)|(lxpZ5 zozfKgQKyt4Xx5KA@vyXsZDxYZz6?~;B^A<{!BQx_aDt3{;!(PBGcSrZMnAj2?ThSzJ7;cqoE(rvCY9^~4X zWJSWTfh`@Tw!SWHugT#scA4nu87S&(Yl>idZ3qt7Y0rkIYolmO05*S8I~GF6mBWN_ zWnde(1kO!Pp?7~zLg8gY%%C9zA|~h3gs%xoRYNq)HE2CjwcZd6TgQj&DUgccoIwpS zT?z1mAzP8b_^@jHup`3Y{Pk8I$8V=Ba$11jEe9IUZQxrK#a?_vFwZL34Oya{3U1L7vipWYdH?mzy0W zMthfo9?g;Bkp}|d+>|gWPo^J#gX|>k3z_x{sFRKC8+21MICNYIir!hgx7g9`Q&m1Y zib?n8KogoD3(d~uT8GnKB;y^8QR6xh4Y59qYIaQN?O;gY2rx7lV0A++;;X_1+J%Np zh?q7V7EH?mV^JKOpBejip{ta1q z3Yr6Dx!C|GW@zC38CkS^8JccUGZg`I<;*zxmzh!wjl#1=fBu$4^Fs`KXXe7mnQ4ro zfikkQAZW;}Mj!ewpQZJ=zjIcJ&;7fzdZ1zU1fRAYv#s#+>|(h4DmC1EbyQeZR_|JQ zm9Zx)D+`*hnuP6z@XA$fP;zyH(kI1d{3BOa!C&y7jW3^*&A)r*N7rNff=q}&<$TL=!Iq1WcxhZe$5K_{u&(=EKG%{&U7g5EQRLI0ywoW8xD7t z3z2B+LZP-Oo*qScM>CtGP{`|2i$_;=MRTfwtt%YPEJ}3u8AEN2QY>866$Yofg1p4W z-@2j_-8)t!v>g?)-C+XT;zZ9gb~H+qC)#}2zc|q)Ax0I6(>=nsuUmJN<9+j&ZpL(z-P;u{#+~EiZ+O%Znl1TnsbKbKy>N zExco%1j#E3h>AW_hdO`pifY)kqJ9kLSUPDDLA8Q^{cveTfih1jEa}dIe*E9xU5rM_ z8>`}AtvMZj?v91n9vw{SDH5)4!y*zz4@{8M;fmkmv|4*g;K`l}xX_~w7Kfq$GJ17z zb?=ly)=nH~dZ7KA-DN+R6T!>g}yCo>tWw|m-i*A*rX!=o=#2tC~ zZ(9z%cO2>p+y&IGw1{o9n^P;J=%>tr{AgvgXA?noS*&2ImBKMLFwyl$$4096{1Nj5 zrFg+iAo@!<>K*#a^y4@?>?rY?nORWv_8QPRgZT<{|Jx*zp3awoVVP6rbKnvo%$Q2x zi*A#pCUAt{`rIc;^O@-PINSEsnI_pRnJmGlrt$!fdVY0}cy zs-#q3lq#r7g7P&9zd%zI!VPE@KnyCN9xc=`SM!MWO)K@rPHKv znpQ8VNI%RT&;+t@Bsd4^So{W_94Lm*2a1H>o3t?x>Nl!WxX|h`Ic2kDZlBd@VqSQs zvBzODz{-uuvF^uc>EV;SJOkXdF&UoRm=B+9%t;cWk4a$sV_jH4aOqNE<%cQ_?FOjZ zlfYWU0GjVfN=2e~;e}rM7UQZ+t@=(7ZM50Y_tLg25ruw`uTQ~k9oVc6F2PW1uQs3RBq=@^ zCvsr;3szrW4EJ4M0&icR8{^)$D=0B|qZ%|f%)+m*2D{zLB78^^);jyvkTH0t<2Pq+ zs2RL*7RKlXE+8nRKx&hYO-MA zP3h2glU7769=|DuJ~u;(4Q5j^*V$MUPj~!;F+OfiMPk&rrc8=}lMO*Chsin5)s% znrq?5TPLzdi986RLkqXP$7Hl4YE81!+-tJ-Io&&9DCHu`|&)`f}SO&~1MR-rt@r=ohym zE`;w0!`>LM9!DoWJ(|E`mB{K#RW&R}6$cx4rVf>Ws;$=Ps+45wDnx}HU7%s2&PsP} zO=UTr2R5K>Ey|qv)&+g$%Z2jXk-RY1NX-5m|2$B#NC6mz9WFFkTV128@Jr;ZP$Jtc z`r$W;BQZc(R>l%KBGza#I+u@TOjTJKjzOtQf9@g~dX~rGU^c8VJEvGXOa_(KopI2* z8j&|RmDsSx<)lW?jHQ5fFDK>VPI*?c$4o*!&*RLboK82B@d2vRQu?u(Op7VTEBP9u z-E3^bq>`(73^wEJ#Vg1Zx^e}UVH{XNv?6kUeg(-Dfg_vU+KvIs5|d?BlLbR!%?L62 z-xz)GBk{DQmxNMXH%VrhsM*~lpKBMop_^PSru?y+WQi$rdPp|Cq6bqZJ|hF^%{?TR z4ZpjGhN|;f^6Obk_M2CoH(v4=iLpEwdtCHhoD_=msk( zq-7E&o}RXnFt*{Btt4G+_=1(luE}#E@W|tSWv5j}8AYes$XI~^n~h|-Hy%nKv5^dx zZE~gSu=CYo>g~;@$;J%fZ0z9=6lY*NZC~PC`BvGtbXh&4du#@}* z&P!Yhy5i5slKph6on*S%B#AFE%i7h&f)?&NBy*#*AVa*gu#w zZ&+B_tUTw!X2o=}$vz5r;mg5<;ZgWl9OS3cj1NYkj;brFMJ}&KSH=>py!NMQ$W7Pk zD|L!O>a}+C^_WVOLpMB`#4s(=KcChGO9@mPE9pi|=VIXn-iEFH^oOdl@>Erq=7&5Jt{gPYTU!9RVw1NNp|V&lFAAIRaY^ zD9a$(++&7M2)cL13n)gXZ{1^r!WDxU)Awpe1(9A~PCxpD#E*zA%^gQGR)b7mhuUVvIx>+y zxDM+k-d#rw!bV`_4jJoF53{@{UAdm*(S7TQorZ6~(vm3~NDbYvflQ(&H;|m;dp;!# z2yM6)bHq*8lBuHJqn|4i?jN)p+n1Z>S*=bcJx^XsCWX69OD=z-21qT}i?atv5pAVt zF>D_oNkTat9>5$RRtHR>ksHYs^k}BkL!VttVtGW21vu!(8*xR1yWysbhCp?f!zxDZ)` zj%t}s=b3uWCi`jBdZ4jOD>M+WIyI17E(L)YE7N z9}mCDH()I6%wiHjd8~}h+HeCZd_F5iB{Jw!GVW%lJ)Er(M$g=U2xAYiDTD_E0vU94 z=QkvgH@PBr8T7T6FovpR9z(o#$bxPdR!DcnjAEpItixeZKfb}vn{WkA7j_$nwqXZ7 zFit{Ow@%6sakKhDEY5LH&mJUGY*R({=i?b*9tAagsCp~d9US-`vR?uy?5HtObeHd@Wk5_IL99Aiqt9&ad5X^OO zD{|Q9ThTbWxEnu~Z6k#Uv~dSXNMLADcH{D?TB_I4k3T~`_2I-I=7`G^=m89q2j;EG zD`LDDoLAh|rWe<=ZaWF$4BE7vg!2oA8jq*V=4XG+RAw;&jMIkErn$(aNWd}lJiEQL zM3UjIRMlWYAXV+aQ^``-^r{_bVI!_%XxMMCR?6*ZQcSnU(af1r5Iwz<1k;yxAcMTK z1B;$Ab|Q1&M=EXENoK>Q;yBi$j(*dGlbmMLrR*Z(#O)Wi;V8#0GJ|#Vf-;WEgUE>& zcab39cn*Uhuei}^%qyZ%gUEaMp{6(8fkD-IgJ>D99z@ZzcaWq}&9@{jo)^4vaOVL*Hd?}?K?#3OM8)5a8qMx=_QnrVf)aZ;d`9%8xrol zsm6Uo6Y4hV=`(w=qvj%Mfc&u$^xyZPaQ=B8*~&f==)v1iRlI*2`I!FUcI@`=m$3|{a(GPc#gm@oDaB)%79XNQ^9V8P^<-$S!wPBE?;@zEtB+-*QWXz+u>h5`( z4Gg!Lj4hIVz_=5S04qE*^jQ#zia$7X`KzL7ON?!Dp`69XWEtqCJIPcL4--Xb%%hlo z7n#7N)XjI1T6*8TNR6}ilJWH7gQ#{g?jzHL_}OwdN-fSFWIwu%#rv@zIff_2v>)XX zzq)Tfp3rCZBYUKNg^Do#03IAplPeD(a$66O2Kw6rWIFwleN-L9HCQ}{-gpq1v8@T2 z?Bqd|5zjBewjT~6Va`8*el0RtypDl;IkxA@da9WP2wj)LH@@i})N)VXLrOVh7w;k6 zwCP@~+8YwQ7592ml&;e zZ-M35QM5JMOzqquJ&bwT1y3LrKRHZh3&v^q9X}*#M-fFEe@Ciu!Id}SzTW&Dp2x6< z5of%Jm+J>+5UBDjR;S!)?L#fSGyt`9NuU%=w>?ZkQ@xz>PP2st+t`<2ipL)&i#Xn5 zkKkcKl&R_LBSd5h=)e)=>O)6xRgQr_A0d^v4f!ZZz-nOuSU%hT#7B^`?2iyF54qCA zk0AYdH88VcK6(TNq}!50Gi-`@#;lL4zCfL}1uZk)fo0&7THn`;Fq?r8LuLEhWX5gBSaSRrPJ~z4^yo2?o9h-qN_9jh=Rm)cM}Iy>$`CL6A0w^!RdWm% zc=2)E>xIV&k29n^fxDmf1csPaJ%P&ec6NK_2{KlM-jt~^+Ga+Yc*>ILr9;SH@^O+R z!a9td6uv9(on})9{VG683A14~2y-eJ|5MSYYtcMe9w3EBvX06I7}2?Sn|uNf zxQzwQRL9V`*?0oC%%W#1r6U4_5tbDC+6fGuVO8v~o^4rm85ZxlikTk^psPP7^RkC> zhInt`)Y7rxQpSiK(Uql9pAflYq#2nf=62zntP;7U#oWuP?a?B#Yll`at}USpPgj3J zGKMM>*1I}ZSJ0=!B+Zaf0fCYCJ|Wr>p+j$#CVWaXBX&gp_xP+&Nw6lMwu;x554n1I zb%kC;ypCguZ;K=u4W2h6=-!hgVn`pF4@Kf|Pjz(R1J@Am=z&dyc!$Jzq~0}(2Lq0W zog&jnsM`XBnbie}ZaW8!K(oW?&~`f50jBarG}pNO&#k4OPNV2!N{d&I@`AWiDWP=E zGgv9YWErcw456{NhMJ2@WQ_qm_Y%VSQE7{qS$U$Ol1HJH!5I=LN z?O7%XpCvioCe3Hhl5C;SBA+93Xv=e?ITZ~>uL!K!!5nc@ht|dp;h&x(vT(+^OtdK~ zE&F*=B&t~YQEj}*3=cILh&Mftn)v+l9(DKq^CW{sLQ`LG#keQFpx6iY7f=(Oet}eT z?eOCZD7Z8)q6nM&qM{w(Xj&q@?M1Z9xCQjni>Q~X&!Bi|IU|G-{QV!H^!77|D=hC# z6*ehiIfR}&OCnuK!+1!Y6i!plqVD5Zo^=+h4L==^)x68%;_242sCc;teEKZv6kejt z^aj!*h;IK0rEO>d2JD!NO*5F6%iL8gyA2$}vSto?sS=<1de-#cUdNfXKZ_IW{)WW5 zd|x$lVV)#3O=y6GG;Ca>+0lgH4r=g{;My#%_WS*bZon<^DyETm%j7o60;lTs%B z^?6(dz3@aTzm70gzK+II^&AX#tbCnlkx&R(JU#L{Q7QFYPc6o|c##y+Cs#Pd?!W@Z zU{VCU``<)^q2M*#v~e?#0sE!{X7FH?HsPic?>6+O*dVKxaPhni?^`w zQZRgw7ff|;A+IWo7Q$WB?za%1ye5Oy=U|N%efBLh8Wg}WO^&Egzm14zONmmN9XBC+ zb-azlQzA6std=&@&1|lVLQn97$7~omfmH`Z*9W?RYi5%aGM;Bd5CJ9n6W03hmA#1& z!aKS7*6-!1mg0HbrPiP4ALiCO)>mOU6!P$w&4#5C0d+@*;k<5WnZ)?IQ8Ctg=ehm(|Es6>@o* ztgn)5aL1P z7Nm3863UBFurMTMNR`D$pvvNJjEpk(t9K3J>PH#W=QQ^W74%)%cO`$f-94_#6J9r4 z7vM;4Z470hxQ3zT#}_%=LGh$wwTF|zAR9+!qnS&Pp7#Xrky-7jeK_5wpYrcZ(Ai(*?OC z8uk~C0c)h%OMGz$hfj1mQmIe>Au zx7*y|p4rw_96ijUK=;gpj~UVB>~%~p4cog4T2xpDgPsOVjfsg;%m(gHpw5N3m~37y zgb#Ct6j&cq0Kbi?<4z2G7sF$EnNSzY0p}59Xp7BvNsK@SZK%C>-ZU+nQ$$=@;8`4M zT~ss##ChKS@Ot|Z7R6~0a-$A|zHw?1H1V}JdRH+ew2FfbFU4s&>HiUjHU)wRnenLt ztbzC>*c*Q%WU6ic@|Ot}cv4;Dy;~IoCZuubc#$OECjy~@?u2xAGvB9IG#K7Vm`(Ml zZD3rYn$EorFHWT-Fu9w`izVGvQ}ATsGXGt0hOp{_;Yez%zcLtk-VFY}0*{@-U~;Vg z!q&OxTQ&GPvMfpNS`h$>2-S$E>BR&#}eF;(p zq)kO{us~jD?&-mzBD-}p^UKWW&>PJ?>{VjuO3Q~`X(@t`N7FE}$N1B%i-7d>DDhT@ zA1hqOCV@rijc_;}YesO!3+Z~u%&5n=Ig62%yidUD<>vO~TIS*x$(Z?R@8-sG1UE5R zE1m*ZC{#qVU_oY@CkoE`iD6MQv4C%OcPQMOnG7d0mC9DeVHY!%vMi=kF$V({&7<(I za=n|K+^2y(`kTAi>ojoV9YdCCIGz>5!p-onSX}7ZhSN| z>gix9FV9mI2+rI*xFdHy-v!gqevk9V%2Dn>1Jj`R64jEiR(N@A4^-z_;r=`gJsKgU zhB5&^L2klu=%pqpKEhS7Q!;1Ld`zsdH_KQ7d8xL<8{R--bLW0wx0Y9$dqew`HW?2x zdwnkp)AHP?5inmf61>G=DGCZeb3wcZgfHFUL~}Li&|6T*WNd&t%Y@^B?5>GrInDa)A$P+<@hIZ zEPBa;U^uK3g{#c=3lX&WN|z-hq*m`T&h1=H0F!~O`Xn}s`WLgf?A=({nGy{j>yb}T z1jXZq(HvMSqsp_(jFM5lg=wOCgK`FA7ieHHvfh+cdNyF5eh*?Ja z^8uo_^78@e|4%jcOH%(gs3v~KVYF29`O$|FsU~`l_N*zrM|swi-lIHgO7BsgHKq3` z&zk5x+OsBlk9gL8)o)1r^ZXjaNK)*d1hf1n-td< Date: Thu, 28 Nov 2019 14:52:51 -0800 Subject: [PATCH 20/61] Add note about pom.xml to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d57bbdd0..38e9b944 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ jobs: - name: Publish to GitHub Packages Apache Maven run: mvn deploy ``` +See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. # License From d5150a6a6702411fd3470e7e813b49fa0c1cf51a Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 29 Nov 2019 09:26:29 -0800 Subject: [PATCH 21/61] Add publish to Maven Central example to README --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 38e9b944..9c94aef4 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,15 @@ jobs: run: mvn -B package --file pom.xml - name: Publish to GitHub Packages Apache Maven run: mvn deploy + - name: Set up Apache Maven Central + uses: actions/setup-java@master + with: # running setup-java again overwrites the settings.xml + java-version: 1.8 + server-id: maven + username: maven_username + password: ${{ secrets.MAVEN_CENTRAL_TOKEN }} # password from secrets store + - name: Publish to Apache Maven Central + run: mvn deploy ``` See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. From abe10fa040ef9c5456a53aa88caa806b25644570 Mon Sep 17 00:00:00 2001 From: Dominic Zirbel Date: Fri, 29 Nov 2019 22:53:14 -0800 Subject: [PATCH 22/61] Fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 568fd1be..46949ae9 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ jobs: strategy: matrix: # test against latest update of each major Java version, as well as specific updates of LTS versions: - java: [ 1.6, 6.0.83, 7, 7.0.181, 8, 8.0.192, 9.0,x, 10, 11.0.x, 11.0.3, 12, 13 ] + java: [ 1.6, 6.0.83, 7, 7.0.181, 8, 8.0.192, 9.0.x, 10, 11.0.x, 11.0.3, 12, 13 ] name: Java ${{ matrix.java }} sample steps: - uses: actions/checkout@master From c1c11bbc1b2c22f330c066444efe1634d201f15a Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Wed, 4 Dec 2019 23:22:47 -0500 Subject: [PATCH 23/61] Examples use v1 instead of master Co-Authored-By: Konrad Pabjan --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9c94aef4..95fec46b 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Set up JDK 1.8 - uses: actions/setup-java@master + uses: actions/setup-java@v1 with: java-version: 1.8 server-id: github # Value of the distributionManagement/repository/id field of the pom.xml @@ -77,7 +77,7 @@ jobs: - name: Publish to GitHub Packages Apache Maven run: mvn deploy - name: Set up Apache Maven Central - uses: actions/setup-java@master + uses: actions/setup-java@v1 with: # running setup-java again overwrites the settings.xml java-version: 1.8 server-id: maven From bfbec53132fb4c4369c9a47a2bd7aee544453438 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Wed, 4 Dec 2019 23:54:21 -0500 Subject: [PATCH 24/61] log when we overwrite the file --- dist/index.js | Bin 157530 -> 157976 bytes src/auth.ts | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dist/index.js b/dist/index.js index c01c0f396189c7757106968d7fd57cf4e16e0a7c..32058f3255c74a0535b1ad22a57783ccb089023a 100644 GIT binary patch delta 344 zcmcb0j&sH(&W0AoElfvvO*8UyQx$9#3X1ZRQ;UoBQuE59)!jWqJVKq~!~KK2g999$ zUDab1YHAeni}gT?Q!4Ot(@{FRxHnsI^wm*9SAL z6nrwXQ-Mr%g{0CFg|x)XoMMH{G=+l1k_?5^ip=7Y;^~osOx4p5MKTIa&eLI=eoK(a zWV*&PMn2Bu#FFF;1&vhA>4tGk!kmh!ddc}IshV7q8^y)-t+^DC0MJAYh_r&OtwLHc zP-R|mNn&0}v7UdtYlO4U^o=S^B9jFiSf;NLWa5;}FH0>dFUl;*%u9#30>ntm%t@WT zN03Qk`W-VSj_C^L89Aok5oA&ku2x9R16mDK1N2{MNt&*O`t*b-M(ODnbePzu3w&c_ L-7X@;t*EUrlw>TX=rZO;A1LaW>%=Ro_ Date: Thu, 5 Dec 2019 00:41:50 -0500 Subject: [PATCH 25/61] logging options --- dist/index.js | Bin 157976 -> 158003 bytes src/auth.ts | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 32058f3255c74a0535b1ad22a57783ccb089023a..22c99c9fca81ef1365e04872a6ac91b43efd9d4d 100644 GIT binary patch delta 110 zcmbPniF5NM&W0AoEliF=;tJ)NB^e6&1tppJdBqAU)lk-S2O%c;>1jetvD3c_F_nwy z>no(BrX`l#Pliu_V7ECPD?+7soPOs)?;@N&l In8_^^08eNnivR!s delta 80 zcmV-W0I&bE(g~Q-34nwFv;sjAmst`59+%)w0tc6Q69OfdoDu>!2q9%IV{c?-DVGs6 m0v7^hJD0-}0*IF&&jARRdJ_Utlke*Wmk;&<2Dj}K0!CFKy&6XV diff --git a/src/auth.ts b/src/auth.ts index 875c6b4d..2e83edee 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -46,9 +46,9 @@ export function generate(id: string, username: string, password: string) { async function write(directory: string, settings: string) { const options = {encoding: 'utf-8', flag: 'wx'}; // 'wx': Like 'w' but fails if path exists const location = path.join(directory, SETTINGS_FILE); - console.log(`writing ${location}`); + console.log(`writing ${location} with options ${options}`); try { - return fs.writeFileSync(location, settings, options); + fs.writeFileSync(location, settings, options); } catch (e) { if (e.code == fs.constants.O_EXCL) { console.log(`overwriting existing file ${location}`); From 96236d7072cf35fe951ee34da7850be147cd261d Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 5 Dec 2019 00:43:41 -0500 Subject: [PATCH 26/61] return but shoudl still fail --- dist/index.js | Bin 158003 -> 158010 bytes src/auth.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index 22c99c9fca81ef1365e04872a6ac91b43efd9d4d..3f1a2e3aa06f4a0985c1e2d1d6832a0909bc8c39 100644 GIT binary patch delta 29 lcmdmdiF4N_&W0AoEllM?(;xUTu}`lQW>VcgM~G>97yz`N3e*4q delta 24 gcmdmWiF5NM&W0AoEllM?(;I}DRJSh{VwxTX0DjX66aWAK diff --git a/src/auth.ts b/src/auth.ts index 2e83edee..f0d11972 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -48,7 +48,7 @@ async function write(directory: string, settings: string) { const location = path.join(directory, SETTINGS_FILE); console.log(`writing ${location} with options ${options}`); try { - fs.writeFileSync(location, settings, options); + return fs.writeFileSync(location, settings, options); } catch (e) { if (e.code == fs.constants.O_EXCL) { console.log(`overwriting existing file ${location}`); From 2b05c0051416301757a657e4d41bd5a6c987bda1 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 5 Dec 2019 00:45:56 -0500 Subject: [PATCH 27/61] logging code --- dist/index.js | Bin 158010 -> 158087 bytes src/auth.ts | 1 + 2 files changed, 1 insertion(+) diff --git a/dist/index.js b/dist/index.js index 3f1a2e3aa06f4a0985c1e2d1d6832a0909bc8c39..e31c4d7686c909eb8f1c36f3e2880effec951237 100644 GIT binary patch delta 76 zcmdmWiL?DOXG06)7N+aM)7M^P Date: Thu, 5 Dec 2019 00:48:15 -0500 Subject: [PATCH 28/61] strringify the logs --- dist/index.js | Bin 158087 -> 158099 bytes src/auth.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index e31c4d7686c909eb8f1c36f3e2880effec951237..0ff2524dbc4de10bc6fc9d2ce5d803b8b102b51a 100644 GIT binary patch delta 45 zcmZp_%sKfoXG06)7N#e{lBq>S`9%sU)n38=etN|vMVWc&nQ4_8shZnA3NuX$1pt#$ B5i9@z delta 33 mcmbPynX~;eXG06)7N#e{yvg|~sR}C9sd^yB_P@eR(?S8?7!1w; diff --git a/src/auth.ts b/src/auth.ts index 1e0c4f86..f7162618 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -55,7 +55,7 @@ async function write(directory: string, settings: string) { // default flag is 'w' return fs.writeFileSync(location, settings, {encoding: 'utf-8'}); } - console.log(`code ${e.code} and O_EXCL ${fs.constants.O_EXCL}`); + console.log(`error ${JSON.stringify(e)} and O_EXCL ${fs.constants.O_EXCL}`); throw e; } } From 797045350f7883bf56a4ec7728e71f079f9676d9 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 5 Dec 2019 00:54:26 -0500 Subject: [PATCH 29/61] code == EEXIST --- dist/index.js | Bin 158099 -> 157999 bytes src/auth.ts | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 0ff2524dbc4de10bc6fc9d2ce5d803b8b102b51a..92274cdc22e617b72b442abef53bf4a62269e082 100644 GIT binary patch delta 42 ycmbPynRERm&W0AoElf{^IFwvnBRqpcl%^+YF^NnTaA27(Ak1`pyMYK(awq^iD-9t4 delta 122 zcmZ2~iF5L0&W0AoElf{^gwu-klJoP5OA_-+iuL^CT_c=*ra!c05}7REz%rdxnCbZR zwHFzA?Nf`2@{1Hys=b2!{q%}UiZb)kGt(+HQZ;K867y0NAR2-4Sd6Pp(6rvZUzn*N F6ab>_D Date: Fri, 6 Dec 2019 14:25:41 -0500 Subject: [PATCH 30/61] Use $HOME directory --- src/auth.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/auth.ts b/src/auth.ts index 6068341f..09a1f782 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -16,8 +16,7 @@ export async function configAuthentication( console.log( `creating ${SETTINGS_FILE} with server-id: ${id}, username: ${username}, and a password` ); - const home: string = process.env['GITHUB_WORKSPACE'] || os.homedir(); - const directory: string = path.join(home, M2_DIR); + const directory: string = path.join(os.homedir(), M2_DIR); await io.mkdirP(directory); core.debug(`created directory ${directory}`); await write(directory, generate(id, username, password)); From 5e29577d7bda754152759cac220bfb4e1967ea40 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:28:17 -0500 Subject: [PATCH 31/61] Remote options from log --- src/auth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auth.ts b/src/auth.ts index 09a1f782..7ebbe83f 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -45,7 +45,7 @@ export function generate(id: string, username: string, password: string) { async function write(directory: string, settings: string) { const options = {encoding: 'utf-8', flag: 'wx'}; // 'wx': Like 'w' but fails if path exists const location = path.join(directory, SETTINGS_FILE); - console.log(`writing ${location} with options ${options}`); + console.log(`writing ${location}`); try { return fs.writeFileSync(location, settings, options); } catch (e) { From 8940139ee84ca9e5eeaa73fc5c7cf5e9947a14b8 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:28:34 -0500 Subject: [PATCH 32/61] Be explicit about second flag --- src/auth.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/auth.ts b/src/auth.ts index 7ebbe83f..2e6605df 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -50,9 +50,8 @@ async function write(directory: string, settings: string) { return fs.writeFileSync(location, settings, options); } catch (e) { if (e.code == "EEXIST") { - console.log(`overwriting existing file ${location}`); - // default flag is 'w' - return fs.writeFileSync(location, settings, {encoding: 'utf-8'}); + console.warn(`overwriting existing file ${location}`); + return fs.writeFileSync(location, settings, {encoding: 'utf-8', flag: 'w'}); } throw e; } From 4b6ff8caf0490546ece91408c70199e239e79353 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:32:51 -0500 Subject: [PATCH 33/61] Format auth --- src/auth.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/auth.ts b/src/auth.ts index 2e6605df..1001b2cf 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -49,9 +49,12 @@ async function write(directory: string, settings: string) { try { return fs.writeFileSync(location, settings, options); } catch (e) { - if (e.code == "EEXIST") { + if (e.code == 'EEXIST') { console.warn(`overwriting existing file ${location}`); - return fs.writeFileSync(location, settings, {encoding: 'utf-8', flag: 'w'}); + return fs.writeFileSync(location, settings, { + encoding: 'utf-8', + flag: 'w' + }); } throw e; } From 540a98ac020a18cc64370d8c5a5ade3f026164ff Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:33:05 -0500 Subject: [PATCH 34/61] Wrap long lines in action.yml --- action.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 912a09c4..0034c965 100644 --- a/action.yml +++ b/action.yml @@ -1,9 +1,11 @@ name: 'Setup Java JDK' -description: 'Set up a specific version of the Java JDK and add the command-line tools to the PATH' +description: 'Set up a specific version of the Java JDK and add the command-line tools + to the PATH' author: 'GitHub' inputs: java-version: - description: 'The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x)' + description: 'The Java version to make available on the path. Takes a whole or + semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x)' required: true java-package: description: 'The package type (jre, jdk, jdk+fx)' @@ -14,7 +16,8 @@ inputs: required: false default: 'x64' jdkFile: - description: 'Path to where the compressed JDK is located. The path could be in your source repository or a local path on the agent.' + description: 'Path to where the compressed JDK is located. The path could be + in your source repository or a local path on the agent.' required: false server-id: description: 'ID of the distributionManagement repository in the pom.xml file.' From dbeab7ccf21319c27d1b5bccc1661f7124e0b82f Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:35:32 -0500 Subject: [PATCH 35/61] Remove trailing spaces and long lines --- action.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/action.yml b/action.yml index 0034c965..c82b0ec8 100644 --- a/action.yml +++ b/action.yml @@ -1,11 +1,11 @@ name: 'Setup Java JDK' -description: 'Set up a specific version of the Java JDK and add the command-line tools - to the PATH' +description: 'Set up a specific version of the Java JDK and add the + command-line tools to the PATH' author: 'GitHub' inputs: java-version: - description: 'The Java version to make available on the path. Takes a whole or - semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x)' + description: 'The Java version to make available on the path. Takes a whole + or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x)' required: true java-package: description: 'The package type (jre, jdk, jdk+fx)' @@ -16,17 +16,19 @@ inputs: required: false default: 'x64' jdkFile: - description: 'Path to where the compressed JDK is located. The path could be - in your source repository or a local path on the agent.' + description: 'Path to where the compressed JDK is located. The path could + be in your source repository or a local path on the agent.' required: false server-id: - description: 'ID of the distributionManagement repository in the pom.xml file.' + description: 'ID of the distributionManagement repository in the pom.xml + file.' required: false username: description: 'Username for authentication to the Apache Maven server.' required: false password: - description: 'Passowrd or token for authentication to the Apache Maven server.' + description: 'Passowrd or token for authentication to the Apache Maven + server.' required: false runs: using: 'node12' From b7e70417f9c68e1094a7086d3dcce5ee28353440 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:36:32 -0500 Subject: [PATCH 36/61] Remove last trailing space --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index c82b0ec8..eaf3aebd 100644 --- a/action.yml +++ b/action.yml @@ -2,7 +2,7 @@ name: 'Setup Java JDK' description: 'Set up a specific version of the Java JDK and add the command-line tools to the PATH' author: 'GitHub' -inputs: +inputs: java-version: description: 'The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x)' From 6ae690c576a37d52f0a1d35f4d8f15ca4b233ae0 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:46:35 -0500 Subject: [PATCH 37/61] Add test for overwrite --- __tests__/auth.test.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 8e5efd4e..ec54bce2 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -42,7 +42,26 @@ describe('auth tests', () => { ); }, 100000); - it('does not create settings.xml without username and / or password', async () => { + it('overwrites existing settings.xml files', async () => { + const id = 'packages'; + const username = 'bluebottle'; + const password = 'SingleOrigin'; + + fs.mkdirSync(m2Dir, {recursive: true}); + fs.writeFileSync(settingsFile, "FAKE FILE"); + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + + await auth.configAuthentication(id, username, password); + + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( + auth.generate(id, username, password) + ); + }, 100000); + + it('does not create settings.xml without required parameters', async () => { await auth.configAuthentication('FOO', '', ''); expect(fs.existsSync(m2Dir)).toBe(false); From f33acc6b4f056fff50e7b30f9ccb5c4571191c82 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:46:43 -0500 Subject: [PATCH 38/61] build release --- dist/index.js | Bin 157999 -> 157938 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/index.js b/dist/index.js index 92274cdc22e617b72b442abef53bf4a62269e082..7d9c7bb1b3304b693ee25dae641e091ea1d90009 100644 GIT binary patch delta 147 zcmZ2~iSyG%&W0AoElfvvr}ObKiSgtY>t*EUrlw>TX=rZO;A4_xnI0*`)Wf0f>Kfr0 z9HKt`p)HfhWB~^jj{KZdz4FAOyy-l`OxDvC&NFgMuNPucnI80+QA{W`FF8LYGcVmr zLA|sjP1izQXY$8FQO>lSM37Lq`s9lRBGV5jF>y{8@L*z@o?ybnxBZMTQ*tN(fMG5J delta 200 zcmex#k#qee&W0AoElfvvO*8UyQx$9#3X1ZRQ;UoBQuE59)!jWqJVKq~!~KK2g999$ zUDab1YHAeni}gT?Q!=GFiZZg*`tfRWBz$efnl0CTlT$eT9_Nw8YY!5{0y!#B_zs sVg>bb^~oPqC8mEBVp0=QNX<*mPsz+nw^C3qElJb0P~To4%+wSL03ljJ^#A|> From ddf78adea0a00c0f59c71944fbdd38b35921889d Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 14:50:30 -0500 Subject: [PATCH 39/61] Add note about $HOME directory usage --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 95fec46b..2f6521dc 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,9 @@ jobs: - name: Publish to Apache Maven Central run: mvn deploy ``` + +***NOTE: The `settings.xml` is created in the Actons $HOME directory by default and will overwrite existing files.*** + See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. # License From 70aff31eb73fad306647407eb2135e5271071c30 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 15:31:28 -0500 Subject: [PATCH 40/61] Apply suggestions from code review Co-Authored-By: Konrad Pabjan --- action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index eaf3aebd..1f952a87 100644 --- a/action.yml +++ b/action.yml @@ -24,11 +24,11 @@ inputs: file.' required: false username: - description: 'Username for authentication to the Apache Maven server.' + description: 'Username for authentication to the Apache Maven repository.' required: false password: - description: 'Passowrd or token for authentication to the Apache Maven - server.' + description: 'Password or token for authentication to the Apache Maven + repository.' required: false runs: using: 'node12' From 203550b5425c7f308974addc549848e67d7cfd70 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 6 Dec 2019 16:21:27 -0500 Subject: [PATCH 41/61] Add Gradle example to README --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f6521dc..a6acabf7 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ jobs: - run: java -cp java HelloWorldApp ``` -Publising to an Apache Maven Repository: +Publishing using Apache Maven: ```yaml jobs: build: @@ -91,6 +91,33 @@ jobs: See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. +Publishing using Gradle: +```yaml +jobs: + + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + + - name: Build with Gradle + run: gradle build + + - name: Publish to GitHub Packages + run: gradle publish + env: + USERNAME: ${{ github.actor }} + PASSWORD: ${{ secrets.GITHUB_TOKEN }} +``` + +***NOTE: The `USERNAME` and `PASSWORD` need to correspond to the credentials environment variables used in the publishing section of your `build.gradle`..*** + +See the help docs on [Publishing a Package with Gradle](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#example-using-gradle-groovy-for-a-single-package-in-a-repository) for more information on the `build.gradle` configuration file. + # License The scripts and documentation in this project are released under the [MIT License](LICENSE) From 8ccac94e40f51d001ee914a334172da354e5780b Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Mon, 9 Dec 2019 12:16:15 -0500 Subject: [PATCH 42/61] README Small spelling fix. Also some rewording Co-Authored-By: Konrad Pabjan --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6acabf7..24fc35f1 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ jobs: run: mvn deploy ``` -***NOTE: The `settings.xml` is created in the Actons $HOME directory by default and will overwrite existing files.*** +***NOTE: The `settings.xml` file is created in the Actions $HOME directory. If you have an existing `settings.xml` file at that location, it will be overwritten*** See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. From 9d56a3bd350a62870fa2229f7513bb2b96d8afa6 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Tue, 10 Dec 2019 09:26:42 -0800 Subject: [PATCH 43/61] prettier fixup --- __tests__/auth.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index ec54bce2..3fa739c8 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -48,7 +48,7 @@ describe('auth tests', () => { const password = 'SingleOrigin'; fs.mkdirSync(m2Dir, {recursive: true}); - fs.writeFileSync(settingsFile, "FAKE FILE"); + fs.writeFileSync(settingsFile, 'FAKE FILE'); expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true); From 551e2a2770b8079e2141a6b4728a7b96ae33ae50 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Tue, 10 Dec 2019 09:26:51 -0800 Subject: [PATCH 44/61] sanitzie XML characters --- __tests__/auth.test.ts | 18 ++++++++++++++++++ dist/index.js | Bin 157938 -> 158179 bytes src/auth.ts | 15 ++++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 3fa739c8..7134e5cc 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -82,4 +82,22 @@ describe('auth tests', () => { expect(fs.existsSync(m2Dir)).toBe(false); expect(fs.existsSync(settingsFile)).toBe(false); }, 100000); + + it('escapes invalid XML inputs', () => { + const id = 'packages'; + const username = 'bluebottle'; + const password = '&<>"\'\'"><&'; + + expect(auth.generate(id, username, password)).toEqual(` + + + + ${id} + ${username} + &<>"''"><& + + + + `); + }); }); diff --git a/dist/index.js b/dist/index.js index 7d9c7bb1b3304b693ee25dae641e091ea1d90009..c7b1f986e251ef46b80e725ac2b5ef0c6a671f10 100644 GIT binary patch delta 297 zcmex#k@N9o&W0AoElgGX^=YMf$t9Wjc?zk;$%zH25xzbeWr;bZshSGaTna!?lv+|+ zl&1g|0}Frz^@>spauSnMHT2c=({&Wo)e>_HtkpHK$lE~Vb4svF+XX=6({acvL8J>y z^KmFphuU9|UktRtnyYqtB|p{&W0AoElgGX)4c?k=Bj6=)Y|B0rr2>Qz=2I^acWUsVs5IPN;Ql*T}6;d UnWG@FxVSvOC}n$;AX8@q02mP&+W-In diff --git a/src/auth.ts b/src/auth.ts index 1001b2cf..ca43c201 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -27,15 +27,24 @@ export async function configAuthentication( } } +function escapeXML(value: string) { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + // only exported for testing purposes export function generate(id: string, username: string, password: string) { return ` - ${id} - ${username} - ${password} + ${escapeXML(id)} + ${escapeXML(username)} + ${escapeXML(password)} From 4757680fc9fb500faa11db2c790410b69e0d6dc9 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Tue, 10 Dec 2019 09:37:07 -0800 Subject: [PATCH 45/61] Add Shared Runner to README Be the docs for the feature you want to see. #docsdrivendevelopment --- README.md | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 24fc35f1..1e376b55 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This action sets up a java environment for use in actions by: See [action.yml](action.yml) -Basic: +## Basic ```yaml steps: - uses: actions/checkout@v1 @@ -25,7 +25,7 @@ steps: - run: java -cp java HelloWorldApp ``` -From local file: +## Local file ```yaml steps: - uses: actions/checkout@v1 @@ -37,7 +37,7 @@ steps: - run: java -cp java HelloWorldApp ``` -Matrix Testing: +## Matrix Testing ```yaml jobs: build: @@ -56,7 +56,7 @@ jobs: - run: java -cp java HelloWorldApp ``` -Publishing using Apache Maven: +## Publishing using Apache Maven ```yaml jobs: build: @@ -91,7 +91,7 @@ jobs: See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. -Publishing using Gradle: +## Publishing using Gradle ```yaml jobs: @@ -118,6 +118,32 @@ jobs: See the help docs on [Publishing a Package with Gradle](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#example-using-gradle-groovy-for-a-single-package-in-a-repository) for more information on the `build.gradle` configuration file. +## Apache Maven within a Shared Runner + +When using an Actions shared runner the default `$HOME` directory can be shared by a number of workflows at the same time which could overwrite existing settings file. Setting the `m2-home` variable allows you to choose a unique location for your settings file. + +```yaml +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 1.8 for Shared Runner + uses: actions/setup-java@v1 + with: + java-version: 1.8 + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + username: ${{ github.actor }} # username for server authentication + password: ${{ github.token }} # password or token for authentication + m2-home: ${{ $GITHUB_WORKSPACE }} # location of the .m2 directory + - name: Build with Maven + run: mvn -B package --file pom.xml + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy +``` + # License The scripts and documentation in this project are released under the [MIT License](LICENSE) From ae11e1a1b65b1ac2350dbf764d37e0970ef02725 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Tue, 10 Dec 2019 10:03:33 -0800 Subject: [PATCH 46/61] Allow for alternate settings.xml file location Use the m2-home to specify a new location for the settings.xml file --- README.md | 4 ++-- __tests__/auth.test.ts | 25 +++++++++++++++++++++++++ dist/index.js | Bin 158179 -> 158387 bytes src/auth.ts | 7 ++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1e376b55..a98d883a 100644 --- a/README.md +++ b/README.md @@ -137,11 +137,11 @@ jobs: server-id: github # Value of the distributionManagement/repository/id field of the pom.xml username: ${{ github.actor }} # username for server authentication password: ${{ github.token }} # password or token for authentication - m2-home: ${{ $GITHUB_WORKSPACE }} # location of the .m2 directory + m2-home: ${{ $GITHUB_WORKSPACE }} # location for the settings.xml file - name: Build with Maven run: mvn -B package --file pom.xml - name: Publish to GitHub Packages Apache Maven - run: mvn deploy + run: mvn deploy -s ${{ $GITHUB_WORKSPACE }}/settings.xml ``` # License diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 7134e5cc..ce13ef79 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -28,6 +28,31 @@ describe('auth tests', () => { } }, 100000); + it('creates settings.xml in alternate locations', async () => { + const id = 'packages'; + const username = 'bluebottle'; + const password = 'SingleOrigin'; + + const altHome = path.join(__dirname, 'runner', 'settings'); + const altSettingsFile = path.join(altHome, auth.SETTINGS_FILE); + process.env[`INPUT_M2-HOME`] = altHome; + await io.rmRF(altHome); // ensure it doesn't already exist + + await auth.configAuthentication(id, username, password); + + expect(fs.existsSync(m2Dir)).toBe(false); + expect(fs.existsSync(settingsFile)).toBe(false); + + expect(fs.existsSync(altHome)).toBe(true); + expect(fs.existsSync(altSettingsFile)).toBe(true); + expect(fs.readFileSync(altSettingsFile, 'utf-8')).toEqual( + auth.generate(id, username, password) + ); + + delete process.env[`INPUT_M2-HOME`]; + await io.rmRF(altHome); + }, 100000); + it('creates settings.xml with username and password', async () => { const id = 'packages'; const username = 'bluebottle'; diff --git a/dist/index.js b/dist/index.js index c7b1f986e251ef46b80e725ac2b5ef0c6a671f10..f4ff8d1035d31a253d4aa6dc99c16529974084d0 100644 GIT binary patch delta 235 zcmZ{dF$%&!6htwV3c15{Nk9`wX=Cjftd{t77n1#9^MeS27T&>gh=QG$5Kmy?B`n-j z+Bi%z@Mh+DADkb9{h@aWZs9J=u-0Uuyh|Zxl@O{NB^OEzTbKq-O@&z+TA*zRY|9Nq zEBP|9Wu(5eFpdggw@HThk^f-P>HO}?YfF+G8giH|qGST7?#H#H@*NJCR+`*uF2KhXfI C9T7DE diff --git a/src/auth.ts b/src/auth.ts index ca43c201..9cfa69a7 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -16,7 +16,12 @@ export async function configAuthentication( console.log( `creating ${SETTINGS_FILE} with server-id: ${id}, username: ${username}, and a password` ); - const directory: string = path.join(os.homedir(), M2_DIR); + // when an alternate m2 location is specified use only that location (no .m2 directory) + // otherwise use the home/.m2/ path + const directory: string = path.join( + core.getInput('m2-home') || os.homedir(), + core.getInput('m2-home') ? '' : M2_DIR + ); await io.mkdirP(directory); core.debug(`created directory ${directory}`); await write(directory, generate(id, username, password)); From ce88feea9475f3d2dae95300fed6de40719d1c64 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Tue, 10 Dec 2019 13:02:21 -0800 Subject: [PATCH 47/61] Move to settings-path --- README.md | 8 ++++---- __tests__/auth.test.ts | 4 ++-- action.yml | 3 +++ dist/index.js | Bin 158387 -> 158399 bytes src/auth.ts | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a98d883a..ca4d07e7 100644 --- a/README.md +++ b/README.md @@ -118,9 +118,9 @@ jobs: See the help docs on [Publishing a Package with Gradle](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#example-using-gradle-groovy-for-a-single-package-in-a-repository) for more information on the `build.gradle` configuration file. -## Apache Maven within a Shared Runner +## Apache Maven within a self-hosted runner -When using an Actions shared runner the default `$HOME` directory can be shared by a number of workflows at the same time which could overwrite existing settings file. Setting the `m2-home` variable allows you to choose a unique location for your settings file. +When using an Actions self-hosted runner with multiple shared runners the default `$HOME` directory can be shared by a number runners at the same time which could overwrite existing settings file. Setting the `settings-path` variable allows you to choose a unique location for your settings file. ```yaml jobs: @@ -137,11 +137,11 @@ jobs: server-id: github # Value of the distributionManagement/repository/id field of the pom.xml username: ${{ github.actor }} # username for server authentication password: ${{ github.token }} # password or token for authentication - m2-home: ${{ $GITHUB_WORKSPACE }} # location for the settings.xml file + settings-path: ./config # location for the settings.xml file - name: Build with Maven run: mvn -B package --file pom.xml - name: Publish to GitHub Packages Apache Maven - run: mvn deploy -s ${{ $GITHUB_WORKSPACE }}/settings.xml + run: mvn deploy -s ./config/settings.xml ``` # License diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index ce13ef79..1d5cee92 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -35,7 +35,7 @@ describe('auth tests', () => { const altHome = path.join(__dirname, 'runner', 'settings'); const altSettingsFile = path.join(altHome, auth.SETTINGS_FILE); - process.env[`INPUT_M2-HOME`] = altHome; + process.env[`INPUT_SETTINGS-PATH`] = altHome; await io.rmRF(altHome); // ensure it doesn't already exist await auth.configAuthentication(id, username, password); @@ -49,7 +49,7 @@ describe('auth tests', () => { auth.generate(id, username, password) ); - delete process.env[`INPUT_M2-HOME`]; + delete process.env[`INPUT_SETTINGS-PATH`]; await io.rmRF(altHome); }, 100000); diff --git a/action.yml b/action.yml index 1f952a87..a67838c4 100644 --- a/action.yml +++ b/action.yml @@ -30,6 +30,9 @@ inputs: description: 'Password or token for authentication to the Apache Maven repository.' required: false + settings-path: + description: 'Path to where the settings.xml file will be written.' + required: false runs: using: 'node12' main: 'dist/index.js' diff --git a/dist/index.js b/dist/index.js index f4ff8d1035d31a253d4aa6dc99c16529974084d0..cad273103c188f739219c0e45d8585ad934be6bc 100644 GIT binary patch delta 52 wcmdmdm2>}9&W0AoEljn1yv3;{C7F5Y#kvKFB^lFO_?VPYg|@HbV`7Z~034hXNdN!< delta 40 pcmdmgm2>k|&W0AoEljn1?72p|8Tq-X)4TYXlwq9hyZD$`V*oNs4Wj@6 diff --git a/src/auth.ts b/src/auth.ts index 9cfa69a7..f50ab7d0 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -19,8 +19,8 @@ export async function configAuthentication( // when an alternate m2 location is specified use only that location (no .m2 directory) // otherwise use the home/.m2/ path const directory: string = path.join( - core.getInput('m2-home') || os.homedir(), - core.getInput('m2-home') ? '' : M2_DIR + core.getInput('settings-path') || os.homedir(), + core.getInput('settings-path') ? '' : M2_DIR ); await io.mkdirP(directory); core.debug(`created directory ${directory}`); From 2e749e50a69d4402354c38df0dc5b9e021cae9d8 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Tue, 10 Dec 2019 14:25:15 -0800 Subject: [PATCH 48/61] Update settings-path for github.workspace --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ca4d07e7..e725c559 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ jobs: See the help docs on [Publishing a Package with Gradle](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#example-using-gradle-groovy-for-a-single-package-in-a-repository) for more information on the `build.gradle` configuration file. -## Apache Maven within a self-hosted runner +## Apache Maven with a settings path When using an Actions self-hosted runner with multiple shared runners the default `$HOME` directory can be shared by a number runners at the same time which could overwrite existing settings file. Setting the `settings-path` variable allows you to choose a unique location for your settings file. @@ -137,11 +137,11 @@ jobs: server-id: github # Value of the distributionManagement/repository/id field of the pom.xml username: ${{ github.actor }} # username for server authentication password: ${{ github.token }} # password or token for authentication - settings-path: ./config # location for the settings.xml file + settings-path: ${{ github.workspace }} # location for the settings.xml file - name: Build with Maven run: mvn -B package --file pom.xml - name: Publish to GitHub Packages Apache Maven - run: mvn deploy -s ./config/settings.xml + run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml ``` # License From 998be8d08f04ae06317cde62fff9b14edd5df851 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Wed, 18 Dec 2019 11:05:01 -0800 Subject: [PATCH 49/61] Add default to settings-path description Co-Authored-By: Chris Patterson --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index a67838c4..c6c52843 100644 --- a/action.yml +++ b/action.yml @@ -31,7 +31,7 @@ inputs: repository.' required: false settings-path: - description: 'Path to where the settings.xml file will be written.' + description: 'Path to where the settings.xml file will be written. Default is ~/.m2.' required: false runs: using: 'node12' From 6924f73ee016582f21bae0cec5f0e818642eb1d5 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 19 Dec 2019 08:52:26 -0800 Subject: [PATCH 50/61] Address latest review feedback --- README.md | 18 ++++++++++++------ action.yml | 4 ++-- dist/index.js | Bin 158399 -> 158314 bytes package.json | 5 +++-- src/auth.ts | 22 +++++++++------------- src/setup-java.ts | 6 ++++-- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index e725c559..f6d6a44d 100644 --- a/README.md +++ b/README.md @@ -72,22 +72,26 @@ jobs: server-id: github # Value of the distributionManagement/repository/id field of the pom.xml username: ${{ github.actor }} # username for server authentication password: ${{ github.token }} # password or token for authentication + - name: Build with Maven run: mvn -B package --file pom.xml + - name: Publish to GitHub Packages Apache Maven run: mvn deploy + - name: Set up Apache Maven Central uses: actions/setup-java@v1 with: # running setup-java again overwrites the settings.xml java-version: 1.8 server-id: maven - username: maven_username - password: ${{ secrets.MAVEN_CENTRAL_TOKEN }} # password from secrets store + server-username: maven_username + server-password: ${{ secrets.MAVEN_CENTRAL_TOKEN }} # password from secrets store + - name: Publish to Apache Maven Central run: mvn deploy ``` -***NOTE: The `settings.xml` file is created in the Actions $HOME directory. If you have an existing `settings.xml` file at that location, it will be overwritten*** +***NOTE: The `settings.xml` file is created in the Actions $HOME directory. If you have an existing `settings.xml` file at that location, it will be overwritten. See below for using the `settings-path` to change your `settings.xml` file location.*** See the help docs on [Publishing a Package](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-apache-maven-for-use-with-github-packages#publishing-a-package) for more information on the `pom.xml` file. @@ -114,7 +118,7 @@ jobs: PASSWORD: ${{ secrets.GITHUB_TOKEN }} ``` -***NOTE: The `USERNAME` and `PASSWORD` need to correspond to the credentials environment variables used in the publishing section of your `build.gradle`..*** +***NOTE: The `USERNAME` and `PASSWORD` need to correspond to the credentials environment variables used in the publishing section of your `build.gradle`.*** See the help docs on [Publishing a Package with Gradle](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#example-using-gradle-groovy-for-a-single-package-in-a-repository) for more information on the `build.gradle` configuration file. @@ -135,11 +139,13 @@ jobs: with: java-version: 1.8 server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - username: ${{ github.actor }} # username for server authentication - password: ${{ github.token }} # password or token for authentication + server-username: ${{ github.actor }} # username for server authentication + server-password: ${{ github.token }} # password or token for authentication settings-path: ${{ github.workspace }} # location for the settings.xml file + - name: Build with Maven run: mvn -B package --file pom.xml + - name: Publish to GitHub Packages Apache Maven run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml ``` diff --git a/action.yml b/action.yml index c6c52843..df1a2c15 100644 --- a/action.yml +++ b/action.yml @@ -23,10 +23,10 @@ inputs: description: 'ID of the distributionManagement repository in the pom.xml file.' required: false - username: + server-username: description: 'Username for authentication to the Apache Maven repository.' required: false - password: + server-password: description: 'Password or token for authentication to the Apache Maven repository.' required: false diff --git a/dist/index.js b/dist/index.js index cad273103c188f739219c0e45d8585ad934be6bc..e9e7cc342516b5c869d6fdc54ed32521dd8d39af 100644 GIT binary patch delta 336 zcmdmgmGjjV&J7D$m@Nzqo0qU`U&6w;$B)U_aPmUq!0jv8nc}#o=Lj=7Ojp^+D8!kQ zpPX2dnV+XQT_J)=WO{`Nll63+XN*;x-Omf@fgBcAOw`<2Sy4Hg%g;}(ddHS3P#w2D-Bjf3ek&H&n#>R%z z_i!^=ZqJWo^ktr&7sJRteNPOdFNDPz%eZcOLmU&YU}lO!O^rfnacWUsVs0vsJ>5H& zQFgL`1B+9BPO4scVo{!kx?@g`g0TWnO<8J@u102x4qStdLSkNuLP272ae01Gil#zh zQK~{wYGG++QEG~w`t*mUOp=q|zvh}O<;XStbSz{1_Fxt!Cg$zEqD(N^&J7D$m`#j~o0qU`U&6w;$8Y=W1V#f!CL`m?3ylM}*V`~{W}Ytolre+f z+{98-)0!(eKd-n%A+dCNp(B$TvxSlQ_U%s@+n6~@i&Km85_40hFL=qQI(`0gMz-nY zFBzq#&v?nWZu)~)jK$keB{I6zGnt!AUSJ#qGPqxDd+=*UCT1ohbA(;n)4~~7vrqqL zz{KO7nwOlPl9`uorJ!C~lBR2+uA`8alL+FLSEwu0S}W-5gPB$eKAG96K&HAvQfY}o zT4H8Su|j5=LP26lhC*sZW^qaJbf$Pl|LHg48Fi*RKVuY{oTtM!T_k}~jXl4hBopYP z=^Nr1MLCiaOOi7bG*YKK@G*%9rRo8#PgStBRZw?zjqnT(QJ-$8#3V9Vz=36YLp-DP z^fOFM9Mcb6V&s@EmcVE Date: Thu, 19 Dec 2019 11:28:11 -0800 Subject: [PATCH 51/61] Try env variables --- README.md | 18 ++++++++------ __tests__/auth.test.ts | 54 +++++++++++++++++++++++++---------------- action.yml | 7 +++--- dist/index.js | Bin 158314 -> 158193 bytes src/auth.ts | 51 ++++++++++++++++++++------------------ src/setup-java.ts | 6 +---- 6 files changed, 75 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index f6d6a44d..977a4bb6 100644 --- a/README.md +++ b/README.md @@ -69,9 +69,8 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - username: ${{ github.actor }} # username for server authentication - password: ${{ github.token }} # password or token for authentication + env: + GITHUB_TOKEN: ${{ github.token }} - name: Build with Maven run: mvn -B package --file pom.xml @@ -83,9 +82,12 @@ jobs: uses: actions/setup-java@v1 with: # running setup-java again overwrites the settings.xml java-version: 1.8 - server-id: maven - server-username: maven_username - server-password: ${{ secrets.MAVEN_CENTRAL_TOKEN }} # password from secrets store + server-id: maven # Value of the distributionManagement/repository/id field of the pom.xml + server-username: MAVEN_USERNAME # env variable for username below + server-password: MAVEN_CENTRAL_TOKEN # env variable for token below + env: + MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }} + MAVEN_USERNAME: maven_username123 - name: Publish to Apache Maven Central run: mvn deploy @@ -139,9 +141,9 @@ jobs: with: java-version: 1.8 server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - server-username: ${{ github.actor }} # username for server authentication - server-password: ${{ github.token }} # password or token for authentication settings-path: ${{ github.workspace }} # location for the settings.xml file + env: + GITHUB_TOKEN: ${{ github.token }} - name: Build with Maven run: mvn -B package --file pom.xml diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 1d5cee92..5a31e277 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -30,8 +30,8 @@ describe('auth tests', () => { it('creates settings.xml in alternate locations', async () => { const id = 'packages'; - const username = 'bluebottle'; - const password = 'SingleOrigin'; + const username = 'UNAMI'; + const password = 'TOLKIEN'; const altHome = path.join(__dirname, 'runner', 'settings'); const altSettingsFile = path.join(altHome, auth.SETTINGS_FILE); @@ -55,8 +55,8 @@ describe('auth tests', () => { it('creates settings.xml with username and password', async () => { const id = 'packages'; - const username = 'bluebottle'; - const password = 'SingleOrigin'; + const username = 'UNAME'; + const password = 'TOKEN'; await auth.configAuthentication(id, username, password); @@ -69,8 +69,8 @@ describe('auth tests', () => { it('overwrites existing settings.xml files', async () => { const id = 'packages'; - const username = 'bluebottle'; - const password = 'SingleOrigin'; + const username = 'USERNAME'; + const password = 'PASSWORD'; fs.mkdirSync(m2Dir, {recursive: true}); fs.writeFileSync(settingsFile, 'FAKE FILE'); @@ -87,30 +87,42 @@ describe('auth tests', () => { }, 100000); it('does not create settings.xml without required parameters', async () => { - await auth.configAuthentication('FOO', '', ''); + await auth.configAuthentication('FOO'); - expect(fs.existsSync(m2Dir)).toBe(false); - expect(fs.existsSync(settingsFile)).toBe(false); + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( + auth.generate('FOO') + ); - await auth.configAuthentication('', 'BAR', ''); + await auth.configAuthentication(undefined, 'BAR', undefined); - expect(fs.existsSync(m2Dir)).toBe(false); - expect(fs.existsSync(settingsFile)).toBe(false); + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( + auth.generate(undefined, 'BAR', undefined) + ); - await auth.configAuthentication('', '', 'BAZ'); + await auth.configAuthentication(undefined, undefined, 'BAZ'); - expect(fs.existsSync(m2Dir)).toBe(false); - expect(fs.existsSync(settingsFile)).toBe(false); + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( + auth.generate(undefined, undefined, 'BAZ') + ); - await auth.configAuthentication('', '', ''); + await auth.configAuthentication(); - expect(fs.existsSync(m2Dir)).toBe(false); - expect(fs.existsSync(settingsFile)).toBe(false); + expect(fs.existsSync(m2Dir)).toBe(true); + expect(fs.existsSync(settingsFile)).toBe(true); + expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( + auth.generate(undefined, undefined, undefined) + ); }, 100000); it('escapes invalid XML inputs', () => { const id = 'packages'; - const username = 'bluebottle'; + const username = 'USER'; const password = '&<>"\'\'"><&'; expect(auth.generate(id, username, password)).toEqual(` @@ -118,8 +130,8 @@ describe('auth tests', () => { ${id} - ${username} - &<>"''"><& + \${env.${username}} + \${env.&<>"''"><&} diff --git a/action.yml b/action.yml index df1a2c15..d310ebdb 100644 --- a/action.yml +++ b/action.yml @@ -24,11 +24,12 @@ inputs: file.' required: false server-username: - description: 'Username for authentication to the Apache Maven repository.' + description: 'Environment variable name for the username for authentication + to the Apache Maven repository.' required: false server-password: - description: 'Password or token for authentication to the Apache Maven - repository.' + description: 'Environment variable name for password or token for + authentication to the Apache Maven repository.' required: false settings-path: description: 'Path to where the settings.xml file will be written. Default is ~/.m2.' diff --git a/dist/index.js b/dist/index.js index e9e7cc342516b5c869d6fdc54ed32521dd8d39af..be71c59d80e1f31b9dd23c4288afb719de1b5290 100644 GIT binary patch delta 582 zcmaELh4bTO&W0_F%OdJiD+=<9N{aPdT-_W)eL~_rT@-8;)YCIdGD?%wt+~*pLxWv| z{2YBj*=+GlIc-97zL*PiDDF)zG^!o&vb=oMy=_7(TsN6 z)nXW38RM}yn3|rRULVU?E*qm#otjss2PBJ=6AMx!e0?-ve$%X-&K<|7h)oI1kD9gH e9pe~Vxih`P<PboQC?zhDu`W>SX^A5 zUz9TaY&@gH^cRtgHu^en1y%|w)iA}iItqz-DGG^j9SNG&Tna!iy)=q3WBSb~MuW*+ zx?I!wqZwPL*Mu=~P5--%k$d{mXhz}bJ3ATqryq`H)P_iWiDtBzE|I{fJbiyBBWFxP zUOv#C)QW=qqLO00VAqfkPe1qIcsEZU*II@0%#w`!(h>!rlgmD-6)39o^iTB3@{ij#xj;o_lsi`o1PlSs2~cow>UYmAT`3*M*|iVn%ft} zF}8HeWu_@;;0dsUOiUt^`wZEp>%3yLp8iIjNocyfJ`?M7hae^vP(atzz?}$U!%UwJ z(lQEFjnW>IR2p8E8M@=TJG S-@oRXEak|xz4{enSv>$660kM^ diff --git a/src/auth.ts b/src/auth.ts index 0e95ed00..2e7c6e8e 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -7,29 +7,28 @@ import * as io from '@actions/io'; export const M2_DIR = '.m2'; export const SETTINGS_FILE = 'settings.xml'; +export const DEFAULT_ID = 'github'; +export const DEFAULT_USERNAME = 'GITHUB_ACTOR'; +export const DEFAULT_PASSWORD = 'GITHUB_TOKEN'; + export async function configAuthentication( - id: string, - username: string, - password: string + id = DEFAULT_ID, + username = DEFAULT_USERNAME, + password = DEFAULT_PASSWORD ) { - if (id && username && password) { - console.log( - `creating ${SETTINGS_FILE} with server-id: ${id}, username: ${username}, and a password` - ); - // when an alternate m2 location is specified use only that location (no .m2 directory) - // otherwise use the home/.m2/ path - const directory: string = path.join( - core.getInput('settings-path') || os.homedir(), - core.getInput('settings-path') ? '' : M2_DIR - ); - await io.mkdirP(directory); - core.debug(`created directory ${directory}`); - await write(directory, generate(id, username, password)); - } else { - core.debug( - `no ${SETTINGS_FILE} without server-id: ${id}, username: ${username}, and a password` - ); - } + console.log( + `creating ${SETTINGS_FILE} with server-id: ${id};`, + `environment variables: username=\$${username} and password=\$${password}` + ); + // when an alternate m2 location is specified use only that location (no .m2 directory) + // otherwise use the home/.m2/ path + const directory: string = path.join( + core.getInput('settings-path') || os.homedir(), + core.getInput('settings-path') ? '' : M2_DIR + ); + await io.mkdirP(directory); + core.debug(`created directory ${directory}`); + await write(directory, generate(id, username, password)); } function escapeXML(value: string) { @@ -42,14 +41,18 @@ function escapeXML(value: string) { } // only exported for testing purposes -export function generate(id: string, username: string, password: string) { +export function generate( + id = DEFAULT_ID, + username = DEFAULT_USERNAME, + password = DEFAULT_PASSWORD +) { return ` ${escapeXML(id)} - ${escapeXML(username)} - ${escapeXML(password)} + \${env.${escapeXML(username)}} + \${env.${escapeXML(password)}} diff --git a/src/setup-java.ts b/src/setup-java.ts index 9300eef5..a50ff550 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -22,11 +22,7 @@ async function run() { const username = core.getInput('server-username', {required: false}); const password = core.getInput('server-password', {required: false}); - if (id && username && password) { - await auth.configAuthentication(id, username, password); - } else if (id || username || password) { - console.warn('All 3 server-(id, username, and password) are required.'); - } + await auth.configAuthentication(id, username, password); } catch (error) { core.setFailed(error.message); } From 0e5545ead5014c85875fdd4d6febc455d52030e8 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 19 Dec 2019 14:18:54 -0800 Subject: [PATCH 52/61] improve tests --- __tests__/auth.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 5a31e277..13509682 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -92,7 +92,7 @@ describe('auth tests', () => { expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( - auth.generate('FOO') + auth.generate('FOO', auth.DEFAULT_USERNAME, auth.DEFAULT_PASSWORD) ); await auth.configAuthentication(undefined, 'BAR', undefined); @@ -100,7 +100,7 @@ describe('auth tests', () => { expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( - auth.generate(undefined, 'BAR', undefined) + auth.generate(auth.DEFAULT_ID, 'BAR', auth.DEFAULT_PASSWORD) ); await auth.configAuthentication(undefined, undefined, 'BAZ'); @@ -108,7 +108,7 @@ describe('auth tests', () => { expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( - auth.generate(undefined, undefined, 'BAZ') + auth.generate(auth.DEFAULT_ID, auth.DEFAULT_USERNAME, 'BAZ') ); await auth.configAuthentication(); @@ -116,7 +116,11 @@ describe('auth tests', () => { expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( - auth.generate(undefined, undefined, undefined) + auth.generate( + auth.DEFAULT_ID, + auth.DEFAULT_USERNAME, + auth.DEFAULT_PASSWORD + ) ); }, 100000); From 7e36086f368f03a37df27d38609ef98df42adb15 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 19 Dec 2019 14:20:17 -0800 Subject: [PATCH 53/61] Pass undefined when empty --- dist/index.js | Bin 158193 -> 158232 bytes src/setup-java.ts | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/index.js b/dist/index.js index be71c59d80e1f31b9dd23c4288afb719de1b5290..4fb758e4adbc0fd5449696ee0202fa80516448d4 100644 GIT binary patch delta 74 zcmex(nRCV!&W0_F1uuCOYHAcp^HNgNGV@YXrWd?q4B2Kb{G5r diff --git a/src/setup-java.ts b/src/setup-java.ts index a50ff550..7614f03d 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -18,9 +18,9 @@ async function run() { const matchersPath = path.join(__dirname, '..', '.github'); console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); - const id = core.getInput('server-id', {required: false}); - const username = core.getInput('server-username', {required: false}); - const password = core.getInput('server-password', {required: false}); + const id = core.getInput('server-id', {required: false}) || undefined; + const username = core.getInput('server-username', {required: false}) || undefined; + const password = core.getInput('server-password', {required: false}) || undefined; await auth.configAuthentication(id, username, password); } catch (error) { From c05b45bb9156e7a0d3ed6a39e72b1debd3d0a780 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 19 Dec 2019 15:39:48 -0800 Subject: [PATCH 54/61] Update README with env sections --- README.md | 18 +++++++++--------- src/setup-java.ts | 6 ++++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 977a4bb6..9a1915a1 100644 --- a/README.md +++ b/README.md @@ -69,28 +69,28 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - env: - GITHUB_TOKEN: ${{ github.token }} - name: Build with Maven run: mvn -B package --file pom.xml - name: Publish to GitHub Packages Apache Maven run: mvn deploy + env: + GITHUB_TOKEN: ${{ github.token }} # GITHUB_TOKEN is the default env for the password - name: Set up Apache Maven Central uses: actions/setup-java@v1 with: # running setup-java again overwrites the settings.xml java-version: 1.8 server-id: maven # Value of the distributionManagement/repository/id field of the pom.xml - server-username: MAVEN_USERNAME # env variable for username below - server-password: MAVEN_CENTRAL_TOKEN # env variable for token below - env: - MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }} - MAVEN_USERNAME: maven_username123 + server-username: MAVEN_USERNAME # env variable for username in deploy + server-password: MAVEN_CENTRAL_TOKEN # env variable for token in deploy - name: Publish to Apache Maven Central run: mvn deploy + env: + MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }} + MAVEN_USERNAME: maven_username123 ``` ***NOTE: The `settings.xml` file is created in the Actions $HOME directory. If you have an existing `settings.xml` file at that location, it will be overwritten. See below for using the `settings-path` to change your `settings.xml` file location.*** @@ -142,14 +142,14 @@ jobs: java-version: 1.8 server-id: github # Value of the distributionManagement/repository/id field of the pom.xml settings-path: ${{ github.workspace }} # location for the settings.xml file - env: - GITHUB_TOKEN: ${{ github.token }} - name: Build with Maven run: mvn -B package --file pom.xml - name: Publish to GitHub Packages Apache Maven run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml + env: + GITHUB_TOKEN: ${{ github.token }} ``` # License diff --git a/src/setup-java.ts b/src/setup-java.ts index 7614f03d..d0392175 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -19,8 +19,10 @@ async function run() { console.log(`##[add-matcher]${path.join(matchersPath, 'java.json')}`); const id = core.getInput('server-id', {required: false}) || undefined; - const username = core.getInput('server-username', {required: false}) || undefined; - const password = core.getInput('server-password', {required: false}) || undefined; + const username = + core.getInput('server-username', {required: false}) || undefined; + const password = + core.getInput('server-password', {required: false}) || undefined; await auth.configAuthentication(id, username, password); } catch (error) { From 2ccd1ad1251d6f44910aa33afb44208934d783bc Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Thu, 19 Dec 2019 15:44:10 -0800 Subject: [PATCH 55/61] Add examples of the settings.xml file generated --- README.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a1915a1..944809ab 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,32 @@ jobs: - name: Publish to Apache Maven Central run: mvn deploy env: - MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }} MAVEN_USERNAME: maven_username123 + MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }} +``` + +The two `settings.xml` files created from the above example look like the following. + +`settings.xml` file created for the first deploy to GitHub Packages +```xml + + + github + ${env.GITHUB_ACTOR} + ${env.GITHUB_TOKEN} + + +``` + +`settings.xml` file created for the second deploy to Apache Maven Central +```xml + + + maven + ${env.MAVEN_USERNAME} + ${env.MAVEN_CENTRAL_TOKEN} + + ``` ***NOTE: The `settings.xml` file is created in the Actions $HOME directory. If you have an existing `settings.xml` file at that location, it will be overwritten. See below for using the `settings-path` to change your `settings.xml` file location.*** From 9b11fe4b5ddd6e533908f148a4273e9685c007e1 Mon Sep 17 00:00:00 2001 From: Bryan Clark Date: Fri, 20 Dec 2019 08:35:06 -0800 Subject: [PATCH 56/61] Add defaults descriptions to actions.yml --- action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index d310ebdb..6337613f 100644 --- a/action.yml +++ b/action.yml @@ -21,15 +21,15 @@ inputs: required: false server-id: description: 'ID of the distributionManagement repository in the pom.xml - file.' + file. Default is `github`' required: false server-username: description: 'Environment variable name for the username for authentication - to the Apache Maven repository.' + to the Apache Maven repository. Default is $GITHUB_ACTOR' required: false server-password: description: 'Environment variable name for password or token for - authentication to the Apache Maven repository.' + authentication to the Apache Maven repository. Default is $GITHUB_TOKEN' required: false settings-path: description: 'Path to where the settings.xml file will be written. Default is ~/.m2.' From f8061412c643771c542a78ed91b47da3d5b4a4d3 Mon Sep 17 00:00:00 2001 From: Gil Tene Date: Sat, 21 Dec 2019 19:51:32 -0800 Subject: [PATCH 57/61] Add support for matching -ea version formats This will support specifying EA versions in the following format examples. E.g.: 14-ea 14.0.0-ea 14.0.0-ea.28 Notes: - For the last form above, which is needed for requesting a specific ea build, we must only add '.x' if there are less than 3 dots in the version, hence the change from != 3 to < 3 - The prior parsing logic for e.g. 14.0.0-ea "spelling" will ignore precedence between build numbers in the form of e.g. 14.0.0-ea+b27 vs. 14.0.0-ea+b27 (so it will end up with the earliest rather than the latest ea build in the cdn), and does not allow specifying an ea build number (it will match 14.0.0-ea+b29 to a cdn 14.0.0-ea+b2). The new logic [copupled with the CDN populating EA builds in the form 14.0.0-ea.28) will resolve that. --- src/installer.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/installer.ts b/src/installer.ts index f05171fb..f49c1c95 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -266,12 +266,21 @@ function normalizeVersion(version: string): string { } } - // Add trailing .x if it is missing - if (version.split('.').length != 3) { + if (version.endsWith('-ea')) { + // convert e.g. 14-ea to 14.0.0-ea + if (version.indexOf('.') == -1) { + version = version.slice(0, version.length - 3) + '.0.0-ea'; + } + // match anything in -ea.X (semver won't do .x matching on pre-release versions) + if (version[0] >= '0' && version[0] <= '9') { + version = '>=' + version; + } + } else if (version.split('.').length < 3) { + // For non-ea versions, add trailing .x if it is missing if (version[version.length - 1] != 'x') { version = version + '.x'; } } - + return version; } From ae687a76f93ea489785445864d5f98306292b34e Mon Sep 17 00:00:00 2001 From: Gil Tene Date: Sat, 21 Dec 2019 19:56:10 -0800 Subject: [PATCH 58/61] Update index.js --- dist/index.js | Bin 158232 -> 161666 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/index.js b/dist/index.js index 4fb758e4adbc0fd5449696ee0202fa80516448d4..61d157d181374aef336989454dd4e5ed82879629 100644 GIT binary patch delta 26905 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 pEsTHW;xy-4#*V?})>*aCIc_{e*hQ?fDixx delta 24497 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 UJjmycM?_*BgV9&!nV9PT1D2lys{jB1 From 5c4dee6c5ebbac701fb39a09e0b65f0cc2232d28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Dec 2019 19:05:41 +0000 Subject: [PATCH 59/61] Bump handlebars from 4.1.2 to 4.5.3 Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.5.3. - [Release notes](https://github.com/wycats/handlebars.js/releases) - [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md) - [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.5.3) Signed-off-by: dependabot[bot] --- package-lock.json | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index f33f89c1..5c2d047a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1711,7 +1711,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1732,12 +1733,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1752,17 +1755,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1879,7 +1885,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1891,6 +1898,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1905,6 +1913,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1912,12 +1921,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -1936,6 +1947,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2016,7 +2028,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2028,6 +2041,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2113,7 +2127,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2149,6 +2164,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2168,6 +2184,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2211,12 +2228,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2289,9 +2308,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", From ae23cbb7c22ce256a613292555b6060023a3718b Mon Sep 17 00:00:00 2001 From: Konrad Pabjan Date: Tue, 31 Dec 2019 00:51:09 -0500 Subject: [PATCH 60/61] Update master with dependabot fixes --- dist/index.js | Bin 161666 -> 159050 bytes dist/unzip | Bin 0 -> 174216 bytes package-lock.json | 41 +++++++++++------------------------------ src/installer.ts | 4 ++-- 4 files changed, 13 insertions(+), 32 deletions(-) create mode 100644 dist/unzip diff --git a/dist/index.js b/dist/index.js index 61d157d181374aef336989454dd4e5ed82879629..9e0ab8c4a683198bf62b21e336ddaff5c7e23913 100644 GIT binary patch delta 21727 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 Ovb$QQSItoatNsUCrr2o! diff --git a/dist/unzip b/dist/unzip new file mode 100644 index 0000000000000000000000000000000000000000..40824180954830c745c837044f339897f12dcab0 GIT binary patch literal 174216 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 VUgdd9+MdYxE~`IPR-o)Q_#X!!hD-ne literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 5c2d047a..d0a41b10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1711,8 +1711,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -1733,14 +1732,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1755,20 +1752,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -1885,8 +1879,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -1898,7 +1891,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1913,7 +1905,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1921,14 +1912,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -1947,7 +1936,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2028,8 +2016,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2041,7 +2028,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2127,8 +2113,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2164,7 +2149,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2184,7 +2168,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2228,14 +2211,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, diff --git a/src/installer.ts b/src/installer.ts index f49c1c95..ab4f466b 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -271,7 +271,7 @@ function normalizeVersion(version: string): string { if (version.indexOf('.') == -1) { version = version.slice(0, version.length - 3) + '.0.0-ea'; } - // match anything in -ea.X (semver won't do .x matching on pre-release versions) + // match anything in -ea.X (semver won't do .x matching on pre-release versions) if (version[0] >= '0' && version[0] <= '9') { version = '>=' + version; } @@ -281,6 +281,6 @@ function normalizeVersion(version: string): string { version = version + '.x'; } } - + return version; } From b52cd69bd2c048f71381fd0ee11739418a05a362 Mon Sep 17 00:00:00 2001 From: Konrad Pabjan Date: Tue, 31 Dec 2019 01:04:50 -0500 Subject: [PATCH 61/61] Update workflow.yml --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 4558c6fb..59371d4f 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -1,5 +1,5 @@ name: Main workflow -on: [push] +on: [push, pull_request] jobs: run: name: Run