# @semantic-release/exec [**semantic-release**](https://github.com/semantic-release/semantic-release) plugin to execute custom shell commands. [![Travis](https://img.shields.io/travis/semantic-release/exec.svg)](https://travis-ci.org/semantic-release/exec) [![Codecov](https://img.shields.io/codecov/c/github/semantic-release/exec.svg)](https://codecov.io/gh/semantic-release/exec) [![Greenkeeper badge](https://badges.greenkeeper.io/semantic-release/exec.svg)](https://greenkeeper.io/) [![npm latest version](https://img.shields.io/npm/v/@semantic-release/exec/latest.svg)](https://www.npmjs.com/package/@semantic-release/exec) [![npm next version](https://img.shields.io/npm/v/@semantic-release/exec/next.svg)](https://www.npmjs.com/package/@semantic-release/exec) | Step | Description | |--------------------|---------------------------------------------------------------------------------------------------------| | `verifyConditions` | Execute a shell command to verify if the release should happen. | | `analyzeCommits` | Execute a shell command to determine the type of release. | | `verifyRelease` | Execute a shell command to verifying a release that was determined before and is about to be published. | | `generateNotes` | Execute a shell command to generate the release note. | | `prepare` | Execute a shell command to prepare the release. | | `publish` | Execute a shell command to publish the release. | | `success` | Execute a shell command to notify of a new release. | | `fail` | Execute a shell command to notify of a failed release. | ## Install ```bash $ npm install @semantic-release/exec -D ``` ## Usage The plugin can be configured in the [**semantic-release** configuration file](https://github.com/semantic-release/semantic-release/blob/caribou/docs/usage/configuration.md#configuration): ```json { "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", ["@semantic-release/exec", { "verifyConditionsCmd": "./verify.sh", "publishCmd": "./publish.sh ${nextRelease.version} ${options.branch} ${commits.length} ${Date.now()}" }], ] } ``` With this example: - the shell command `./verify.sh` will be executed on the [verify conditions step](https://github.com/semantic-release/semantic-release#release-steps) - the shell command `./publish.sh 1.0.0 master 3 870668040000` (for the release of version `1.0.0` from branch `master` with `3` commits on `August 4th, 1997 at 2:14 AM`) will be executed on the [publish step](https://github.com/semantic-release/semantic-release#release-steps) ## Configuration ### Options | Options | Description | |-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `verifyConditionsCmd` | The shell command to execute during the verify condition step. See [verifyConditionsCmd](#verifyconditionscmd). | | `analyzeCommitsCmd` | The shell command to execute during the analyze commits step. See [analyzeCommitsCmd](#analyzecommitscmd). | | `verifyReleaseCmd` | The shell command to execute during the verify release step. See [verifyReleaseCmd](#verifyreleasecmd). | | `generateNotesCmd` | The shell command to execute during the generate notes step. See [generateNotesCmd](#generatenotescmd). | | `prepareCmd` | The shell command to execute during the prepare step. See [prepareCmd](#preparecmd). | | `publishCmd` | The shell command to execute during the publish step. See [publishCmd](#publishcmd). | | `successCmd` | The shell command to execute during the success step. See [successCmd](#successcmd). | | `failCmd` | The shell command to execute during the fail step. See [failCmd](#failcmd). | | `shell` | The shell to use to run the command. See [execa#shell](https://github.com/sindresorhus/execa#shell). | | `execCwd` | The path to use as current working directory when executing the shell commands. This path is relative to the path from which **semantic-release** is running. For example if **semantic-release** runs from `/my-project` and `execCwd` is set to `buildScripts` then the shell command will be executed from `/my-project/buildScripts` | Each shell command is generated with [Lodash template](https://lodash.com/docs#template). All the objets passed to the [semantic-release plugins](https://github.com/semantic-release/semantic-release#plugins) are available as template options. ## verifyConditionsCmd Execute a shell command to verify if the release should happen. | Command property | Description | |------------------|--------------------------------------------------------------------------| | `exit code` | `0` if the verification is successful, or any other exit code otherwise. | | `stdout` | Write only the reason for the verification to fail. | | `stderr` | Can be used for logging. | ## analyzeCommitsCmd | Command property | Description | |------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| | `exit code` | Any non `0` code is considered as an unexpected error and will stop the `semantic-release` execution with an error. | | `stdout` | Only the release type (`major`, `minor` or `patch` etc..) can be written to `stdout`. If no release has to be done the command must not write to `stdout`. | | `stderr` | Can be used for logging. | ## verifyReleaseCmd | Command property | Description | |------------------|--------------------------------------------------------------------------| | `exit code` | `0` if the verification is successful, or any other exit code otherwise. | | `stdout` | Only the reason for the verification to fail can be written to `stdout`. | | `stderr` | Can be used for logging. | ## generateNotesCmd | Command property | Description | |------------------|---------------------------------------------------------------------------------------------------------------------| | `exit code` | Any non `0` code is considered as an unexpected error and will stop the `semantic-release` execution with an error. | | `stdout` | Only the release note must be written to `stdout`. | | `stderr` | Can be used for logging. | ## prepareCmd | Command property | Description | |------------------|---------------------------------------------------------------------------------------------------------------------| | `exit code` | Any non `0` code is considered as an unexpected error and will stop the `semantic-release` execution with an error. | | `stdout` | Can be used for logging. | | `stderr` | Can be used for logging. | ## publishCmd | Command property | Description | |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `exit code` | Any non `0` code is considered as an unexpected error and will stop the `semantic-release` execution with an error. | | `stdout` | The `release` information can be written to `stdout` as parseable JSON (for example `{"name": "Release name", "url": "http://url/release/1.0.0"}`). If the command write non parseable JSON to `stdout` no `release` information will be returned. | | `stderr` | Can be used for logging. | ## successCmd | Command property | Description | |------------------|---------------------------------------------------------------------------------------------------------------------| | `exit code` | Any non `0` code is considered as an unexpected error and will stop the `semantic-release` execution with an error. | | `stdout` | Can be used for logging. | | `stderr` | Can be used for logging. | ## failCmd | Command property | Description | |------------------|---------------------------------------------------------------------------------------------------------------------| | `exit code` | Any non `0` code is considered as an unexpected error and will stop the `semantic-release` execution with an error. | | `stdout` | Can be used for logging. | | `stderr` | Can be used for logging. |