Azure / azure-functions-host

The host/runtime that powers Azure Functions
https://functions.azure.com
MIT License
1.92k stars 441 forks source link

Difference between various release tracks (~4.1000, ~4.800, ~4.30) #10374

Open joelverhagen opened 1 month ago

joelverhagen commented 1 month ago

Is your question related to a specific version? If so, please specify:

4.x versions

What language does your question apply to? (e.g. C#, JavaScript, Java, All)

All

Question

I use this repository for a custom hosting scenario (running Azure Functions on spot VMSS). I am currently using v4.32.2. This version is working great for me.

I am curious about the various release tracks (trains) that I see on the GitHub releases page: https://github.com/Azure/azure-functions-host/releases

I see several patterns for 4.x:

What are the differences between these tracks? Are these all mutually compatible? I seems not at least due to the in-proc vs flex differentiation in the release branch name.

What are the release trains that this repository produces, within the 4.x major release?

I am uncertain on how to interpret these releases, based on SemVer definitions. Apologies if I missed a document. I couldn't find anything on the public Microsoft docs or on the wiki.

cataggar commented 1 month ago

I've been told to use the ~4.800 for in-process .NET 8 support and it is working. I am also using a custom hosting scenario and was going to ask about this too.

mattchenderson commented 1 month ago

We are in a transition state with some of our branching and releases, so you are partially seeing that. It's going to change further, but as it does, this should get simpler. There is some conscious violation of semantic versioning at play in those version numbers themselves. It's not an ideal solution, but they help us keep track of specific variants throughout the system as we make these changes. The different version bands almost indicate separate artifacts in terms of how we leverage them.

The question of which to use depends on if you need the in-process model or you need any of the other out-of-process language workers (Java, Node, PowerShell, Python, and the isolated worker model for .NET). For now, 4.XX serves both groups. But longer-term, if you need the in-process model, you'll need to use the 4.6XX and 4.8XX versions (for .NET 6 and .NET 8, respectively). If not, you'll want the 4.10XX version, which only supports the out-of-process language workers.

The 4.10XX version will eventually replace the 4.XX version. Our intent is that work for it will be against the dev branch and be released through the release/4.x branch. We're not there yet. The reason you see this version today is that we took the opportunity with Flex Consumption as a new preview SKU to "jump ahead" and begin validating some of the changes. At the time of this writing, it is only available in that SKU, but it will go to the others as well, replacing where you se 4.XX there. Once it's established throughout the rest of the system, we will stop releasing 4.XX versions. We chose the "4.10XX" form so that, at that time, the one to use will more clearly be the highest minor version number, as one would normally expect.

Framing it in terms of release branches, this means you can focus on release/4.x for out-of-process langauge workers and release/in-proc for the in-process model. You can safely ignore release/flex - that's just something we're using tactically in the interim to support the Flex Consumption preview, and it will not be kept around long-term.

We currently require PRs to the dev branch to assert if they also require a backport to the in-proc branch. dev is where we want to line things up for that 4.10XX. However, you'll notice that in-proc currently builds 4.XX, 4.6XX, and 4.8XX. 4.XX and 4.6XX are largely the same thing at the moment.

We are keeping the releases aligned along the traditional minor version. For example, 35 is the most recent, and it has a corresponding 4.35, 4.635, 4.835, and 4.1035. So, if you don't care about the in-process model, I'd say 4.35 or 4.1035 are fine options (prefer 4.35 for now). If you care about the in-process model for .NET 6, you could use 4.35 or 4.635 (prefer 4.635), and if you care about the in-process model for .NET 8, you'd need to use 4.835.

I hope that helps! I'll mark this issue as answered but leave it open for now in case anyone has additional questions.