Ansible branches and release workflow Branch workflow for a major release =================================== We have a main branch called devel that's for developing the next version of ansible. Almost all commits land here first and then are cherry-picked to older release branches if necessary. If a release involves a huge change to the code we may create alphas and betas otherwise our first tarball of the next release is a release candidate. Whichever it is, we create a new branch from devel called stable-X.Y at this time. If we're having an Alpha and Beta cycle we freely cherry-pick from devel to stable-X.Y if we feel the commit belongs in the next release. Once we make the release candidate we change the rules slightly. Along with the release candidate we make a branch named tmp-holding-branch-post-X.Y.0. Then we only cherry-pick commits that we consider essential for the next release to stable-X.Y. All other commits that we feel should eventually end up in X.Y.1 or beyond are cherry-picked to tmp-holding-branch-post-X.Y.0. After the release of ansible-X.Y we rebase tmp-holding-branch-post-X.Y.0 onto the current stable-X.Y branch, use git merge --ff-only to merge it onto the tip of stable-X.Y, and then delete tmp-holding-branch-post-X.Y.0. Branch workflow for bugfix releases =================================== During development of a bugfix release we continue to commit first to devel. During this time we cherry-pick any commits we think belong in the bugfix release to the stable-X.Y branch that we had at the end of the major release cycle. We do **not** create a new branch for the X.Y.Z release. At some point we create a release candidate for the X.Y.Z release. At this point we create a branch named tmp-holding-branch-post-X.Y.Z. We then have a choice when cherry-picking a bugfix from devel to this release. If we feel the commit needs to go into this bugfix release (and should trigger a new release candidate) we cherry-pick it to the stable-X.Y branch. If we feel that the commit can wait until the next bugfix release, X.Y.(Z + 1), we cherry-pick it to the tmp-holding-branch-post-X.Y.Z instead. Once ansible-X.Y.Z is released we rebase tmp-holding-branch-post-X.Y.Z onto the current stable-X.Y branch, use git merge --ff-only to merge it onto the tip of stable-X.Y, and then delete tmp-holding-branch-post-X.Y.Z. Playbook to perform releases ============================ TODO: github repository where this lives. TODO: Any caveats for using playbook, information that needs to be filled in manually or choices that need to be made?