fix: log all core verification errors
This commit is contained in:
parent
2f75dff3fc
commit
faabffb208
@ -1,8 +1,7 @@
|
|||||||
const readPkgUp = require('read-pkg-up');
|
|
||||||
const {castArray, pickBy, isUndefined, isNull, isString, isPlainObject} = require('lodash');
|
const {castArray, pickBy, isUndefined, isNull, isString, isPlainObject} = require('lodash');
|
||||||
|
const readPkgUp = require('read-pkg-up');
|
||||||
const cosmiconfig = require('cosmiconfig');
|
const cosmiconfig = require('cosmiconfig');
|
||||||
const resolveFrom = require('resolve-from');
|
const resolveFrom = require('resolve-from');
|
||||||
const SemanticReleaseError = require('@semantic-release/error');
|
|
||||||
const debug = require('debug')('semantic-release:config');
|
const debug = require('debug')('semantic-release:config');
|
||||||
const {repoUrl} = require('./git');
|
const {repoUrl} = require('./git');
|
||||||
const PLUGINS_DEFINITION = require('./plugins/definitions');
|
const PLUGINS_DEFINITION = require('./plugins/definitions');
|
||||||
@ -61,11 +60,7 @@ module.exports = async (opts, logger) => {
|
|||||||
debug('verifyRelease: %O', options.verifyRelease);
|
debug('verifyRelease: %O', options.verifyRelease);
|
||||||
debug('publish: %O', options.publish);
|
debug('publish: %O', options.publish);
|
||||||
|
|
||||||
if (!options.repositoryUrl) {
|
options.repositoryUrl = options.repositoryUrl ? getGitAuthUrl(options.repositoryUrl) : options.repositoryUrl;
|
||||||
throw new SemanticReleaseError('The repositoryUrl option is required', 'ENOREPOURL');
|
|
||||||
}
|
|
||||||
|
|
||||||
options.repositoryUrl = getGitAuthUrl(options.repositoryUrl);
|
|
||||||
|
|
||||||
return {options, plugins: await plugins(options, pluginsPath, logger)};
|
return {options, plugins: await plugins(options, pluginsPath, logger)};
|
||||||
};
|
};
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
const {isArray, isObject, omit} = require('lodash');
|
const {isArray, isObject, omit} = require('lodash');
|
||||||
|
const AggregateError = require('aggregate-error');
|
||||||
const SemanticReleaseError = require('@semantic-release/error');
|
const SemanticReleaseError = require('@semantic-release/error');
|
||||||
const PLUGINS_DEFINITION = require('./definitions');
|
const PLUGINS_DEFINITION = require('./definitions');
|
||||||
const pipeline = require('./pipeline');
|
const pipeline = require('./pipeline');
|
||||||
const normalize = require('./normalize');
|
const normalize = require('./normalize');
|
||||||
|
|
||||||
module.exports = (options, pluginsPath, logger) =>
|
module.exports = (options, pluginsPath, logger) => {
|
||||||
Object.keys(PLUGINS_DEFINITION).reduce((plugins, pluginType) => {
|
const errors = [];
|
||||||
|
const plugins = Object.keys(PLUGINS_DEFINITION).reduce((plugins, pluginType) => {
|
||||||
const {config, output, default: def} = PLUGINS_DEFINITION[pluginType];
|
const {config, output, default: def} = PLUGINS_DEFINITION[pluginType];
|
||||||
let pluginConfs;
|
let pluginConfs;
|
||||||
if (options[pluginType]) {
|
if (options[pluginType]) {
|
||||||
@ -14,7 +16,8 @@ module.exports = (options, pluginsPath, logger) =>
|
|||||||
options[pluginType].path = def;
|
options[pluginType].path = def;
|
||||||
}
|
}
|
||||||
if (config && !config.validator(options[pluginType])) {
|
if (config && !config.validator(options[pluginType])) {
|
||||||
throw new SemanticReleaseError(config.message, 'EPLUGINCONF');
|
errors.push(new SemanticReleaseError(config.message, 'EPLUGINCONF'));
|
||||||
|
return plugins;
|
||||||
}
|
}
|
||||||
pluginConfs = options[pluginType];
|
pluginConfs = options[pluginType];
|
||||||
} else {
|
} else {
|
||||||
@ -29,3 +32,8 @@ module.exports = (options, pluginsPath, logger) =>
|
|||||||
|
|
||||||
return plugins;
|
return plugins;
|
||||||
}, {});
|
}, {});
|
||||||
|
if (errors.length > 0) {
|
||||||
|
throw new AggregateError(errors);
|
||||||
|
}
|
||||||
|
return plugins;
|
||||||
|
};
|
||||||
|
@ -1,19 +1,30 @@
|
|||||||
const SemanticReleaseError = require('@semantic-release/error');
|
const SemanticReleaseError = require('@semantic-release/error');
|
||||||
|
const AggregateError = require('aggregate-error');
|
||||||
const {isGitRepo, verifyAuth} = require('./git');
|
const {isGitRepo, verifyAuth} = require('./git');
|
||||||
|
|
||||||
module.exports = async (options, branch, logger) => {
|
module.exports = async (options, branch, logger) => {
|
||||||
|
const errors = [];
|
||||||
|
|
||||||
if (!await isGitRepo()) {
|
if (!await isGitRepo()) {
|
||||||
logger.error('Semantic-release must run from a git repository.');
|
logger.error('Semantic-release must run from a git repository.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!await verifyAuth(options.repositoryUrl, options.branch)) {
|
if (!options.repositoryUrl) {
|
||||||
throw new SemanticReleaseError(
|
errors.push(new SemanticReleaseError('The repositoryUrl option is required', 'ENOREPOURL'));
|
||||||
|
} else if (!await verifyAuth(options.repositoryUrl, options.branch)) {
|
||||||
|
errors.push(
|
||||||
|
new SemanticReleaseError(
|
||||||
`The git credentials doesn't allow to push on the branch ${options.branch}.`,
|
`The git credentials doesn't allow to push on the branch ${options.branch}.`,
|
||||||
'EGITNOPERMISSION'
|
'EGITNOPERMISSION'
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (errors.length > 0) {
|
||||||
|
throw new AggregateError(errors);
|
||||||
|
}
|
||||||
|
|
||||||
if (branch !== options.branch) {
|
if (branch !== options.branch) {
|
||||||
logger.log(
|
logger.log(
|
||||||
`This test run was triggered on the branch ${branch}, while semantic-release is configured to only publish from ${
|
`This test run was triggered on the branch ${branch}, while semantic-release is configured to only publish from ${
|
||||||
|
@ -13,12 +13,12 @@ const envBackup = Object.assign({}, process.env);
|
|||||||
const cwd = process.cwd();
|
const cwd = process.cwd();
|
||||||
|
|
||||||
test.beforeEach(t => {
|
test.beforeEach(t => {
|
||||||
// Delete environment variables that could have been set on the machine running the tests
|
|
||||||
delete process.env.GIT_CREDENTIALS;
|
delete process.env.GIT_CREDENTIALS;
|
||||||
delete process.env.GH_TOKEN;
|
delete process.env.GH_TOKEN;
|
||||||
delete process.env.GITHUB_TOKEN;
|
delete process.env.GITHUB_TOKEN;
|
||||||
delete process.env.GL_TOKEN;
|
delete process.env.GL_TOKEN;
|
||||||
delete process.env.GITLAB_TOKEN;
|
delete process.env.GITLAB_TOKEN;
|
||||||
|
// Delete environment variables that could have been set on the machine running the tests
|
||||||
t.context.plugins = stub().returns({});
|
t.context.plugins = stub().returns({});
|
||||||
t.context.getConfig = proxyquire('../lib/get-config', {'./plugins': t.context.plugins});
|
t.context.getConfig = proxyquire('../lib/get-config', {'./plugins': t.context.plugins});
|
||||||
});
|
});
|
||||||
|
@ -601,11 +601,11 @@ test.serial('Throw SemanticReleaseError if repositoryUrl is not set and cannot b
|
|||||||
'./lib/logger': t.context.logger,
|
'./lib/logger': t.context.logger,
|
||||||
'env-ci': () => ({isCi: true, branch: 'master', isPr: false}),
|
'env-ci': () => ({isCi: true, branch: 'master', isPr: false}),
|
||||||
});
|
});
|
||||||
const error = await t.throws(semanticRelease());
|
const errors = Array.from(await t.throws(semanticRelease()));
|
||||||
|
|
||||||
// Verify error code and type
|
// Verify error code and type
|
||||||
t.is(error.code, 'ENOREPOURL');
|
t.is(errors[0].code, 'ENOREPOURL');
|
||||||
t.is(error.name, 'SemanticReleaseError');
|
t.is(errors[0].name, 'SemanticReleaseError');
|
||||||
});
|
});
|
||||||
|
|
||||||
test.serial('Throw an Error if plugin returns an unexpected value', async t => {
|
test.serial('Throw an Error if plugin returns an unexpected value', async t => {
|
||||||
|
@ -127,26 +127,34 @@ test('Merge global options with plugin options', async t => {
|
|||||||
t.deepEqual(result.pluginConfig, {localOpt: 'local', globalOpt: 'global', otherOpt: 'locally-defined'});
|
t.deepEqual(result.pluginConfig, {localOpt: 'local', globalOpt: 'global', otherOpt: 'locally-defined'});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Throw an error if plugin configuration is missing a path for plugin pipeline', t => {
|
test('Throw an error if plugins configuration are missing a path for plugin pipeline', t => {
|
||||||
const error = t.throws(() => getPlugins({verifyConditions: {}}, {}, t.context.logger));
|
const errors = Array.from(
|
||||||
|
t.throws(() => getPlugins({verifyConditions: {}, verifyRelease: {}}, {}, t.context.logger))
|
||||||
|
);
|
||||||
|
|
||||||
t.is(error.name, 'SemanticReleaseError');
|
t.is(errors[0].name, 'SemanticReleaseError');
|
||||||
t.is(error.code, 'EPLUGINCONF');
|
t.is(errors[0].code, 'EPLUGINCONF');
|
||||||
t.is(
|
t.is(
|
||||||
error.message,
|
errors[0].message,
|
||||||
'The "verifyConditions" plugin, if defined, must be a single or an array of plugins definition. A plugin definition is either a string or an object with a path property.'
|
'The "verifyConditions" plugin, if defined, must be a single or an array of plugins definition. A plugin definition is either a string or an object with a path property.'
|
||||||
);
|
);
|
||||||
|
t.is(errors[1].name, 'SemanticReleaseError');
|
||||||
|
t.is(errors[1].code, 'EPLUGINCONF');
|
||||||
|
t.is(
|
||||||
|
errors[1].message,
|
||||||
|
'The "verifyRelease" plugin, if defined, must be a single or an array of plugins definition. A plugin definition is either a string or an object with a path property.'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Throw an error if an array of plugin configuration is missing a path for plugin pipeline', t => {
|
test('Throw an error if an array of plugin configuration is missing a path for plugin pipeline', t => {
|
||||||
const error = t.throws(() =>
|
const errors = Array.from(
|
||||||
getPlugins({verifyConditions: [{path: '@semantic-release/npm'}, {}]}, {}, t.context.logger)
|
t.throws(() => getPlugins({verifyConditions: [{path: '@semantic-release/npm'}, {}]}, {}, t.context.logger))
|
||||||
);
|
);
|
||||||
|
|
||||||
t.is(error.name, 'SemanticReleaseError');
|
t.is(errors[0].name, 'SemanticReleaseError');
|
||||||
t.is(error.code, 'EPLUGINCONF');
|
t.is(errors[0].code, 'EPLUGINCONF');
|
||||||
t.is(
|
t.is(
|
||||||
error.message,
|
errors[0].message,
|
||||||
'The "verifyConditions" plugin, if defined, must be a single or an array of plugins definition. A plugin definition is either a string or an object with a path property.'
|
'The "verifyConditions" plugin, if defined, must be a single or an array of plugins definition. A plugin definition is either a string or an object with a path property.'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user