@jwpkg/gitversion
Version:
Gitversion is a complete customizable git-based release management system
81 lines • 7.03 kB
JavaScript
;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBZ0M7QUFDaEMseURBQTZEO0FBQzdELHFDQUFpQztBQWVqQyxNQUFhLFFBQVE7SUFDQztJQUFxQjtJQUF6QyxZQUFvQixHQUFXLEVBQVUsTUFBbUI7UUFBeEMsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWE7SUFBSSxDQUFDO0lBRWpFLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBd0IsRUFBRSxPQUEwQztRQUM3RSxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLHFDQUFxQztRQUNyQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxNQUFNO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLE1BQU07WUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTTtZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07WUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUztZQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUM7UUFFOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLHlCQUFlLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEYsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDN0IsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2Qsa0RBQWtEO2dC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