UNPKG

@jwpkg/gitversion

Version:

Gitversion is a complete customizable git-based release management system

81 lines 7.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Executor = void 0; const console_1 = require("console"); const cross_spawn_extra_1 = require("cross-spawn-extra"); const process_1 = require("process"); class Executor { cwd; logger; constructor(cwd, logger) { this.cwd = cwd; this.logger = logger; } async exec(commandAndArgs, options) { const fullCommand = commandAndArgs.join(' '); // Check if running in CI without TTY const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true' || process.env.GITLAB_CI === 'true' || process.env.CIRCLECI === 'true' || process.env.TRAVIS === 'true' || process.env.JENKINS_URL !== undefined || process.env.BUILDKITE === 'true'; const result = await (0, cross_spawn_extra_1.async)(commandAndArgs[0], commandAndArgs.splice(1), { cwd: options?.cwd ?? this.cwd, env: { ...process.env, // In CI, ensure npm doesn't try to be interactive ...(isCI && { npm_config_yes: 'true' }), }, }); if (result.error) { this.logError(`${result.error}`, options); throw console_1.error; } // Check for OTP prompts in stderr that indicate interactive input is needed const stderrOutput = result.stderr.toString(); const stdoutOutput = result.stdout.toString(); const combinedOutput = `${stderrOutput} ${stdoutOutput}`; if (isCI && !process.stdin.isTTY) { if (combinedOutput.includes('one-time password') || combinedOutput.includes('One-time password') || combinedOutput.includes('Enter OTP') || /OTP/i.test(combinedOutput)) { this.logError('Detected OTP prompt in CI environment', options); this.logError(`Executed command: [${fullCommand}]`, options); this.logError(`Output: ${combinedOutput}`, options); throw new Error('npm is requesting a one-time password (OTP) in a non-interactive CI environment.\n' + 'This causes the build to hang indefinitely.\n\n' + 'To fix this issue:\n' + ' 1. Log in to npmjs.com and go to Access Tokens\n' + ' 2. Generate a new "Automation" token (bypasses 2FA for CI/CD)\n' + ' 3. Update your NPM_AUTH_TOKEN secret with the new automation token\n' + ' 4. Do NOT use a "Publish" or "Classic" token type as they require OTP\n\n' + `Command: ${fullCommand}`); } } if (result.exitCode !== 0) { this.logError(`Executing command non-zero exit code: ${result.exitCode}`, options); this.logError(`Executed command: [${fullCommand}]`, options); this.logError(`Error output: ${result.output.toString()}`, options); throw new Error('Non-zero exitcode'); } if (options?.normalizeOutput === false) { return process_1.stdout.toString(); } else { return result.stdout .toString() .replace(/\\r?\\n?$/, '') .trim(); } } logError(message, options) { if (options?.silent !== true) { this.logger.reportError(message); } } } exports.Executor = Executor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBZ0M7QUFDaEMseURBQTZEO0FBQzdELHFDQUFpQztBQWVqQyxNQUFhLFFBQVE7SUFDQztJQUFxQjtJQUF6QyxZQUFvQixHQUFXLEVBQVUsTUFBbUI7UUFBeEMsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWE7SUFBSSxDQUFDO0lBRWpFLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBd0IsRUFBRSxPQUEwQztRQUM3RSxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLHFDQUFxQztRQUNyQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxNQUFNO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLE1BQU07WUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTTtZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07WUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUztZQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUM7UUFFOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLHlCQUFlLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDN0IsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2Qsa0RBQWtEO2dCQUNsRCxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO2FBQ3hDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxQyxNQUFNLGVBQUssQ0FBQztRQUNkLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sY0FBYyxHQUFHLEdBQUcsWUFBWSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpELElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7Z0JBQzVDLGNBQWMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7Z0JBQzVDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsdUNBQXVDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLFdBQVcsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsY0FBYyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQ2Isb0ZBQW9GO29CQUNwRixpREFBaUQ7b0JBQ2pELHNCQUFzQjtvQkFDdEIsb0RBQW9EO29CQUNwRCxtRUFBbUU7b0JBQ25FLHdFQUF3RTtvQkFDeEUsNkVBQTZFO29CQUM3RSxZQUFZLFdBQVcsRUFBRSxDQUMxQixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyx5Q0FBeUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLFdBQVcsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksT0FBTyxFQUFFLGVBQWUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2QyxPQUFPLGdCQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLE1BQU0sQ0FBQyxNQUFNO2lCQUNqQixRQUFRLEVBQUU7aUJBQ1YsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7aUJBQ3hCLElBQUksRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsT0FBZSxFQUFFLE9BQThCO1FBQ3RELElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBN0VELDRCQTZFQyJ9