From 61d7d38ec286154a0a04844217c86ff1d9247441 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Mon, 7 May 2018 23:12:32 -0400 Subject: [PATCH] feat: set tag author and committer name/email Use [Git Environment Variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#Committing). Set default values if environement variables are not set. --- docs/usage/configuration.md | 9 +++++++++ index.js | 14 +++++++++++--- lib/definitions/constants.js | 9 +++++++++ lib/definitions/errors.js | 2 +- lib/definitions/plugins.js | 2 +- lib/definitions/release-types.js | 1 - lib/get-next-version.js | 3 ++- test/index.test.js | 7 +++++++ 8 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 lib/definitions/constants.js delete mode 100644 lib/definitions/release-types.js diff --git a/docs/usage/configuration.md b/docs/usage/configuration.md index 0976aa09..c285c5e6 100644 --- a/docs/usage/configuration.md +++ b/docs/usage/configuration.md @@ -29,6 +29,15 @@ $ semantic-release **Note**: Plugin options cannot be defined via CLI arguments and must be defined in the configuration file. +## Environment variables + +| Variable | Description | Default | +|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------| +| `GIT_AUTHOR_NAME` | The author name associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot. | +| `GIT_AUTHOR_EMAIL` | The author email associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot email address. | +| `GIT_COMMITTER_NAME` | The committer name associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot. | +| `GIT_COMMITTER_EMAIL` | The committer email associated with the [Git release tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging). See [Git environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_committing). | @semantic-release-bot email address. | + ## Options ### extends diff --git a/index.js b/index.js index 621ea9db..215f1846 100644 --- a/index.js +++ b/index.js @@ -15,6 +15,7 @@ const getGitAuthUrl = require('./lib/get-git-auth-url'); const logger = require('./lib/logger'); const {unshallow, verifyAuth, isBranchUpToDate, gitHead: getGitHead, tag, push} = require('./lib/git'); const getError = require('./lib/get-error'); +const {COMMIT_NAME, COMMIT_EMAIL} = require('./lib/definitions/constants'); marked.setOptions({renderer: new TerminalRenderer()}); @@ -25,9 +26,16 @@ async function run(options, plugins) { logger.log('This run was not triggered in a known CI environment, running in dry-run mode.'); options.dryRun = true; } else { - // When running on CI, prevent the `git` CLI to prompt for username/password. See #703. - process.env.GIT_ASKPASS = 'echo'; - process.env.GIT_TERMINAL_PROMPT = 0; + // When running on CI, set the commits author and commiter info and prevent the `git` CLI to prompt for username/password. See #703. + process.env = { + GIT_AUTHOR_NAME: COMMIT_NAME, + GIT_AUTHOR_EMAIL: COMMIT_EMAIL, + GIT_COMMITTER_NAME: COMMIT_NAME, + GIT_COMMITTER_EMAIL: COMMIT_EMAIL, + ...process.env, + GIT_ASKPASS: 'echo', + GIT_TERMINAL_PROMPT: 0, + }; } if (isCi && isPr && !options.noCi) { diff --git a/lib/definitions/constants.js b/lib/definitions/constants.js new file mode 100644 index 00000000..e09b8b54 --- /dev/null +++ b/lib/definitions/constants.js @@ -0,0 +1,9 @@ +const RELEASE_TYPE = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease']; + +const FIRST_RELEASE = '1.0.0'; + +const COMMIT_NAME = 'semantic-release-bot'; + +const COMMIT_EMAIL = 'semantic-release-bot@martynus.net'; + +module.exports = {RELEASE_TYPE, FIRST_RELEASE, COMMIT_NAME, COMMIT_EMAIL}; diff --git a/lib/definitions/errors.js b/lib/definitions/errors.js index 1a6a0274..c64cb499 100644 --- a/lib/definitions/errors.js +++ b/lib/definitions/errors.js @@ -2,7 +2,7 @@ const url = require('url'); const {inspect} = require('util'); const {toLower, isString} = require('lodash'); const pkg = require('../../package.json'); -const RELEASE_TYPE = require('./release-types'); +const {RELEASE_TYPE} = require('./constants'); const homepage = url.format({...url.parse(pkg.homepage), ...{hash: null}}); const stringify = obj => (isString(obj) ? obj : inspect(obj, {breakLength: Infinity, depth: 2, maxArrayLength: 5})); diff --git a/lib/definitions/plugins.js b/lib/definitions/plugins.js index 64171260..6f97b719 100644 --- a/lib/definitions/plugins.js +++ b/lib/definitions/plugins.js @@ -1,5 +1,5 @@ const {isString, isFunction, isArray, isPlainObject} = require('lodash'); -const RELEASE_TYPE = require('./release-types'); +const {RELEASE_TYPE} = require('./constants'); const validatePluginConfig = conf => isString(conf) || isString(conf.path) || isFunction(conf); diff --git a/lib/definitions/release-types.js b/lib/definitions/release-types.js deleted file mode 100644 index 9bb7d3df..00000000 --- a/lib/definitions/release-types.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease']; diff --git a/lib/get-next-version.js b/lib/get-next-version.js index 2d02a0fd..d64ac258 100644 --- a/lib/get-next-version.js +++ b/lib/get-next-version.js @@ -1,4 +1,5 @@ const semver = require('semver'); +const {FIRST_RELEASE} = require('./definitions/constants'); module.exports = (type, lastRelease, logger) => { let version; @@ -6,7 +7,7 @@ module.exports = (type, lastRelease, logger) => { version = semver.inc(lastRelease.version, type); logger.log('The next release version is %s', version); } else { - version = '1.0.0'; + version = FIRST_RELEASE; logger.log('There is no previous release, the next release version is %s', version); } diff --git a/test/index.test.js b/test/index.test.js index 644f0999..305e066b 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -5,6 +5,7 @@ import clearModule from 'clear-module'; import AggregateError from 'aggregate-error'; import SemanticReleaseError from '@semantic-release/error'; import DEFINITIONS from '../lib/definitions/plugins'; +import {COMMIT_NAME, COMMIT_EMAIL} from '../lib/definitions/constants'; import { gitHead as getGitHead, gitTagHead, @@ -157,6 +158,12 @@ test.serial('Plugins are called with expected values', async t => { // Verify the tag has been created on the local and remote repo and reference the gitHead t.is(await gitTagHead(nextRelease.gitTag), nextRelease.gitHead); t.is(await gitRemoteTagHead(repositoryUrl, nextRelease.gitTag), nextRelease.gitHead); + + // Verify the author/commiter name and email hve been set + t.is(process.env.GIT_AUTHOR_NAME, COMMIT_NAME); + t.is(process.env.GIT_AUTHOR_EMAIL, COMMIT_EMAIL); + t.is(process.env.GIT_COMMITTER_NAME, COMMIT_NAME); + t.is(process.env.GIT_COMMITTER_EMAIL, COMMIT_EMAIL); }); test.serial('Use custom tag format', async t => {