fix: allow plugins to set environment variables to be used by other plugins

This commit is contained in:
Pierre Vanduynslager 2019-12-14 22:46:12 -05:00 committed by Gregor Martynus
parent 8ce2d6e834
commit 68f7e928f9
2 changed files with 51 additions and 2 deletions

View File

@ -6,7 +6,7 @@ const PLUGINS_DEFINITIONS = require('../definitions/plugins');
const {loadPlugin, parseConfig} = require('./utils');
module.exports = (context, type, pluginOpt, pluginsPath) => {
const {stdout, stderr, options, logger} = context;
const {stdout, stderr, options, logger, env} = context;
if (!pluginOpt) {
return noop;
}
@ -32,10 +32,11 @@ module.exports = (context, type, pluginOpt, pluginsPath) => {
if (!input.options.dryRun || dryRun) {
logger.log(`Start step "${type}" of plugin "${pluginName}"`);
const result = await func({
...cloneDeep(omit(input, ['stdout', 'stderr', 'logger'])),
...cloneDeep(omit(input, ['stdout', 'stderr', 'logger', 'env'])),
stdout,
stderr,
logger: logger.scope(logger.scopeName, pluginName),
env,
});
if (outputValidator && !outputValidator(result)) {
throw getError(`E${type.toUpperCase()}OUTPUT`, {result, pluginName});

View File

@ -1941,3 +1941,51 @@ test('Get all commits including the ones not in the shallow clone', async t => {
t.is(analyzeCommits.args[0][1].commits.length, 3);
});
test('Allow plugins to set environment variables', async t => {
const {cwd, repositoryUrl} = await gitRepo(true);
await gitCommits(['First'], {cwd});
await gitTagVersion('v1.0.0', undefined, {cwd});
await gitCommits(['Second'], {cwd});
await gitPush(repositoryUrl, 'master', {cwd});
const nextRelease = {type: 'major', version: '2.0.0', gitHead: await getGitHead({cwd}), gitTag: 'v2.0.0'};
const verifyConditions = stub().resolves();
const analyzeCommits = stub().resolves(nextRelease.type);
const verifyRelease = stub().resolves();
const generateNotes = stub().resolves();
const prepare = stub().resolves();
const publish1 = async (_, context) => {
context.env.TEST_VAR = 'test-value';
};
const publish2 = stub().resolves();
const success = stub().resolves();
const env = {...process.env};
const config = {branch: 'master', repositoryUrl};
const options = {
...config,
plugins: false,
verifyConditions,
analyzeCommits,
verifyRelease,
generateNotes,
prepare,
publish: [publish1, publish2],
success,
};
const semanticRelease = requireNoCache('..', {
'./lib/get-logger': () => t.context.logger,
'env-ci': () => ({isCi: true, branch: 'master', isPr: false}),
});
await semanticRelease(options, {
cwd,
env,
stdout: new WritableStreamBuffer(),
stderr: new WritableStreamBuffer(),
});
t.is(publish2.args[0][1].env.TEST_VAR, 'test-value');
t.is(env.TEST_VAR, 'test-value');
});