[openstack-dev] [all] [release] How to handle "stable" deliverables releases
thierry at openstack.org
Mon Jun 11 09:53:52 UTC 2018
As some of the OpenStack deliverables get more mature, we need to adjust
our release policies to best handle the case of deliverables that do not
need to be updated that much. This discussion started with how to handle
those "stable" libraries, but is actually also relevant for "stable"
Our current models include cycle-tied models (with-intermediary,
with-milestones, trailing) and a purely cycle-independent model. Main
OpenStack deliverables (the service components that you can deploy to
build an OpenStack cloud) are all "released" on a cycle. Libraries are
typically maintained per-cycle as well. What happens if no change is
pushed to a service or library during a full cycle ? What should we do
1/ Force artificial releases, even if there are no changes
This is the current state. It allows to reuse the exact same process,
but creates useless churn and version number confusion.
2/ Do not force releases, but still create branches from latest releases
In this variant we would not force an artificial re-release, but we
would still create a branch from the last available release, in order to
be able to land future patches and do bugfix or security releases as needed.
2bis/ Like 2, but only create the branch when needed
Same as the previous one, except that rather than proactively create the
stable branch around release time, we'd wait until the branch is
actually needed to create it.
3/ Do not force releases, and reuse stable branches from cycle to cycle
In this model, if there is no change in a library in Rocky, stable/rocky
would never be created, and stable/queens would be used instead. Only
one branch would get maintained for the 2 cycles. While this reduces the
churn, it's a bit complex to wrap your head around the consequences, and
measure how confusing this could be in practice...
4/ Stop worrying about stable branches at all for those "stable" things
The idea here would be to stop doing stable branches for those things
that do not release that much anymore. This could be done by switching
them to the "independent" release model, or to a newly-created model.
While good for "finished" deliverables, this option could create issues
for things that are inactive for a couple cycles and then pick up
activity again -- switching back to being cycle-tied would likely be
My current preference is option 2.
It's a good trade-off which reduces churn while keeping a compatibility
with the system used for more active components. Compared to 2bis, it's
a bit more work (although done in one patch during the release process),
but creating the branches in advance means they are ready to be used
when someone wants to backport something there, likely reducing process
One caveat with this model is that we need to be careful with version
numbers. Imagine a library that did a 1.18.0 release for queens (which
stable/queens is created from). Nothing happens in Rocky, so we create
stable/rocky from the same 1.18.0 release. Same in Stein, so we create
stable/stein from the same 1.18.0 release. During the Telluride cycle
some patches land and we want to release that. In order to leave room
for rocky and stein point releases, we need to skip 1.18.1 and 1.19.0,
and go directly to 1.20.0. I think we can build release checks to ensure
that, but that's something to keep in mind.
 It's never too early to campaign for your favorite T name
Thierry Carrez (ttx)
More information about the OpenStack-dev