Description
Several discussions and threads have made it clear that the existing release policy is not working for a lot of users and developers. At NodeConf Adventure we had a few sessions about this and, with more users than node core developers, we came to very different conclusions than we have in prior threads and TSC meetings.
First, I should lay out the different concerns the release process needs to satisfy.
- We need to take new versions of v8 in a timely manor.
- We need to do real releases (not just nightlies) that are in use.
- If we don't do this we fall too far behind the v8 cycle and can't collaborate effectively.
- There's a growing contingent of users that want to adopt new language features and would like to have access to them on roughly the same schedule Chrome is releasing them.
- We need to release contributions in a timely and usable manor.
- The vast majority of contributions are not breaking changes but patches and feature additions.
- The current schedule for breaking native addons means that most contributions are being released in a version that is not usable by the vast majority of users because the timeline for native addons being updated is longer than our major release cycle.
- We need an incubation phase for these releases to validate there are no breaking changes. The number of breaks we've had in CURRENT leads people to avoid it and actively advocate that people don't run it.
- We need a release line that is extra stable and a way to signal when a breaking release in this line is ready to be adopted. Actual quote: "I won't run a release line that hasn't been in wide use for a year."
- We need LTS releases and an LTS guarantee that is achievable. On a 5 year support timeline this means that we have to support (major releases per year * 5). If we do a six week major cycle that means 43 support lines -- that is not achievable.
One thing that should be clear by now is that users who wish to "adopt new JS language features" cannot rely on native addons. Those two priorities are simply incompatible at this time. We have good ideas about how to improve this in the future but we aren't there yet and v8 is going to break native addons each release for the foreseeable future.
Here's my proposal, laid out by branch.
master branch
Master should release on the same cycle and frequency we have now. Releases should appear in the BETA channel. If a critical bug or regression is found the PR fixing it should be tagged and merged.
incubation period
Master releases appear in the beta channel. If a critical bug is not tagged and merged within the incubation period
the last release older than the incubation period is moved to the CURRENT channel.
next branch
Multiple updates to v8 should appear in the next
branch. Relatively frequent releases should appear in the CANARY channel with increasing alpha version numbers (i.e. 3.0.0-alpha19
). Any breaking changes being considered should also appear in the next
branch.
Approximately once a year the next
branch should be merged in to master
and all the appropriate version numbers kicked over. This is at the discretion of the TSC but should likely happen when there is a good level of confidence in the stability of v8.
LTS branches
When next
merges in to master
we create a new branch for that major release's LTS line (as we do today).
The STABLE channel contains that latest LTS release of the latest major version under LTS.
Website Mockup
---------------------------------------------
| | | | |
| STABLE | CURRENT | BETA | CANARY |
| 0.10.99 | 2.89.4 | 2.91.2 | 3.0 Alpha 14 |
| | | | |
---------------------------------------------
User Expectations
Developers who want to adopt new features will follow the CANARY channel. We can do evangelism around major events in the alpha cycle based on features that land from v8 or other major changes that might land. We should expect this section of the community to slowly move away from any dependence on native modules.
Most people involved in regular core development will sit on the BETA channel. Large institutions and popular open source projects should point their test automation at the BETA channel and encourage their users to adopt the CURRENT channel. The CURRENT major lives for about a year, which is about how long it takes for the entire native ecosystem to "catch up."
Larger production users should track STABLE. When upgrading to a new major release of STABLE the expectation is that all modules will work and have ample testing over the year of being in the CURRENT channel.
Current Versions, Branding and the Convergence.
If we adopt this release process we should scrap our current convergence plan.
Features from 0.12 should converge against io.js master
. master
should remain at 2.x. No breaking changes can be converged in master
and should instead be done on next
.
All release lines should rename to "node.js" as soon as possible and development should move to nodejs/node
as soon as convergence on master is complete.
- STABLE is 0.10.x
- CURRENT and BETA are 2.x
- CANARY is 3.x
I don't know what this means for LTS of node.js 0.12 and io.js 1.x. Maybe we do it because it sends the right message but I don't think that either of these release lines should land in STABLE and we should skip over them because neither will end up going through a year in the CURRENT channel which I believe should be a requirement for this channel.