-
Notifications
You must be signed in to change notification settings - Fork 29.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal: Release Process #1997
Comments
I'm not certain whether LTS should or shouldn't be part of the release process considerations? that is to say, there doesn't seem to be any reasoning to limit a "release process" design with identifying LTS candidates. you could in theory identify any major release as candidate for LTS, regardless of numbering or timing, that could be determined in a separate policy / process. I can also see there's a working group discussing LTS already, so some more clarity hopefully could surface from that side. |
This is what I had thought we could do a few months back but, unfortunately, it isn't quite practical. Users look for an LTS guarantee in anything you ask them to adopt and we are certainly asking people to adopt CURRENT. If you do releases that you ask people to adopt and then drop support shortly after you don't end up accomplishing what LTS is designed to do: create a feeling of safety around adoption of the platform. |
My initial reaction: I'm broadly in favor of this. We might consider changing the names of I'm going to stew on this a bit more (especially the convergence bits), but for now, great work! |
@chrisdickinson I sort of stole the naming convention from FreeBSD for CURRENT and STABLE. It seems to work for them but our community is quite different so we may need to use something else. Also, keep in mind that module authors also need a timeline for dropping support of old releases in their current development so we need something that conveys an expectation to module authors that they should still be actively supporting and testing against whatever we end up calling the STABLE channel. |
I also think that having both "Current" and "Stable" labels as separate things can be confusing, since it's possible to have a "current" stable version and an old stable version (e.g. v0.10.38 vs v0.10.0 or even v0.8.xx). I'm not sure what name(s) would be better though. |
@mikeal I was (a bit cheekily, perhaps) considering calling the "STABLE" channel the "ENTERPRISE" channel. Plus, this lets us start building up a space-/sf-themed set of channels (io.js, enterprise.js, etc, etc. – just need ones for "beta" and "current") 👽 |
I'm not opposed to this.
Perhaps some time in the future we can call one io.js but, at the moment, calling one of them io.js is deeply confusing :) |
I don't disagree with that statement, I guess all I'm saying is: you can create a separate policy for tagging a major release as LTS, regardless of what process you use to issue releases. e.g. the LTS policy can be as simple as: "Every second major release is an LTS release", so: (major releases per year / 2). or perhaps tie LTS with yearly quarters: 4 LTS releases per year * 5 years = 20. |
Does anyone have any opinions on having an LTS release schedule like that of Ubuntu's (currently an LTS release every 2 years)? |
I think the current LTS proposals are widely misunderstood. To be fair, they are also clumsy and confusing. The previous idea would be to widely message that only some lines will be tagged for LTS. |
I think this is mostly because we have been writing them in isolation from the actual release process, which we keep changing and then expecting the LTS folks to catch up. At various points we've externalized LTS needs by saying "the LTS WG will handle that" so we don't have to consider them in the regular release process and effectively treated the LTS WG like a dumping ground for stability concerns. Stability concerns must be a part of the regular process and the LTS WG can find the best way to coordinate the effort required to do STABLE and LTS releases once the regular process, which appreciates the time and effort required to maintain a major release line, shifts the major release cycle. |
I think we should avoid conflating STABLE with LTS. If we consider the Ubuntu community's definition of LTS, it is enterprise focused and not a feature-based / cutting edge release. Using @mikeal's website mockup, it would look like this.
I agree with @mikeal that CURRENT needs to be stable. There is no point in having current releases perceived as beta releases that organizations are afraid to adopt. I like the idea of an incubation period for releases before promoting them to the next channel. I disagree with the need to indicated a stable line that has been in wide use for a year. LTS provides a strong stability guarantee for those who need it. Just because a release line is a year old doesn't mean it conveys any guarantee about how widely adopted and therefore vetted it was, particularly given the rapid rate of io.js releases. An organization that wants to hold off on adopting current releases for a period of time as a matter of policy can certainly do so, but labeling an older release as stable is potentially misleading. Especially with io.js' adoption of semantic versioning, the decision whether to adopt current, remain a minor (or major) version behind, or stick with LTS should be enough for an organization. |
(commenting without having read the bulk of the comments yet, sorry) Can we please remove discussion of LTS from this thread, there is almost zero overlap between the proposal(s) here for LTS and the work that's been happening in the LTS WG (on GitHub exclusively so far). This is a complex topic and requires significant commitment from certain parties that have a stronger interest in LTS than most users (as nice as it sounds to have "stability", it's not the new hotness that everyone really wants to work on, LTS work is going to be a hard, borning, tedious slog that will likely be supported primarily by corporate players with a commercial interest in this area). So rather than allowing this discussion get into fantasy-land and therefore go nowhere can we please, please, please remove LTS from the scope and focus on other aspects of "release" instead. If you are really interested in LTS (and can realistically contribute) then pipe up in the LTS WG--as much as everyone wants to talk about it, it's been difficult to get people who will do the hard work together thus far but we'll be trying again in the coming weeks. |
@rvagg, Confining LTS discussion to the LTS WG makes sense (and I completely agree with LTS being tedious -- and likely supported primarily by commercially interested, corporate players and therefore needing separate consideration). With that being the case, I also understand the need to indicate a "stable" channel as initially presented in @mikeal's mockup. Although I still chafe at the word, there's no doubt in my mind that 0.10.* represents a pretty stable version of Node at this point. I'm not sure at which point I began to think of it as stable, but I suppose it was at some time after it had been been out for a while and gone through a number of updates. So I guess that brings me right back to the original then:
I guess what I hate about "stable" is that it will be used by so many people as a reason for not using current. Maybe we could call it VENERABLE ;) |
Some notes from a recent conversation with @rvagg on IRC.
|
@mikeal, when you say:
what do you mean by "we need to do real releases"? Are you referring to the v8 releases? And when you say:
this means that if a critical bug IS tagged and merged within the incubation period then the previous release is NOT moved to the CURRENT channel and the incubation period is extended by the new BETA fix, correct? Any thoughts on a reasonable incubation period? 10 days? 30 days? |
|
Real releases of Node. It's hard to build a community round nightlies, having releases you can point people at and get them excited about a feature landing help, which is why I think that Alphas are a good idea.
The time that was kicked around at Adventure was 2 weeks. I think we can start there and iterate over time as we learn. |
I'd like to try starting with one week ala npm. I think it was mostly you kicking around the 2 week thing. :) |
1 week sounds even better. |
I think with the pace of things, 1 week makes a lot of sense. |
@mikeal this is confusing, why? |
The current plan calls for us to merge everything for the "next major release" but if we're now saying that we might wait close to a year before a new major we would want to begin putting out new converged node.js releases under the CURRENT channel instead. |
A year between new major versions makes no sense. A year between new LTS releases seems fine. Let's be sure to differentiate. |
That's about how long it takes for the native module ecosystem to catch up, so it sort of does make sense -- assuming that we have a channel where v8 is adopted on a 6 week cycle and used outside of the major cycle (Alpha releases in the CANARY channel). |
Firefox is a good example here. Every 7 versions is a LTS release. But major version bumps every 6 weeks. That's a reasonable model and one we should be following. |
Each one of those 7 releases doesn't break 30% of the websites it tries to render. Those aren't breaking releases -- our problem is that we have major releases with large breaking changes to native modules. |
Relegating up-to-date, security-bugs-fixed JS VMs to CANARY is not tenable. We should not advertise insecure releases. We should advertise LTS, which gets security work done by the LTS community, and we should advertise current major, which is secure and usable.
Yes, that is the definition of major release. |
I agree.
So, there's a little not-so-little problem to solve then. How are we going to version it so that people that want to depend on it or support it alongside "regular" releases, can do so? For example, a I suppose one could stick this all in patch metadata, but that's pretty second class, is there a better way? Can we do like |
Just a crazy (and half baked) idea, but I figured I'd throw it out there. What if the release number was |
@cjihrig I think it would have to be |
@Fishrock123 like I said, this was only half baked. My idea would allow development releases to continue on |
Another half-baked idea. On |
I think the proposal as it stands now should be fairly stable although it would depend on how next/canary is handled. If we have a 6-monthly next -> master merge and a yearly LTS then we should end up with every LTS taking over every second major version number, at some arbitrary minor and patch. If next is simply Anyway, this still seems like bikeshedding to me, perhaps you could open an issue @ https://github.com/nodejs/LTS/ and come along to the next LTS meeting next week to hash this out. We've been reaching out to companies that this would affect and haven't had any feedback on version number concern thus far but perhaps if it's raised as a separate issue over @ LTS it might collect some opinions. |
So the next releases (which, remember, are going to be marketed as "io.js" or "Node.js Future" or something) don't get proper semantic version numbers? Just relagated to the alpha range? That's very disappointing.
|
@domenic I'm not asserting an opinion on |
Thing I mainly care about is having consistently incrementing majors on LTS. Which extends to master because LTS will inherit that. The majors don't even have to be sequential.
Then not forcing master to inherit next's major shouldn't be a problem. It would be even stranger if master followed after something that wasn't even released under the same name. And if we are going to do the whole next have its own release branch thing then I'll have to insist it follows its own release policies. Because that basically means a patch for master has to land in 3 places. That'll get hairy fast, because as amazing as our automation may be human intervention will still be required.
I'm sorry? I tried to be very clear why not having consistent incremental majors isn't practical in terms of user experience, but I have yet to see a rebuttal of why making sure we propagate the all powerful semver is more important. Also I take issue with the fact we're releasing next around V8's schedule. Like it will ever be the only breaking change. But that's for a different discussion.
Before any dismissal of not having consistent majors I would like my discussion points addressed. Which includes issues around using code names for releases. |
It is definitely a problem. Having two release lines with two separate version number trains, which you need a table to correspond, is horrible, especially for developers who want to program constraints or similar. Having next and master share an increasing set of release numbers is done for the same reason we're not just releasing "Node.js 1.0" as the first converged release, but instead going with "whatever io.js is on plus one." Here is a concrete example:
Hopefully the above does that. |
I think I'm starting to come around to @trevnorris' point of view on this. Consider: If Of the three options, (a) means bumping without corresponding changes which violates the semver model, (b) means unpredictable timing which goes against the LTS stability requirements, and (c) means holding major changes until the scheduled merge time. (c) is likely the least bad option. However, this process also means that absolutely no major bumps can occur in This is not a new problem. The version is a shared resource that needs to be synchronized across multiple threads. Some level of synchronization and locking is required in order for it to work. Synchronization means at least someone is going to be unhappy at some point in the process, either by having to wait to have their stuff land, or by artificially and purposefully diverging from semver. We can avoid this by allowing Obviously there are also merges from
Yes, this introduces more overhead as @domenic illustrates, but it allows the There are downsides to any of the approaches we choose, but allowing |
You totally should. It's a breaking change, and we said no breaking changes in master more frequent than every six months. Overall I think your (a), (b), and (c) are not really bad at all. We generally have plenty of breaking changes waiting that can help with (c). The timing on the next -> master merge is probably somewhat flexible (on the order of days or maybe a week), allowing (b) on ocassion. And we might fall back to (a) rarely, but even that's fine per semver spec. |
@domenic ... ok, but allowing
Also, being forced to wait six months to land breaking changes in master just isn't going to work if that breaking change happens to be part of a critical security fix. It would make absolutely no sense for us to land such changes in LTS and |
I mean, it causes all the problems of assuming people build an ecosystem and tools around these tags, instead of doing simple version comparisons. |
As I said, there are downsides to each of the proposed options. We aren't going to avoid that and I doubt we're going to come to a perfect solution. In my opinion tho, separating the versioning and leveraging the equivalency tags just seems like the least bad approach. |
The only way to do this while maintaining proper semver is to stay in the alpha range for The argument here seems polarized but it's actually identical. Both @trevnorris and @domenic are arguing the same thing, that messaging and community building are harder for LTS or I don't think there is a technical argument here but someone can correct me if I'm missing it. It's easier to reason about semver in both code and messaging but modules are, by and large, not restricted to any semver range of the platform. Ok, imagine we're using codenames for each of these lines. Under the @domenic plan those codenames would be how we message each "handoff" from Under the @trevnorris plan the codenames would be used solely for marketing, especially of the Currently I find the @trevnorris plan more compelling. I think that it's easier to deal with the messaging issues in This I think is key point: we expect people taking |
Ok, time to close this issue. PRs and Issues have been filed for the resolved and unresolved parts of this thread:
|
FWIW @nodejs/lts discussed this yesterday and the plan is to have @rvagg and @trevnorris make an updated proposal to discuss / approve this TSC meeting. There are some bits in this currently that do not work well with git. |
Does any of that contradict what is in nodejs/dev-policy#74 ? |
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.
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 thenext
branch.Approximately once a year the
next
branch should be merged in tomaster
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 tomaster
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
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 inmaster
and should instead be done onnext
.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.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.
The text was updated successfully, but these errors were encountered: