The web3.js project follows the semver 2.0.0 specification.
The major
version has to be increased as soon as a breaking change is introduced. The definition of a breaking change is anything that requires a depending project to update their code base, build pipeline or tests.
The minor
is increased as soon as new smaller features do get introduced. A minor
release will not affect any depending project. Such a release only introduces smaller enhancements and features a project could use.
A patch release only contains required bug fixes with a low risk to impact depending project.
Further details about versioning can be found in the semver 2.0.0 specification we follow.
- The release should get released as an
RC
version on the specified track below. - The minor
RC
version stays released for amonth
for testing purposes. - During release review, the code is frozen unless new changes are proposed, approved and merged.
- Changes should trigger a new
RC
release and set the release clock back aweek
so reviewers have the time they need to test new changes.
- Changes should trigger a new
- The project lead should manually test the
RC
against a Node project and the published minified bundle in a browser context. An external reviewer should verify they have done the same.
The minor
release inherits the rules from the major
release but has a smaller testing phase of one week
and the release clock will be set back 2 days
on a change of the published code.
Since November 2019, Web3 has been following the minor
rules for patch
as well, to help establish a series of non-breaking releases.
A release candidate gets published on the rc
track and is no longer under active development. A release candidate gets released with the version number defined in the semver 2.0.0 specification specification.
A beta
release gets published on the beta
track and is under active developemnt. The version number of the beta
release gets defined as specified in the semver 2.0.0 document.
Note: This section has not yet been decided and so for now is purely informative.
To provide safety over longer periods, it is important to have versions tagged as LTS
.
Release | Status | Initial Release | LTS Start | End-of-Life |
---|---|---|---|---|
1.x | LTS | 24. Jul. 2017 | 23. Jul. 2019 | TBD |
2.x | Deprecated | 13. Jul. 2019 | 13. Jul. 2019 | 13. Jul. 2020 |
3.x | Deprecated | 9. Apr. 2021 | 9. Apr. 2021 | 26. Jan. 2022 |
4.x | Development | Apr. 2022 | TBD. | TBD. |
Because breaking changes are always happening during the development of a project it is required to define rules on how we inform depending projects about coming changes with enough time to react. This doesn't mean that we plan to introduce breaking changes but sometimes they are required.
- Deprecations will be announced in our
CHANGELOG
and in the description of a release. - Deprecated functionalities should be marked in the developer documentation, function documentation, and the related types as deprecated.
- A deprecated functionality stays deprecated for the next
X (TBD)
increases of the minor version.
The following describes the steps required to release a new version of web3.js
. It is followed to adhere to community standards and expectations.
- Create a GitHub draft release.
- Create release branch (e.g.
release/1.2.7
). - Update and commit
CHANGELOG.md
.- Move section header
[Unreleased]
to bottom. - Add next anticipated release version number to bottom (as a placeholder for new changelog entries).
- Move section header
- In the project root, run
npm run build
and commit changes after using a commit message like:Build for 1.0.0-rc.0
- The next step will also build each package, but Lerna makes the tagged commit before building the packages (so they're not included)
- Create release commit and tags e.g.
lerna version 1.2.7-rc.0 --no-push
- (updates package version numbers, builds minified file (for
1.x
), creates release commit and tags.)
- (updates package version numbers, builds minified file (for
- Push release branch to origin with tags
git push origin release/1.2.7 --follow-tags
. - Create release PR as draft (example).
- Ensure CI is green / passing.
- (spend time here inspecting the CI logs to ensure everything looks valid and results were reported correctly)
- Run
npm run publish from-package -- --dist-tag rc
.- Lerna can sometimes have difficulty with the number of packages we have. If the above command is unsuccessful, for every unpublished package run:
lerna publish --scope="package-name"
npm dist-tag add <package-name>@<version> rc
)
- Lerna can sometimes have difficulty with the number of packages we have. If the above command is unsuccessful, for every unpublished package run:
- Publish the GitHub release.
- A GitHub Webhook should trigger the ReadTheDocs build after the release is published.
- (The build may sometimes need to be manually triggered in ReadTheDocs admin panel. If the version does not appear, create a build of a previous version to refresh the list.)
- Activate the new version.
- Request PR review from key contributors: 1. Chris from EthereumJS (@cgewecke) 1. Patricio from Nomic Labs (@alcuadrado) 1. Michael from Embark (@michaelsbradleyjr) 1. Nicholas from Truffle (@gnidan) 1. If touches or affects ENS: Nick Johnson (@Arachnid)
- Wait 1 week for community discourse and 2 reviewer approvals. 1. (if release is an emergency patch, time limit may be reduced relative to severity.)
- Create GitHub draft release from text of
rc
release. - Checkout release branch (e.g.
release/1.2.7
). - Create and push release commit and tags:
lerna version 1.2.7 --force-publish --no-push
- Push release branch to origin with tags
git push origin release/1.2.7 --follow-tags
. - Publish the GitHub release.
- A GitHub Webhook should trigger the ReadTheDocs build after the release is published.
- (The build may sometimes need to be manually triggered in ReadTheDocs admin panel. If the version does not appear, create a build of a previous version to refresh the list.)
- Activate the new version.
- Set the version to default.
- Run
npm run publish from-package
. - Merge release PR.
- Share the release announcement on:
- (Note: There is a delay on npm between different regions, so all may not see the release immediately.)
- Gitter
- Ethereum JavaScript Community (EJC) Discord
- Depending on release's significance to certain projects, write to:
- Fabio from 0x (@fabioberger)
- Santiago from OpenZeppelin (@spalladino)
- Pedro from WalletConnect (@pedrouid)
- Josh from FunFair (@joshstevens19)
- Truffle, Gnosis, Aragon, Embark, Alchemy, Buidler, Remix