-
Notifications
You must be signed in to change notification settings - Fork 2.7k
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
Releases #376
Comments
This is the pattern that I acquired from React Native:
This gives me some control over what is currently "stable" and how to track fixes important for the "stable" branch. Happy to collaborate and improve this. |
@bestander thanks for the brain dump -- that's really useful context. The pattern that's worked really well for me in the past is the pattern that Rust and Ember acquired from Chrome and Firefox ("6 week releases"). To avoid some misconceptions:
The following is an outline of the basic strategy I've seen work in Ember and Rust. For the most part, I'm keeping it pretty abstract, but I'll call out concrete details that I use for examples. For what it's worth, while it might initially seem like a lot of new process, I've found that by applying a little bit of targeted process to the way new features are added and releases are managed, you can take care of a lot of little annoyances in one fell swoop, and the overall level of project-management stress drops quite a bit. (I'm happy to go into more details about why that is; some of it is obvious and some is more emergent) The Basic StrategyFor the most part, all development happens through pull requests. Pull requests are run through CI, so merging a pull request to Feature FlagsIf a pull request adds to the public surface area of Yarn, it must be wrapped in a feature flag. Ideally, all of the relevant functionality would be wrapped in the flag, but if that proves difficult, it's acceptable to wrap just the public entry point (the new flag in a command, the method or function itself, etc.). By default, all feature flags are disabled. In Ember, we specify all active feature flags in features.json, which drives the build process, and a human-readable description in features.md. We also run all of the tests with all-features-on and all-features-off. When we're working on a particularly ambitious change (e.g. Glimmer), we also run additional builds with just that feature on or off. There are a number of nice benefits to adding features through feature flags:
Importantly, bugfixes do not need to be implemented behind feature flags, and can be released immediately if desired. Interestingly, since we have feature flag infrastructure, Ember contributors sometimes put risky bugfixes behind feature flags to isolate them better, but it's not mandatory. Stabilization / The "Go" DecisionOnce a feature has stabilized, the team decides to enable it by default. In Ember, this means changing the feature in features.json to The Beta ReleaseEvery six weeks, the next version of Yarn is released, including any new features that were stabilized during the previous six weeks. The beta branch is then replaced with the current state of the master branch. Because builds are driven by the
For example, if we ship Yarn 1.3, and then during the next six weeks add and stabilize the The idea behind the beta release is that it includes all of the features the team intends to ship with the next production release, and it's ready for serious testing. The Production ReleaseSix weeks after the the beta release, the beta branch becomes the production branch, and the next production version is released. At the same time, the current master becomes the beta branch. This process allows all development to happen via pull requests and the master branch, completely decoupled from decisions about what actually makes it into the releases. In practice, after a release of getting acclimated to feature flags and automated releases, I've seen this happen in the real world: in both Ember and Rust, people work on master, and have separate discussions about what actually gets released. This also has another major benefit: it increases the pool of people who can reasonably contribute to ongoing development without having to participate in (or even understand) the decisions about what precisely is going into the next release. To make it more concrete, here's a sample release schedule.
Bugfixes Can (And Should) Happen AnytimeThe feature-flag and release process is about maintaining stability by having a good process around new surface area added to the public API. Especially early in the lifetime of a project, and especially due to our strict compatibility requirements with npm, it makes a lot of sense to quickly release new bugfix releases as bugs are fixed. It's also important to keep in mind that even "simple bugfixes" can have unintended consequences, and we probably want to make sure that people don't experience rapid churn where many bugfixes break other functionality, only to be fixed again by yet another bugfix. A good CI setup will probably help with this, but we should keep an eye on how people are reporting a feeling of churn. Canary ReleasesIn my experience, the cleanest way to get new releases out to people who are explicitly willing to tolerate churn is to have nightly "canary" releases that always come with the latest green master. This isn't a substitute for making sure that the production and beta releases are up to date with bugfixes, but it can provide another lever in the stability/immediacy tradeoff for tricky situations. It's Fine if Things Aren't PerfectI'm not aware of any project using this style of releases where everything is perfect, with every part automated, and every release precisely hitting the relevant dates. Things happen: people unexpectedly go on vacation, emergencies need an extra day or two to get right, real live humans need to write the CHANGELOG. The key is that targeting automated, regular releases keeps the process disciplined, stable and understandable. To get close, you still have to try hard. It also makes it very easy to communicate with users about what's happening: "Feature X is already in Canary and we expect it to be in 1.6-beta", who can become acclimated to the release rhythm and understand what to expect. Optional: Commit AnnotationsThere is one part of the process that Ember does and I like quite a bit but isn't universal. To make it easy for people to submit bugfixes to master and clearly communicate that they want the bugfix to be backported, they can annotate a commit with An example of a recent commit that fixed an internal bug and asked for it to be backported to beta. We initially automated the process of backporting these changes, assuming CI passes on the relevant target branch, but at some point along the way we lost the automation ("it's fine if things aren't perfect"). It's still a very useful way for contributors to communicate that they would like a commit to be backported, giving someone closer to the release process responsibility for doing the cherry-pick correctly. As we've been around for a while, Ember's philosophy is to avoid risky backports to beta (and especially release), since there's always another release coming six weeks later, and people can use Canary in a pinch, and we're wary of breaking something else by accident. Since Yarn is a much newer project, I expect us to be more willing to aggressively backport fixes while we're still in fast-and-furious compatibility mode. Whew that was long. I'm sure some of that could have been crisper, and I'm sure I've missed some details that are unique to Yarn. The above is my brain dump about how I've seen the process work in the past, and I'm very interested to hear from people whether it sounds good, whether there are aspects of it that would be uniquely hard for Yarn, and whether people have ideas to beef it up. |
@bestander fwiw, I think what you're doing now is more-or-less in line with the braindump I just posted, except that it becomes a little more automated and regular. Let me know if there's anything about your process that doesn't fit in neatly with what I said 😄 |
Maybe I missed this in the giant wall of text but what's the benefit of releasing minor releases on "1.x" instead of bumping a major version every 6 weeks? (bikeshed!) |
Do you think we would have breaking changes every six weeks? And if we did, then what are we doing wrong? |
It's just similar to how Chrome and React and other open source projects version their projects these days. |
Noooooooo.
Chrome has no major versions, because you "can't break the web" (and they assume that the "breaking changes" they do are acceptable). I don't think React makes a breaking change release every 6 weeks? Right? |
@wycats, I like your proposal. Do you have a migration plan in mind? |
@bestander now that we've released, I wanted to quickly revisit this. I agree with @bestander that we should keep closing issues as fast as we get them. Once that slows down (hopefully won't be too long), I think we'll get good mileage out of the original proposal here. I'll bump this again once the fast-and-furious pace tapers off. |
Good idea, Yehuda On 13 October 2016 at 00:16, Yehuda Katz notifications@github.com wrote:
|
I'd just like to support @wycats' idea that real live humans should write the changelog. Since there's no It's fairly easy to add a commit-style message to tags with the annotate ( git tag -a v0.15.0 It's a bit unwieldy at times to include Markdown in tag annotations but the The only thing currently missing from GitHub releases is an easy way to compare commits between one release and another, which is why a compare link within the body of the tag annotation can also be useful: v0.14.0...v0.15.0 They're obviously a lot more noisy than a proper human-curated changelog, but can help suss out changes that might have been omitted from the release notes/changelog. I blabber on at length about this topic on http://keepachangelog.com/en/0.3.0/ if you want to long(er) form. |
It's not just noisy to read an automated tag diff (like v0.22.0...v0.23.2), it's very hard to follow what exactly changed. Some commits include several changes in different parts like #3071 where the short description is just: 0.23.1 cherry-picking I'm a big fan of human-curated You could just start with an empty one from now on, and just make sure that the people that merges PR checks that the author actually updated the changelog. |
I think you have a good point, Luis, generated change list is hard to read.
Do you want to head this initiative and help the project?
It should be safe to try for one release and see if it helps.
…On Thu, 13 Apr 2017 at 20:30, Luis Lobo Borobia ***@***.***> wrote:
@olivierlacan <https://github.com/olivierlacan> @bestander
<https://github.com/bestander>
It's not just noisy to read an automated tag diff (like v0.22.0...v0.23.2
<v0.22.0...v0.23.2>), it's very
hard to follow what exactly changed. Some commits include several changes
in different parts like #3071 <#3071>
where the short description is just: 0.23.1 cherry-picking
I'm a big fan of human-curated CHANGELOG.md file, if you get accustomed
to maintain a CHANGELOG.md file, then the human-curation is distributed
to all developers, being part of the responsibility of each developer to
add its own line there. People that merges pull requests should require
that a corresponding CHANGELOG entry is added to each PR.
You could just start with an empty one from now on, and just make sure
that the people that merges PR checks that the author actually updated the
changelog.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#376 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/ACBdWAb8yGelTCYE-Br6w5XZHYkPcMYMks5rvne5gaJpZM4KCEK3>
.
|
@bestander Sure! I've done that with other projects as well, I'll do it tonight. |
Awesome.
Awaiting for a PR with instructions.
…On 13 April 2017 at 22:37, Luis Lobo Borobia ***@***.***> wrote:
@bestander <https://github.com/bestander> Sure! I've done that with other
projects as well, I'll do it tonight.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#376 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/ACBdWD9T1rpSBTle8bJ7kpngu4UkyFrPks5rvpV9gaJpZM4KCEK3>
.
|
For open source we should get into the habit of having regular releases on a strict schedule. This should allow some easy planning and set expectations for breaking changes ahead of time to users.
cc @bestander who has been doing an awesome job handling releases and @wycats who has thoughts on how to handle this.
The text was updated successfully, but these errors were encountered: