Repository: semantic-release/semantic-release
Pull request #784 (2018-05-08 03:47:36)

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.

See semantic-release/git#47


Patch:
diff --git a/docs/usage/configuration.md b/docs/usage/configuration.md
index 0976aa0..c285c5e 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 621ea9d..215f184 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 0000000..e09b8b5
--- /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 1a6a027..c64cb49 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 6417126..6f97b71 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 9bb7d3d..0000000
--- a/lib/definitions/release-types.js
+++ /dev/null
@@ -1,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 2d02a0f..d64ac25 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);
   }
 


Test patch:
diff --git a/test/index.test.js b/test/index.test.js
index 644f099..305e066 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 => {