Some of the recent discussion on DPO and discord got me thinking about the release workflow relative to locking branches and creating temporary ones and making some PRs wait through the whole RC phase.
As a result, I've thought of various possible workflows and about what might work well. We've used at least some of these for past releases, though not all. (I don't recall which approach was used for which release.)
Here are the workflows I thought of:
3.X branch | temp branch | critical/docs PRs | other PRs | |
---|---|---|---|---|
1 | stays locked | --- | merged by RM (3.X) | wait until final |
2 | only locked during release | --- | merged by committers (3.X) | wait until final |
3 | stays locked | 3.X-release | merged by committers (3.X-release) cherry-picked by RM (3.X) |
wait until final |
4 | only locked during release | 3.X-release | merged by committers (3.13) cherry-picked by RM (3.X-release) |
merged by committers (3.X) |
5 | stays locked | 3.X.1-temp | merged by committers (3.X.1) cherry-picked by RM (3.X) |
merged by committers (3.X.1) |
With options (1), (2), and (3), a notable challenge is that some PRs must wait months to be merged, once the final release is done.
On top of that, with option (2) the RM has less control over what ends up in the final release. That said, with our group I doubt it would be a problem, and, even if something went wrong, reverting a commit during the RC phase wouldn't be disruptive.
(4) avoids those problems, but introduces a new one: the 3.X.0 (final) release will be made against a commit that doesn't exist in the 3.X branch.
That brings us to (5), which I'm not sure has come up before. It avoids that problem too. That only real downside is that it could be a little awkward for committers.
(Note that I have not considered (more that superficially) the impact on the release manager.)
Below I've sketched out how each of those workflows flows. In each diagram, the sections where the 3.X branch is not locked are indented. A single line (---
) surrounds the parts where 3.X is locked. A double line (===
) surrounds the repeated interactions that take place during the RC phase.
| RM (in 3.X branch) | committers (3.X) |
| ------------------ | --------------------------------- |
| | merge any PRs |
--------------------------------------------------------------
| lock | |
| cut rc1 | |
==============================================================
| | notify RM about critical/docs PRs |
| merge PRs | |
==============================================================
| cut final | |
| unlock | |
--------------------------------------------------------------
| | merge waiting PRs |
| | merge any PRs |
| ------------------ | --------------------------------- |
| RM (3.X) | committers (3.X) |
| ----------------- | ----------------------- |
| | merge any PRs |
---------------------------------------------------
| lock | |
| cut rc1 | |
| unlock | |
===================================================
| | merge critical/docs PRs |
| review merged PRs | |
===================================================
| lock | |
| cut final | |
| unlock | |
---------------------------------------------------
| | merge waiting PRs |
| | merge any PRs |
| ----------------- | ----------------------- |
| RM (3.X) | RM (3.X-release) | committers (3.X) | committers (3.X-release) |
| ------------------- | ----------------- | ----------------- | ------------------------- |
| | | merge any PRs | |
-----------------------------------------------------------------------------------------------
| lock | | | |
| cut rc1 | | | |
| | create (locked) | | |
| | unlock | | |
===============================================================================================
| | | | merge critical/docs PRs |
| cherry-pick commits | | | |
===============================================================================================
| | destroy | | |
| cut final | | | |
| unlock | | | |
-----------------------------------------------------------------------------------------------
| | | merge waiting PRs | |
| | | merge any PRs | |
| ------------------- | ----------------- | ----------------- | ------------------------- |
| RM (3.X) | RM (3.X-release) | committers (3.X) | committers (3.X-release) |
| ----------------- | ------------------- | ----------------- | ------------------------- |
| | | merge any PRs | |
-----------------------------------------------------------------------------------------------
| lock | | | |
| | create (locked) | | |
| | cut rc1 | | |
| unlock | | | |
===============================================================================================
| | | merge any PRs | |
| | | | notify RM for commits |
| | cherry-pick commits | | |
===============================================================================================
| lock | | | |
| | cut final | | |
| merge 3.X-release | | | |
| | destroy | | |
| unlock | | | |
-----------------------------------------------------------------------------------------------
| | | merge any PRs | |
| ----------------- | ------------------- | ----------------- | ------------------------- |
| RM (3.X) | RM (3.X.1-temp) | committers (3.X) | committers (3.X.1-temp) |
| ------------------- | ----------------- | ----------------- | -------------------------- |
| | | merge any PRs | |
------------------------------------------------------------------------------------------------
| lock | | | |
| cut rc1 | | | |
| | create (locked) | | |
| | unlock | | |
================================================================================================
| | | | merge any PRs |
| | | | notify RM for some commits |
| cherry-pick commits | | | |
================================================================================================
| | lock | | |
| cut final | | | |
| merge 3.X.1-temp | | | |
| | destroy | | |
| unlock | | | |
------------------------------------------------------------------------------------------------
| | | merge any PRs | |
| ------------------- | ----------------- | ----------------- | -------------------------- |