Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9bd650967 | ||
|
|
6e15c18bea | ||
|
|
5af90319a1 | ||
|
|
218aa32f79 | ||
|
|
cb1f80cb56 | ||
|
|
7c9ec41dd7 | ||
|
|
a1138a6a80 | ||
|
|
6172eb807c | ||
|
|
31ad23125a | ||
|
|
a8a07b7d51 | ||
|
|
02746aa276 | ||
|
|
e41726cb96 |
@@ -34,3 +34,15 @@
|
|||||||
- [fail](https://github.com/semantic-release/exec#fail): Execute a shell command to notify of a failed release
|
- [fail](https://github.com/semantic-release/exec#fail): Execute a shell command to notify of a failed release
|
||||||
|
|
||||||
## Community plugins
|
## Community plugins
|
||||||
|
|
||||||
|
[Open a Pull Request](https://github.com/semantic-release/semantic-release/blob/caribou/CONTRIBUTING.md#submitting-a-pull-request) to add your plugin to the list.
|
||||||
|
|
||||||
|
- [semantic-release-docker](https://github.com/felixfbecker/semantic-release-docker) Set of semantic-release plugins for publishing a docker image to Docker Hub (tested on semantic-release **^11.0.0**)
|
||||||
|
- [verifyConditions](https://github.com/felixfbecker/semantic-release-docker#verifyconditions) Verify that all needed configuration is present and login to the Docker registry.
|
||||||
|
- [publish](https://github.com/felixfbecker/semantic-release-docker#publish) Tag the image specified by `name` with the new version, push it to Docker Hub and update the latest tag.
|
||||||
|
- [semantic-release-verify-deps](https://github.com/piercus/semantic-release-verify-deps)
|
||||||
|
- [verifyConditions](https://github.com/piercus/semantic-release-verify-deps) Check the dependencies format against a regexp before a release
|
||||||
|
- [semantic-release-chrome](https://github.com/GabrielDuarteM/semantic-release-chrome) Set of semantic-release plugins for publishing a Chrome extension release.
|
||||||
|
- [verifyConditions](https://github.com/GabrielDuarteM/semantic-release-chrome#verifyconditions) Verify the presence of the authentication (set via environment variables).
|
||||||
|
- [prepare](https://github.com/GabrielDuarteM/semantic-release-chrome#prepare) Write the correct version to the manifest.json and creates a zip file of the whole dist folder.
|
||||||
|
- [publish](https://github.com/GabrielDuarteM/semantic-release-chrome#publish) Uploads the generated zip file to the webstore, and publish the item.
|
||||||
|
|||||||
+31
-2
@@ -57,7 +57,36 @@ To publish a non-Node package (without a `package.json`) you would need to:
|
|||||||
- Set **semantic-release** [options](../usage/configuration.md#options) via [CLI arguments or rc file](../usage/configuration.md#configuration)
|
- Set **semantic-release** [options](../usage/configuration.md#options) via [CLI arguments or rc file](../usage/configuration.md#configuration)
|
||||||
- Make sure your CI job executing the `semantic-release` command has access to [Node >= 8](#why-does-semantic-release-require-node-version--83) to execute the `semantic-release` command
|
- Make sure your CI job executing the `semantic-release` command has access to [Node >= 8](#why-does-semantic-release-require-node-version--83) to execute the `semantic-release` command
|
||||||
|
|
||||||
See the [CI configuration recipes](../usage/ci-configuration.md) for more details on specific CI environments.
|
See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments.
|
||||||
|
|
||||||
|
In addition you will need to configure the **semantic-release** [plugins](../usage/plugins.md#plugins) to:
|
||||||
|
- Disable the [`@semantic-release/npm`](https://github.com/semantic-release/npm) plugin
|
||||||
|
- Define plugins for the [verifyConditions](../usage/plugins.md#verifyconditions-plugin), [prepare](../usage/plugins.md#prepare-plugin) and [publish](../usage/plugins.md#publish-plugin) steps to release on your package registry. The [`@semantic-release/exec`](https://github.com/semantic-release/exec) plugin is recommended for situation where a release can be done with a shell command.
|
||||||
|
|
||||||
|
Here is a basic example to create [GitHub releases](https://help.github.com/articles/about-releases) and use shell command to publish:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"verifyConditions": ["@semantic-release/github"],
|
||||||
|
"prepare": [
|
||||||
|
{
|
||||||
|
"path": "@semantic-release/exec",
|
||||||
|
"cmd": "set-version ${nextRelease.version}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"publish": [
|
||||||
|
"@semantic-release/github",
|
||||||
|
{
|
||||||
|
"path": "@semantic-release/exec",
|
||||||
|
"cmd": "publish-package"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note**: This is a theoretical example where the command `set-version` update the project version with the value passed as its first argument and `publish-package` publishes the package to a registry.
|
||||||
|
|
||||||
|
See the [package managers and languages recipes](../recipes/README.md#package-managers-and-languages) for more details on specific project types.
|
||||||
|
|
||||||
## Can I use semantic-release with any CI service?
|
## Can I use semantic-release with any CI service?
|
||||||
|
|
||||||
@@ -65,7 +94,7 @@ Yes, **semantic-release** can be used with any CI service, as long as it provide
|
|||||||
- A way to set [authentication](../usage/ci-configuration.md#authentication) via environment variables
|
- A way to set [authentication](../usage/ci-configuration.md#authentication) via environment variables
|
||||||
- A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded)
|
- A way to guarantee that the `semantic-release` command is [executed only after all the tests of all the jobs in the CI build pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded)
|
||||||
|
|
||||||
See the [CI configuration recipes](../usage/ci-configuration.md) for more details on specific CI environments.
|
See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments.
|
||||||
|
|
||||||
## Can I run semantic-release on my local machine rather than on a CI server?
|
## Can I run semantic-release on my local machine rather than on a CI server?
|
||||||
|
|
||||||
|
|||||||
@@ -29,3 +29,18 @@ You can recover from that issue by identifying the commit in your branch history
|
|||||||
$ git tag -f v<version of the last release> <commit sha1 corresponding to last release>
|
$ git tag -f v<version of the last release> <commit sha1 corresponding to last release>
|
||||||
$ git push -f --tags origin <your release branch>
|
$ git push -f --tags origin <your release branch>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## You do not have permission to publish 'package-name'
|
||||||
|
|
||||||
|
When running semantic-release you may encounter the following error:
|
||||||
|
|
||||||
|
```
|
||||||
|
An error occurred while running semantic-release: { Error: Command failed: npm publish ./. --registry https://registry.npmjs.org/
|
||||||
|
npm ERR! publish Failed PUT 403
|
||||||
|
npm ERR! code E403
|
||||||
|
npm ERR! You do not have permission to publish "<package-name>". Are you logged in as the correct user? : <package-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
This message is a little unclear, and might not have anything to with your `NPM_TOKEN` or authentication method. It might instead be related to the package name itself. If there is already a package with the same name as yours or, there is a very close match, it could trigger this error.
|
||||||
|
|
||||||
|
Best way to be sure, is to search [npmjs.org](https://www.npmjs.com/)) using your package name. If there is a name conflict, rename your package in your `package.json`
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ See [CI configuration recipes](../recipes/README.md#ci-configurations) for more
|
|||||||
|
|
||||||
Alternatively the Git authentication can be set up via [SSH keys](../recipes/git-auth-ssh-keys.md).
|
Alternatively the Git authentication can be set up via [SSH keys](../recipes/git-auth-ssh-keys.md).
|
||||||
|
|
||||||
Most **semantic-release** [plugins](plugins.md) require to set up authentication in order to publish to a package manager registry. The default [npm](https://github.com/semantic-release/npm#environment-variables) and [github](https://github.com/semantic-release/github#environment-variables) plugins require the following environment variables:
|
Most **semantic-release** [plugins](plugins.md) require setting up authentication in order to publish to a package manager registry. The default [@semantic-release/npm](https://github.com/semantic-release/npm#environment-variables) and [@semantic-release/github](https://github.com/semantic-release/github#environment-variables) plugins require the following environment variables:
|
||||||
|
|
||||||
| Variable | Description |
|
| Variable | Description |
|
||||||
|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
@@ -35,7 +35,7 @@ See [CI configuration recipes](../recipes/README.md#ci-configurations) for more
|
|||||||
|
|
||||||
## Automatic setup with `semantic-release-cli`
|
## Automatic setup with `semantic-release-cli`
|
||||||
|
|
||||||
[`semantic-release-cli`](https://github.com/semantic-release/cli) allow to easily [install](installation.md) **semantic-release** in your Node project and set up the CI configuration:
|
[`semantic-release-cli`](https://github.com/semantic-release/cli) allows for easy [installation](installation.md) of **semantic-release** in your Node project as well as setting up the CI configuration:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install -g semantic-release-cli
|
npm install -g semantic-release-cli
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ $ semantic-release
|
|||||||
|
|
||||||
**Note**: CLI arguments take precedence over options configured in the configuration file.
|
**Note**: CLI arguments take precedence over options configured in the configuration file.
|
||||||
|
|
||||||
**Note**: Plugins options cannot be defined via CLI arguments and must be defined in the configuration file.
|
**Note**: Plugin options cannot be defined via CLI arguments and must be defined in the configuration file.
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ Type: `Array`, `String`
|
|||||||
|
|
||||||
CLI arguments: `-e`, `--extends`
|
CLI arguments: `-e`, `--extends`
|
||||||
|
|
||||||
List of modules or file paths containing a [shareable configuration](shareable-configurations.md). If multiple shareable configuration are set, they will be imported in the order defined with each configuration option taking precedence over the options defined in a previous shareable configuration.
|
List of modules or file paths containing a [shareable configuration](shareable-configurations.md). If multiple shareable configurations are set, they will be imported in the order defined with each configuration option taking precedence over the options defined in a previous shareable configuration.
|
||||||
|
|
||||||
**Note**: Options defined via CLI arguments or in the configuration file will take precedence over the ones defined in any shareable configuration.
|
**Note**: Options defined via CLI arguments or in the configuration file will take precedence over the ones defined in any shareable configuration.
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ The [Git tag](https://git-scm.com/book/en/v2/Git-Basics-Tagging) format used by
|
|||||||
|
|
||||||
Type: `Boolean`
|
Type: `Boolean`
|
||||||
|
|
||||||
Default: `false` if running in a CI environment, `false` otherwise
|
Default: `false` if running in a CI environment, `true` otherwise
|
||||||
|
|
||||||
CLI arguments: `-d`, `--dry-run`
|
CLI arguments: `-d`, `--dry-run`
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ Default: `false`
|
|||||||
|
|
||||||
CLI arguments: `--no-ci`
|
CLI arguments: `--no-ci`
|
||||||
|
|
||||||
Skip Continuous Integration environment verifications, allowing to make releases from a local machine.
|
Skip Continuous Integration environment verifications. This allows for making releases from a local machine.
|
||||||
|
|
||||||
### debug
|
### debug
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ Default: `false`
|
|||||||
|
|
||||||
CLI argument: `--debug`
|
CLI argument: `--debug`
|
||||||
|
|
||||||
Output debugging information. It can also be enabled by set the `DEBUG` environment variable to `semantic-release:*`.
|
Output debugging information. It can also be enabled by setting the `DEBUG` environment variable to `semantic-release:*`.
|
||||||
|
|
||||||
### verifyConditions
|
### verifyConditions
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Each [release step](../../README.md#release-steps) is implemented within a plugi
|
|||||||
|
|
||||||
Responsible for verifying conditions necessary to proceed with the release: configuration is correct, authentication token are valid, etc...
|
Responsible for verifying conditions necessary to proceed with the release: configuration is correct, authentication token are valid, etc...
|
||||||
|
|
||||||
Default implementation: [npm](https://github.com/semantic-release/npm#verifyconditions) and [github](https://github.com/semantic-release/github#verifyconditions).
|
Default implementation: [@semantic-release/npm](https://github.com/semantic-release/npm#verifyconditions) and [@semantic-release/github](https://github.com/semantic-release/github#verifyconditions).
|
||||||
|
|
||||||
### analyzeCommits plugin
|
### analyzeCommits plugin
|
||||||
|
|
||||||
@@ -34,25 +34,25 @@ Responsible for preparing the release, including:
|
|||||||
- Creating or updating files such as `package.json`, `CHANGELOG.md`, documentation or compiled assets.
|
- Creating or updating files such as `package.json`, `CHANGELOG.md`, documentation or compiled assets.
|
||||||
- Create and push commits
|
- Create and push commits
|
||||||
|
|
||||||
Default implementation: [npm](https://github.com/semantic-release/npm#prepare).
|
Default implementation: [@semantic-release/npm](https://github.com/semantic-release/npm#prepare).
|
||||||
|
|
||||||
### publish plugin
|
### publish plugin
|
||||||
|
|
||||||
Responsible for publishing the release.
|
Responsible for publishing the release.
|
||||||
|
|
||||||
Default implementation: [npm](https://github.com/semantic-release/npm#publish) and [github](https://github.com/semantic-release/github#publish).
|
Default implementation: [@semantic-release/npm](https://github.com/semantic-release/npm#publish) and [@semantic-release/github](https://github.com/semantic-release/github#publish).
|
||||||
|
|
||||||
### success plugin
|
### success plugin
|
||||||
|
|
||||||
Responsible for notifying of a new release.
|
Responsible for notifying of a new release.
|
||||||
|
|
||||||
Default implementation: [github](https://github.com/semantic-release/github#success).
|
Default implementation: [@semantic-release/github](https://github.com/semantic-release/github#success).
|
||||||
|
|
||||||
### fail plugin
|
### fail plugin
|
||||||
|
|
||||||
Responsible for notifying of a failed release.
|
Responsible for notifying of a failed release.
|
||||||
|
|
||||||
Default implementation: [github](https://github.com/semantic-release/github#fail).
|
Default implementation: [@semantic-release/github](https://github.com/semantic-release/github#fail).
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Shareable configurations
|
# Shareable configurations
|
||||||
|
|
||||||
A sharable configuration is an [npm](https://www.npmjs.com/) package that exports a **semantic-release** configuration object. It allows to easily use the same configuration across several projects.
|
A sharable configuration is an [npm](https://www.npmjs.com/) package that exports a **semantic-release** configuration object. It allows for use of the same configuration across several projects.
|
||||||
|
|
||||||
The shareable configurations to use can be set with the [extends](configuration.md#extends) option.
|
The shareable configurations to use can be set with the [extends](configuration.md#extends) option.
|
||||||
|
|||||||
@@ -40,13 +40,11 @@ module.exports = async ({repositoryUrl, branch}) => {
|
|||||||
const gitCredentials = ['GL_TOKEN', 'GITLAB_TOKEN'].includes(envVar)
|
const gitCredentials = ['GL_TOKEN', 'GITLAB_TOKEN'].includes(envVar)
|
||||||
? `gitlab-ci-token:${process.env[envVar]}`
|
? `gitlab-ci-token:${process.env[envVar]}`
|
||||||
: process.env[envVar];
|
: process.env[envVar];
|
||||||
const {protocols} = gitUrlParse(repositoryUrl);
|
const {protocols, ...parsed} = gitUrlParse(repositoryUrl);
|
||||||
const protocol = protocols.includes('https') ? 'https' : protocols.includes('http') ? 'http' : 'https';
|
const protocol = protocols.includes('https') ? 'https' : protocols.includes('http') ? 'http' : 'https';
|
||||||
|
|
||||||
// If credentials are set via anvironment variables, convert the URL to http/https and add basic auth, otherwise return `repositoryUrl` as is
|
// If credentials are set via anvironment variables, convert the URL to http/https and add basic auth, otherwise return `repositoryUrl` as is
|
||||||
return gitCredentials
|
return gitCredentials ? {...parsed, ...{token: gitCredentials}}.toString(protocol) : repositoryUrl;
|
||||||
? format({...parse(`${gitUrlParse(repositoryUrl).toString(protocol)}.git`), ...{auth: gitCredentials}})
|
|
||||||
: repositoryUrl;
|
|
||||||
}
|
}
|
||||||
return repositoryUrl;
|
return repositoryUrl;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ module.exports = async (tagFormat, logger) => {
|
|||||||
// by replacing the `version` variable in the template by `(.+)`.
|
// by replacing the `version` variable in the template by `(.+)`.
|
||||||
// The `tagFormat` is compiled with space as the `version` as it's an invalid tag character,
|
// The `tagFormat` is compiled with space as the `version` as it's an invalid tag character,
|
||||||
// so it's guaranteed to no be present in the `tagFormat`.
|
// so it's guaranteed to no be present in the `tagFormat`.
|
||||||
const tagRegexp = escapeRegExp(template(tagFormat)({version: ' '})).replace(' ', '(.+)');
|
const tagRegexp = `^${escapeRegExp(template(tagFormat)({version: ' '})).replace(' ', '(.+)')}`;
|
||||||
|
|
||||||
const tags = (await gitTags())
|
const tags = (await gitTags())
|
||||||
.map(tag => ({gitTag: tag, version: (tag.match(tagRegexp) || new Array(2))[1]}))
|
.map(tag => ({gitTag: tag, version: (tag.match(tagRegexp) || new Array(2))[1]}))
|
||||||
.filter(
|
.filter(
|
||||||
|
|||||||
+3
-3
@@ -28,11 +28,11 @@
|
|||||||
"chalk": "^2.3.0",
|
"chalk": "^2.3.0",
|
||||||
"cosmiconfig": "^4.0.0",
|
"cosmiconfig": "^4.0.0",
|
||||||
"debug": "^3.1.0",
|
"debug": "^3.1.0",
|
||||||
"env-ci": "^1.0.0",
|
"env-ci": "^2.0.0",
|
||||||
"execa": "^0.10.0",
|
"execa": "^0.10.0",
|
||||||
"get-stream": "^3.0.0",
|
"get-stream": "^3.0.0",
|
||||||
"git-log-parser": "^1.2.0",
|
"git-log-parser": "^1.2.0",
|
||||||
"git-url-parse": "^8.1.0",
|
"git-url-parse": "^9.0.0",
|
||||||
"hook-std": "^0.4.0",
|
"hook-std": "^0.4.0",
|
||||||
"hosted-git-info": "^2.6.0",
|
"hosted-git-info": "^2.6.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
"mockserver-client": "^5.1.1",
|
"mockserver-client": "^5.1.1",
|
||||||
"nock": "^9.0.2",
|
"nock": "^9.0.2",
|
||||||
"nyc": "^11.2.1",
|
"nyc": "^11.2.1",
|
||||||
"p-retry": "^1.0.0",
|
"p-retry": "^2.0.0",
|
||||||
"proxyquire": "^2.0.0",
|
"proxyquire": "^2.0.0",
|
||||||
"sinon": "^4.0.0",
|
"sinon": "^4.0.0",
|
||||||
"tempy": "^0.2.1",
|
"tempy": "^0.2.1",
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ test.serial(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test.serial('Do not add trailing ".git" if not present in the origian URL', async t => {
|
||||||
|
t.is(await getAuthUrl({repositoryUrl: 'git@host.null:owner/repo'}), 'git@host.null:owner/repo');
|
||||||
|
});
|
||||||
|
|
||||||
test.serial('Handle "https" URL with group and subgroup', async t => {
|
test.serial('Handle "https" URL with group and subgroup', async t => {
|
||||||
t.is(
|
t.is(
|
||||||
await getAuthUrl({repositoryUrl: 'https://host.null/group/subgroup/owner/repo.git'}),
|
await getAuthUrl({repositoryUrl: 'https://host.null/group/subgroup/owner/repo.git'}),
|
||||||
|
|||||||
@@ -62,6 +62,19 @@ test.serial('Get the highest tag in the history of the current branch', async t
|
|||||||
t.deepEqual(result, {gitHead: commits[0].hash, gitTag: 'v2.0.0', version: '2.0.0'});
|
t.deepEqual(result, {gitHead: commits[0].hash, gitTag: 'v2.0.0', version: '2.0.0'});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.serial('Match the tag name from the begining of the string', async t => {
|
||||||
|
// Create a git repository, set the current working directory at the root of the repo
|
||||||
|
await gitRepo();
|
||||||
|
const commits = await gitCommits(['First']);
|
||||||
|
await gitTagVersion('prefix/v1.0.0');
|
||||||
|
await gitTagVersion('prefix/v2.0.0');
|
||||||
|
await gitTagVersion('other-prefix/v3.0.0');
|
||||||
|
|
||||||
|
const result = await getLastRelease(`prefix/v\${version}`, t.context.logger);
|
||||||
|
|
||||||
|
t.deepEqual(result, {gitHead: commits[0].hash, gitTag: 'prefix/v2.0.0', version: '2.0.0'});
|
||||||
|
});
|
||||||
|
|
||||||
test.serial('Return empty object if no valid tag is found', async t => {
|
test.serial('Return empty object if no valid tag is found', async t => {
|
||||||
// Create a git repository, set the current working directory at the root of the repo
|
// Create a git repository, set the current working directory at the root of the repo
|
||||||
await gitRepo();
|
await gitRepo();
|
||||||
|
|||||||
Reference in New Issue
Block a user