-
-
Notifications
You must be signed in to change notification settings - Fork 9
Kroxylicious 1.0 #82
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
base: main
Are you sure you want to change the base?
Kroxylicious 1.0 #82
Changes from all commits
7590872
f5f28bb
93410d2
95b26c3
848d1eb
e11a8b0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,94 @@ | ||||||||||
| # Kroxylicious 1.0 and patch releases | ||||||||||
|
|
||||||||||
| This proposal is for a Kroxylicious 1.0 release, and an improved commitment to making patch releases. | ||||||||||
|
|
||||||||||
| ## Current situation | ||||||||||
|
|
||||||||||
| Kroxylicious already uses [Semantic Versioning][semver], but so far all releases have been `0.x.y` versions. | ||||||||||
|
|
||||||||||
| The project currently promises API compatibilty covering at "least 3 releases, and at least 3 months". | ||||||||||
|
|
||||||||||
| So far, we have done patch releases (i.e. releases like `0.x.1`) only when a new minor release with a fix is not already released, and not imminent. | ||||||||||
|
|
||||||||||
| ## Motivation | ||||||||||
|
|
||||||||||
| Under semantic versioning, releases with a major number of 0 are allowed to break compatibility with previous releases. | ||||||||||
| The software released by project is maturing, and existing users would benefit from having a stronger guarantee about when compatibility between releases might be broken. | ||||||||||
|
|
||||||||||
| At this time there are already a number of users using Kroxylicious in production, however, some potential users might be put off from adopting Kroxylicious by the `0.` version number. | ||||||||||
| A 1.0 release would be a signal that we believe Kroxylicious is production-ready. | ||||||||||
|
|
||||||||||
| ## Proposal | ||||||||||
|
|
||||||||||
| ### What will have a compatibility guarantee? | ||||||||||
|
|
||||||||||
| We propose that the release that was going to be called `0.18.0` instead be called `1.0.0`. | ||||||||||
| By implication of Semantic Versioning, that means we would be committing to not breaking compatibilty until some future `2.0` release. | ||||||||||
| The time of such a `2.0` release is to be decided, but anticipated to be very approximately 12 months after a `1.0` release. | ||||||||||
|
|
||||||||||
| For the avoidance of doubt, this compatibilty guarantee would cover: | ||||||||||
|
|
||||||||||
| 1. Binary compatibility of the Java APIs of the following modules: | ||||||||||
| * `kroxylicious-api` | ||||||||||
| * `kroxylicious-kms` | ||||||||||
| 2. The format of the proxy configuration file, including the configuration of certain plugins provided by the project. Compatibility here means that a released version `1.y` would accept any configuration file that was accepted as valid in any released `1.x` version, where `y > x`. "Valid" means the proxy starts up cleanly. | ||||||||||
| 3. The plugins covered under item 2. are all those implementations of the APIs listed in 1. provided by the project, excluding those implementations in test packages and modules. This implies the contined inclusion of these plugins in the `1.x` series of releases. However, the existing multi-tenancy plugin will be marked as deprecated. | ||||||||||
| 4. The Kubernetes custom resource APIs defined by the kroxylicious-operator. | ||||||||||
|
|
||||||||||
| If the compatibility guarantee is broken we will treat that as a bug. | ||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This only covers compatibility between Kroxylicious versions. I couldn't see anywhere compatibility with regards to Kafka. My understand is that Kroxy always tries to adopt the latest Kafka dependencies. Is that true? Should that be documented? If so it's takes the same Kafka compatibility guarantees as Kafka. |
||||||||||
|
|
||||||||||
| ### Minor and patch branches | ||||||||||
|
|
||||||||||
| The project needs to strike a balance between: | ||||||||||
|
|
||||||||||
| * what the community can sustainably deliver to end users, | ||||||||||
| * what users would like. | ||||||||||
|
|
||||||||||
| The use of the term "the community" in the above is important. | ||||||||||
| The promises being made here are somewhat contingent on support from the community: | ||||||||||
| If you want a bug fixed, but the maintainers do not think it's a priority, you will need to fix it and backport it yourself if you want to see a fix in an official release. | ||||||||||
|
|
||||||||||
| We expect the process to work similarly to the Kafka project itself: | ||||||||||
|
|
||||||||||
| Fixes should always be made to the tip-most branch that is affected by the bug, and subsequently back-ported to the branches for other affected versions. Often, this will mean PRs should be opened against `main`, and back ported to the `1.x` branch, and eventually released under a `1.x.y` tag. | ||||||||||
|
|
||||||||||
| Under semver, patch releases only contain bug fixes. They do not contain new features. | ||||||||||
| We interpret "bug fixes" to include: | ||||||||||
|
|
||||||||||
| * Bug fixes in Kroxylicious itself, where the bug has been fixed, and back ported to the relevant patch branch. | ||||||||||
| * exploitable CVEs in dependencies and transitive dependencies, where a fixed version of the dependency has been released. | ||||||||||
| * exploitable CVEs in Docker images, including in a base image, where a fixed version of the base image has been released. | ||||||||||
|
|
||||||||||
| Note that new features merged to `main` will not be eligible to be backported to a minor release branch. | ||||||||||
|
|
||||||||||
| # Patch releases | ||||||||||
|
|
||||||||||
| Although described in terms of `1.x`, the following would apply `2.0` and future major versions. | ||||||||||
|
|
||||||||||
| We propose to provide patch releases for current `1.x`, plus up to the previous two minor releases. I.e. If the current release is `1.x.y` then we are prepared to release a `1.x.(y+1)`, `1.(x-1).z` and `1.(x-2).z`. | ||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm wondering if the example would be better expressed as a table.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Given what we say about API(java/config) stability why would we offer anything other than roll forward to the latest patch release? I am very wary about building up a branch of un-released commits/fixes. While I accept releases have a cost, ours are fairly cheap and getting cheaper (we keep automating stuff) I think we should aim to release every minor release branch we start. However i'd also advocate for lazy branching around this. Only start a 1.x-1 branch if and when requires
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The bleeding edge is more or less the first time our new code comes into contact with the real world. It's a likely place for performance etc to degrade. Conservative Users may be putting that version through it's paces in test environments before adopting in production, so supporting a couple of minor versions could be a good idea.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @SamBarker the language around the number of maintained minor releases was based on what I thought we had discussed and agreed out of band, but maybe I misunderstood. I added the 6 month thing off my own bat purely as a way of making the commitment less open-ended. I'm happy to change it if that's not the consensus we reached, but we (the maintainers on the hook for actually making good on this) all need to agree what we're willing to do here. Personally I feel that just "roll forward" is not really good enough. It means that users have to accept the additional risk of taking a bunch of unrelated features in order to get a fix. That's just not always acceptable in production, and I think it therefore stands to harm adoption in production environments. Therefore I would advocate for:
We need to decide how many 'live' release branches we want on the go. Obviously the effort here is multiplicative, so we need to be realistic. Apache Kafka generally manages to release two patch releases for each minor (see https://cwiki.apache.org/confluence/display/KAFKA/Future+release+plan), and they're usually spaced about 3-4 months apart. Kafka also aims for 3 So then the final loose end is when and how we stop making releases from a minor branch. Here the Apache Kafka project doesn't really have anything written down. But in practice patches do get merged to minor branches which are never publicly released. However, they are available to those motivated to do their own building and testing. That seems like a reasonable balance to me: The project is not obliged to release them, but the community has the ability (and some motivation) to contribute those patches to the project. cc @k-wall @gracegrimwood @robobario @hrishabhg, because this discussion is kinda central to the whole thing.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
On this point I would value having the release branches created as part of the standard workflow so that we don't have diverging release flows (release latest off main, vs other releases off release branch). Having them exist before we need them will enable community members to PR backports directly to them without having to request a branch creation. It makes things more democratic and approachable if all the processes are in place and Contributors just have to review/approve things and pull the release levers.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm also wondering if it would be manageable to have things more time based. So have a scheme like:
This would give Users an easy to interpret table of dates for when a minor goes EOL. And users would know that they are getting at least that many months of support for the latest minor version. Under this scheme there would always be a transition period when we put out a new minor version where we support two versions, where I think with the current proposal if you didn't release for 6 months the prior minor version would be unsupported on day 0 of the new release. But this could put us on the hook for more than the proposed 3 minor versions of maintenance. It feels like, as Tom said, we will probably slow down the minors due to these new processes and guarantees though. We may end up following Kafka's cadence, to keep up we have to bump Maybe those concerns are manageable by keeping the lengths of time tight enough
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This got suuuuper long, sorry 😅 Here's a sort of TL;DR of my thoughts:
We discussed the idea of maintaining and issuing patches for
I think 6 months is fine as a sort of hard-coded "expiry date" for minor releases. We currently release much more frequently than that, so I reckon it's unlikely any release would hit that deadline anyway. Even if we did let the oldest minor release "expire", having another minor release in there between oldest and latest means users still have a buffer zone to work in, and 6 months seems like plenty of time to arrange a proxy upgrade to a new minor version. We can revisit that number later on if we need to, but I think it's fine.
I fully agree. We can't know every user's environment and risk profile, and we risk alienating potential users if our response to requests for backported fixes is to just install the latest version. I don't think that stance is in the best interests of the project, even if it would mean less maintenance work for us. Besides, if it was feasible for everyone to just roll forward all the time, nobody would make any money selling LTS versions of things 😉
Agreed, starting out with a Patch releases can then be tagged in git as usual but won't get their own release branches. We shouldn't put out patches of patch releases like I think there's still definitely a bigger role for us as maintainers in this process, like urgent backporting of high-severity exploitable CVEs, but otherwise I think this process really should be driven by the people using the proxy on the daily, as they're best placed to know which fixes they need and don't need. We can step in when something that isn't a fix (i.e. a feature) gets suggested, for anything urgent, or for anything that's too complicated to backport, but for the most part I see this as the kind of system that starts to run itself.
Yeah, batching fixes is the way to go. As for timing, I think the we should handle this through proposals, honestly. Maybe not anything as big or elaborate as what we do here in this repo, but having a forum or something (like Slack or GitHub discussions or just raising an issue with a special tag on it) where community members can suggest that they think it's time for a patch release of whatever active minor version and then others can vote on that idea. Obviously for anything high-risk we could just go ahead with creating a patch release anyway, but for everything else this lets us take a more hands-off approach. If, by some chance, that proposal process gets out of hand and folks do start requesting new patch releases every week, then we could look at instituting some kind of limit on how often we will release new patch versions, but that's the kind of bridge we should cross if/when we get to it. I think trying to come up with a schedule for this is a bit of a fool's errand because there will be some times we get to a patch release date and there's nothing worth releasing, and some times when something will show up well ahead of schedule and we'll want to put patches out ASAP. We're better off letting the people who use the proxy determine (for the most part) when new patch releases are required.
I think if we stick to only having branches for minor releases then the number of actively maintained "live" branches comes down to how many minor releases we intend to create new patch releases for. Like I said above, I think the current and the two previous minor releases ( We'll also have to keep in mind what happens when we hit a new major version, but I don't think that's an unnavigable problem, nor a particularly pressing one at this juncture.
I've sort of said this already, but if we're only promising patch releases for the previous two minor versions, then the answer to "when do we stop releasing patches for I think "once we've released
This is what NodeJS does and, to an extent, what Ubuntu does something something pro subscriptions and paid support tiers. I don't dislike this model (quite the opposite actually, as a user it's great) but it feels very strict and rigid given where the project is at currently, and I just don't feel that it's the right fit for us right now. I think it also implies a level of "support" (I don't mean to nitpick on language but I really don't like using this word here, I think we should be calling this "maintenance" because that's what we're actually proposing to do) that I don't think we're trying to offer. It is not within our scope as an open source project to be offering —or appearing to offer— anything close to enterprise support, which is why I think we should be talking about "actively maintained" releases rather than "supported" releases. If we are wanting some kind of tapered maintenance model then we could say something like "version Anyway, I'm off to bed. If you read to the end of this: here, have a cookie 🍪
tombentley marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should it be more like this? (current version + 2 patches or current version, (current version - 1) patch and (current version - 2) patch.
Suggested change
OR
Suggested change
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Holding off any change here while we work though the conversation above. |
||||||||||
| However, the "up to" is limited to 6 months after the initial minor release. | ||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there a distinction between the current latest minor and the 2 prior ones here? I'm wondering if somewhere we should say the latest minor will be bugfix supported beyond 6 months. |
||||||||||
| So if `1.(x-2).0` was released more than 6 months ago, there is no promise to release a `1.(x-2).z`; it will be at the maintainers' discretion. | ||||||||||
| This is not a commitment to either: | ||||||||||
| * fix any particular bug found in `1.x` | ||||||||||
| * nor to release back-ported fixes immediately, because releases have a cost. | ||||||||||
|
|
||||||||||
| When enough bugs have been fixed to justify the effort of doing a release, we will start a release process, creating a patch branch from the tip of the minor branch. | ||||||||||
|
|
||||||||||
| Just because some fixes have been merged to a given patch branch does not imply a patch release needs to be made. For example, if it's been more than 6 months since the initial release from that minor branch. | ||||||||||
|
|
||||||||||
| Users, or potential users, for whom the above commitments are insufficient are advised to find a commercial software vendor who can provide the necessary level of support for Kroxylicious. | ||||||||||
|
|
||||||||||
| ## Affected/not affected projects | ||||||||||
|
|
||||||||||
| This proposal concerns the kroxylicious/kroxylicious github projects, and the releases that originate from it. | ||||||||||
|
|
||||||||||
| ## Compatibility | ||||||||||
|
|
||||||||||
| This is the subject of this proposal and has already been described, above. | ||||||||||
|
|
||||||||||
| ## Rejected alternatives | ||||||||||
|
|
||||||||||
| The only alternative is to stick with `0.x` numbering for some amount time. | ||||||||||
| At the end of the day, the move to 1.0 is more of a subject judgement call than something based on objective criteria. | ||||||||||
|
|
||||||||||
| [semver]: https://semver.org/ | ||||||||||
Uh oh!
There was an error while loading. Please reload this page.