feat: require Node.js >=10.13
BREAKING CHANGE: Require Node.js >= 10.13
This commit is contained in:
		
							parent
							
								
									916c2685c5
								
							
						
					
					
						commit
						0716a45b7d
					
				| @ -5,8 +5,7 @@ services: | |||||||
| 
 | 
 | ||||||
| node_js: | node_js: | ||||||
|   - 12 |   - 12 | ||||||
|   - 10 |   - 10.13 | ||||||
|   - 8.16 |  | ||||||
| 
 | 
 | ||||||
| # Trigger a push build on release and greenkeeper branches + PRs build on every branches | # Trigger a push build on release and greenkeeper branches + PRs build on every branches | ||||||
| # Avoid double build on PRs (See https://github.com/travis-ci/travis-ci/issues/1147) | # Avoid double build on PRs (See https://github.com/travis-ci/travis-ci/issues/1147) | ||||||
|  | |||||||
| @ -35,7 +35,7 @@ execa('git', ['--version']) | |||||||
|     process.exit(1); |     process.exit(1); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
| // Node 8+ from this point on
 | // Node 10+ from this point on
 | ||||||
| require('../cli')() | require('../cli')() | ||||||
|   .then(exitCode => { |   .then(exitCode => { | ||||||
|     process.exitCode = exitCode; |     process.exitCode = exitCode; | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ In this example an [`NPM_TOKEN`](https://docs.npmjs.com/creating-and-viewing-aut | |||||||
| 
 | 
 | ||||||
| [GitHub Actions](https://github.com/features/actions) support [Workflows](https://help.github.com/en/articles/configuring-workflows), allowing to run tests on multiple Node versions and publish a release only when all test pass. | [GitHub Actions](https://github.com/features/actions) support [Workflows](https://help.github.com/en/articles/configuring-workflows), allowing to run tests on multiple Node versions and publish a release only when all test pass. | ||||||
| 
 | 
 | ||||||
| **Note**: The publish pipeline must run on [Node version >= 8.16](../support/FAQ.md#why-does-semantic-release-require-node-version--816). | **Note**: The publish pipeline must run on [Node version >= 10.13](../support/FAQ.md#why-does-semantic-release-require-node-version--1013). | ||||||
| 
 | 
 | ||||||
| ### `.github/workflows/release.yml` configuration for Node projects | ### `.github/workflows/release.yml` configuration for Node projects | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ The [Authentication](../usage/ci-configuration.md#authentication) environment va | |||||||
| 
 | 
 | ||||||
| GitLab CI supports [Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html) allowing to test on multiple Node versions and publishing a release only when all test pass. | GitLab CI supports [Pipelines](https://docs.gitlab.com/ee/ci/pipelines.html) allowing to test on multiple Node versions and publishing a release only when all test pass. | ||||||
| 
 | 
 | ||||||
| **Note**: The publish pipeline must run a [Node >= 8.16 version](../support/FAQ.md#why-does-semantic-release-require-node-version--816). | **Note**: The publish pipeline must run a [Node >= 10.13 version](../support/FAQ.md#why-does-semantic-release-require-node-version--1013). | ||||||
| 
 | 
 | ||||||
| ### `.gitlab-ci.yml` configuration for Node projects | ### `.gitlab-ci.yml` configuration for Node projects | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -38,7 +38,7 @@ Yes with the [dry-run options](../usage/configuration.md#dryrun) which prints to | |||||||
| 
 | 
 | ||||||
| ## Can I use semantic-release with Yarn? | ## Can I use semantic-release with Yarn? | ||||||
| 
 | 
 | ||||||
| If you are using a [local](../usage/installation.md#local-installation) **semantic-release** installation and run multiple CI jobs with different versions, the `yarn install` command will fail on jobs running with Node < 8 as **semantic-release** requires [Node >= 8.16](#why-does-semantic-release-require-node-version--816) and specifies it in its `package.json`s [`engines`](https://docs.npmjs.com/files/package.json#engines) key. | If you are using a [local](../usage/installation.md#local-installation) **semantic-release** installation and run multiple CI jobs with different versions, the `yarn install` command will fail on jobs running with Node < 8 as **semantic-release** requires [Node >= 10.13](#why-does-semantic-release-require-node-version--1013) and specifies it in its `package.json`s [`engines`](https://docs.npmjs.com/files/package.json#engines) key. | ||||||
| 
 | 
 | ||||||
| The recommended solution is to use the [Yarn](https://yarnpkg.com) [--ignore-engines](https://yarnpkg.com/en/docs/cli/install#toc-yarn-install-ignore-engines) option to install the project dependencies on the CI environment, so Yarn will ignore the **semantic-release**'s `engines` key: | The recommended solution is to use the [Yarn](https://yarnpkg.com) [--ignore-engines](https://yarnpkg.com/en/docs/cli/install#toc-yarn-install-ignore-engines) option to install the project dependencies on the CI environment, so Yarn will ignore the **semantic-release**'s `engines` key: | ||||||
| 
 | 
 | ||||||
| @ -48,7 +48,7 @@ $ yarn install --ignore-engines | |||||||
| 
 | 
 | ||||||
| **Note**: Several CI services use Yarn by default if your repository contains a `yarn.lock` file. So you should override the install step to specify `yarn install --ignore-engines`. | **Note**: Several CI services use Yarn by default if your repository contains a `yarn.lock` file. So you should override the install step to specify `yarn install --ignore-engines`. | ||||||
| 
 | 
 | ||||||
| Alternatively you can use a [global](../usage/installation.md#global-installation) **semantic-release** installation and make sure to install and run the `semantic-release` command only in a CI jobs running with Node >= 8.16. | Alternatively you can use a [global](../usage/installation.md#global-installation) **semantic-release** installation and make sure to install and run the `semantic-release` command only in a CI jobs running with Node >= 10.13. | ||||||
| 
 | 
 | ||||||
| If your CI environment provides [nvm](https://github.com/creationix/nvm) you can switch to Node 8 before installing and running the `semantic-release` command: | If your CI environment provides [nvm](https://github.com/creationix/nvm) you can switch to Node 8 before installing and running the `semantic-release` command: | ||||||
| 
 | 
 | ||||||
| @ -73,7 +73,7 @@ Yes, **semantic-release** is a Node CLI application but it can be used to publis | |||||||
| To publish a non-Node package (without a `package.json`) you would need to: | To publish a non-Node package (without a `package.json`) you would need to: | ||||||
| - Use a [global](../usage/installation.md#global-installation) **semantic-release** installation | - Use a [global](../usage/installation.md#global-installation) **semantic-release** installation | ||||||
| - 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.16](#why-does-semantic-release-require-node-version--816) to execute the `semantic-release` command | - Make sure your CI job executing the `semantic-release` command has access to [Node >= 10.13](#why-does-semantic-release-require-node-version--1013) to execute the `semantic-release` command | ||||||
| 
 | 
 | ||||||
| See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. | See the [CI configuration recipes](../recipes/README.md#ci-configurations) for more details on specific CI environments. | ||||||
| 
 | 
 | ||||||
| @ -232,9 +232,9 @@ See [“Introduction to SemVer” - Irina Gebauer](https://blog.greenkeeper.io/i | |||||||
| 
 | 
 | ||||||
| In addition the [verify conditions step](../../README.md#release-steps) verifies that all necessary conditions for proceeding with a release are met, and a new release will be performed [only if all your tests pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). | In addition the [verify conditions step](../../README.md#release-steps) verifies that all necessary conditions for proceeding with a release are met, and a new release will be performed [only if all your tests pass](../usage/ci-configuration.md#run-semantic-release-only-after-all-tests-succeeded). | ||||||
| 
 | 
 | ||||||
| ## Why does semantic-release require Node version >= 8.16? | ## Why does semantic-release require Node version >= 10.13? | ||||||
| 
 | 
 | ||||||
| **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which **requires Node version 8.16 or higher**. | **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which **requires Node version 10.13 or higher**. | ||||||
| 
 | 
 | ||||||
| See [Node version requirement](./node-version.md#node-version-requirement) for more details and solutions. | See [Node version requirement](./node-version.md#node-version-requirement) for more details and solutions. | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| # Node version requirement | # Node version requirement | ||||||
| 
 | 
 | ||||||
| **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which requires **requires Node version 8.16 or higher**. | **semantic-release** is written using the latest [ECMAScript 2017](https://www.ecma-international.org/publications/standards/Ecma-262.htm) features, without transpilation which requires **requires Node version 10 or higher**. | ||||||
| 
 | 
 | ||||||
| **semantic-release** is meant to be used in a CI environment as a development support tool, not as a production dependency. Therefore the only constraint is to run the `semantic-release` in a CI environment providing Node 8 or higher. | **semantic-release** is meant to be used in a CI environment as a development support tool, not as a production dependency. Therefore the only constraint is to run the `semantic-release` in a CI environment providing Node 8 or higher. | ||||||
| 
 | 
 | ||||||
| @ -8,9 +8,9 @@ See our [Node Support Policy](node-support-policy.md) for our long-term promise | |||||||
| 
 | 
 | ||||||
| ## Recommended solution | ## Recommended solution | ||||||
| 
 | 
 | ||||||
| ### Run at least one CI job with Node >= 8.16 | ### Run at least one CI job with Node >= 10.13 | ||||||
| 
 | 
 | ||||||
| The recommended approach is to run the `semantic-release` command from a CI job running on Node 8.16 or higher. This can either be a job used by your project to test on Node >= 8.16 or a dedicated job for the release steps. | The recommended approach is to run the `semantic-release` command from a CI job running on Node 10.13 or higher. This can either be a job used by your project to test on Node >= 10.13 or a dedicated job for the release steps. | ||||||
| 
 | 
 | ||||||
| See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. | See [CI configuration](../usage/ci-configuration.md) and [CI configuration recipes](../recipes/README.md#ci-configurations) for more details. | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -50,7 +50,7 @@ module.exports = async (repositoryUrl, ciBranch, context) => { | |||||||
|   const duplicates = [...branches] |   const duplicates = [...branches] | ||||||
|     .map(branch => branch.name) |     .map(branch => branch.name) | ||||||
|     .sort() |     .sort() | ||||||
|     .filter((val, idx, arr) => arr[idx] === arr[idx + 1] && arr[idx] !== arr[idx - 1]); |     .filter((_, idx, arr) => arr[idx] === arr[idx + 1] && arr[idx] !== arr[idx - 1]); | ||||||
| 
 | 
 | ||||||
|   if (duplicates.length > 0) { |   if (duplicates.length > 0) { | ||||||
|     errors.push(getError('EDUPLICATEBRANCHES', {duplicates})); |     errors.push(getError('EDUPLICATEBRANCHES', {duplicates})); | ||||||
|  | |||||||
| @ -47,7 +47,8 @@ module.exports = async ({cwd, env, branch, options: {repositoryUrl}}) => { | |||||||
| 
 | 
 | ||||||
|     if (gitCredentials) { |     if (gitCredentials) { | ||||||
|       // If credentials are set via environment variables, convert the URL to http/https and add basic auth, otherwise return `repositoryUrl` as is
 |       // If credentials are set via environment variables, convert the URL to http/https and add basic auth, otherwise return `repositoryUrl` as is
 | ||||||
|       const [match, auth, host, path] = /^(?!.+:\/\/)(?:(.*)@)?(.*?):(.*)$/.exec(repositoryUrl) || []; |       const [match, auth, host, path] = | ||||||
|  |         /^(?!.+:\/\/)(?:(?<auth>.*)@)?(?<host>.*?):(?<path>.*)$/.exec(repositoryUrl) || []; | ||||||
|       const {port, hostname, ...parsed} = parse( |       const {port, hostname, ...parsed} = parse( | ||||||
|         match ? `ssh://${auth ? `${auth}@` : ''}${host}/${path}` : repositoryUrl |         match ? `ssh://${auth ? `${auth}@` : ''}${host}/${path}` : repositoryUrl | ||||||
|       ); |       ); | ||||||
|  | |||||||
| @ -65,7 +65,7 @@ async function getCommits(from, to, execaOpts) { | |||||||
| async function getBranches(repositoryUrl, execaOpts) { | async function getBranches(repositoryUrl, execaOpts) { | ||||||
|   return (await execa('git', ['ls-remote', '--heads', repositoryUrl], execaOpts)).stdout |   return (await execa('git', ['ls-remote', '--heads', repositoryUrl], execaOpts)).stdout | ||||||
|     .split('\n') |     .split('\n') | ||||||
|     .map(branch => branch.match(/^.+refs\/heads\/(.+)$/)[1]) |     .map(branch => branch.match(/^.+refs\/heads\/(?<branch>.+)$/)[1]) | ||||||
|     .filter(Boolean); |     .filter(Boolean); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -312,7 +312,7 @@ async function verifyBranchName(branch, execaOpts) { | |||||||
| async function isBranchUpToDate(repositoryUrl, branch, execaOpts) { | async function isBranchUpToDate(repositoryUrl, branch, execaOpts) { | ||||||
|   const {stdout: remoteHead} = await execa('git', ['ls-remote', '--heads', repositoryUrl, branch], execaOpts); |   const {stdout: remoteHead} = await execa('git', ['ls-remote', '--heads', repositoryUrl, branch], execaOpts); | ||||||
|   try { |   try { | ||||||
|     return await isRefInHistory(remoteHead.match(/^(\w+)?/)[1], branch, execaOpts); |     return await isRefInHistory(remoteHead.match(/^(?<ref>\w+)?/)[1], branch, execaOpts); | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|     debug(error); |     debug(error); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -31,11 +31,13 @@ function isMaintenanceRange(range) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function getUpperBound(range) { | function getUpperBound(range) { | ||||||
|   return semver.valid(range) ? range : ((semver.validRange(range) || '').match(/<(\d+\.\d+\.\d+)$/) || [])[1]; |   return semver.valid(range) | ||||||
|  |     ? range | ||||||
|  |     : ((semver.validRange(range) || '').match(/<(?<upperBound>\d+\.\d+\.\d+)$/) || [])[1]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function getLowerBound(range) { | function getLowerBound(range) { | ||||||
|   return ((semver.validRange(range) || '').match(/(\d+\.\d+\.\d+)/) || [])[1]; |   return ((semver.validRange(range) || '').match(/(?<lowerBound>\d+\.\d+\.\d+)/) || [])[1]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function highest(version1, version2) { | function highest(version1, version2) { | ||||||
|  | |||||||
| @ -72,7 +72,7 @@ | |||||||
|     "xo": "^0.25.0" |     "xo": "^0.25.0" | ||||||
|   }, |   }, | ||||||
|   "engines": { |   "engines": { | ||||||
|     "node": ">=8.16" |     "node": ">=10.13" | ||||||
|   }, |   }, | ||||||
|   "files": [ |   "files": [ | ||||||
|     "bin", |     "bin", | ||||||
|  | |||||||
| @ -213,7 +213,7 @@ export async function gitRemoteTagHead(repositoryUrl, tagName, execaOpts) { | |||||||
|   return (await execa('git', ['ls-remote', '--tags', repositoryUrl, tagName], execaOpts)).stdout |   return (await execa('git', ['ls-remote', '--tags', repositoryUrl, tagName], execaOpts)).stdout | ||||||
|     .split('\n') |     .split('\n') | ||||||
|     .filter(tag => Boolean(tag)) |     .filter(tag => Boolean(tag)) | ||||||
|     .map(tag => tag.match(/^(\S+)/)[1])[0]; |     .map(tag => tag.match(/^(?<tag>\S+)/)[1])[0]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user