From df15a4062a527e14ceef141f81d105665dd6085d Mon Sep 17 00:00:00 2001 From: patrick96 Date: Tue, 22 Sep 2020 22:33:12 +0200 Subject: [PATCH] doc: Write new release workflow We now use OneFlow [1] for releases 3.5.0 and onwards. Closes #1780 [1]: https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow --- doc/dev/release-workflow.rst | 193 +++++++++++++++++++++++++++++++++++ doc/index.rst | 6 ++ 2 files changed, 199 insertions(+) create mode 100644 doc/dev/release-workflow.rst diff --git a/doc/dev/release-workflow.rst b/doc/dev/release-workflow.rst new file mode 100644 index 00000000..faeb1d2f --- /dev/null +++ b/doc/dev/release-workflow.rst @@ -0,0 +1,193 @@ +Release Workflow +================ + +We try to follow `Semantic Versioning `_ in this project. +Patch releases (e.g. ``3.3.X``) contain only bug fixes. Minor releases (e.g. +``3.X.0``) can have backwards-compatible features. And major releases ( +``X.0.0``) can introduce incompatible changes. + +.. note:: + + This document replaces the "`Release Guidelines + `_" on the wiki + that we used between 3.2.0 and 3.4.3. Starting with 3.5.0, we will follow + the workflow described here to publish releases. + +Polybar uses the `OneFlow +`_ +branching model for publishing new releases and introducing hotfixes. + +The way we accept code from contributors does not change: Contributors fork +polybar, commit their changes to a new branch and open a PR to get that branch +merged. +After reviewing and approving the changes, a maintainer "merges" the PR. +"Merging" is done in the GitHub UI by either rebasing or squashing the +changes. +Regular merging is disabled because we do not want merge a merge commit for +every PR. + +This document is mainly concerned with how to properly release a new version of +polybar. +For that reason this might not be of interest to you, if you are not a +maintainer, but feel free to read on anyway. + +Drafting a new Release +---------------------- + +There a two processes for how to draft a new release. The process for major and +minor versions is the same as they both are "regular" releases. +Patch releases are triggered by bugfixes that cannot wait until the next regular +release and have a slightly different workflow. + +Regular Releases (Major, Minor) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Regular releases are created once we find that ``master`` is in a stable state +and that there are enough new features to justify a new release. +A release branch ``release/X.Y.0`` is branched off of a commit on ``master`` +that contains all the features we want in the release, this branch is pushed to +the official repository. +For example for version ``3.5.0`` the branch ``release/3.5.0`` would be created: + +.. code-block:: shell + + git checkout -b release/3.5.0 + +The release branch should typically only exist for at most a few days. + +Hotfix Releases (Patch) +~~~~~~~~~~~~~~~~~~~~~~~ + +A hotfix release is created whenever we receive a fix for a bug that we believe +should be released immediately instead of it only being part of the next regular +release. +Generally any bugfix qualifies, but it is up to the maintainers to decide +whether a hotfix release should be created. + +The hotfix release branch ``hotfix/X.Y.Z`` is created by branching off at the +previous release tag (``X.Y.Z-1``). +For example, if the latest version is ``3.5.2``, the next hotfix will be on +branch ``hotfix/3.5.3``: + +.. code-block:: shell + + git checkout -b hotfix/3.5.3 3.5.2 + +Since the PRs for such bugfixes are often not created by maintainers, they will +often not be based on the latest release tag, but just be branched off +``master`` because contributors don't necessarily know about this branching +model and also may well not know whether a hotfix will be created for a certain +bugfix. + +.. TODO create contributor page that describes where to branch off. And link to + that page. + +In case a PR containing a bugfix that is destined for a patch release is not +branched off the previous release, a maintainer creates the proper release +branch and cherry-picks the bugfix commits. + +.. note:: + + Alternatively, the contributor can also ``git rebase --onto`` to base the + branch off the previous release tag. However, in most cases it makes sense for + a maintainer to create the release branch since they will also need to add a + `Release Commit`_ to it. + +Once the release branch is created and contains the right commits, the +maintainer should follow `Publishing a new Release`_ to finish this patch +release. + +If multiple bugfixes are submitted in close succession, they can all be +cherry-picked onto the same patch release branch to not create many individual +release with only a single fix. +The maintainer can also decide to leave the release branch for this patch +release open for a week in order to possibly combine multiple bugfixes into a +single release. + +Publishing a new Release +------------------------ + +The process for publishing a release is the same for all release types. It goes +as follows: + +* A `Release commit`_ is added to the tip of the release branch. +* A draft PR is opened for the release branch. This PR MUST NOT be merged in + GitHub's interface, it is only here for review, merging happens at the + commandline. +* After approval, the GitHub release publishing tool is used to publish the + release and tag the tip of the release branch (the release commit). +* After the tag is created, the release branch is manually merged into + ``master``. + Here it is vitally important that the history of the release branch does not + change and so we use ``git merge``. We do it manually because using ``git + merge`` is disabled on PRs. + +.. code-block:: shell + + git checkout master + git merge + git push origin + +* After the tag is created, the release branch can be deleted with ``git push + origin :``. +* Work through the `After-Release Checklist`_. + +Here ```` is either a ``release/X.Y.0`` branch or a +``hotfix/X.Y.Z`` branch. + +Release Commit +~~~~~~~~~~~~~~ + +When merging, a release commit must be at the tip of the release branch. + +The release commit needs to update the version number in: + +* ``version.txt`` + +The commit message contains the `Changelog`_ for this release. + +Changelog +~~~~~~~~~ + +Each release should come with a changelog briefly explaining what has changed +for the user. It should generally be separated into 'Deprecations', 'Features', +and 'Fixes', with 'Breaking Changes' listed separately at the top. + +See `old releases `_ for how to +format the changelog. + +Since major releases generally break backwards compatibility in some way, their +changelog should also prominently feature precisely what breaking changes were +introduced. If suitable, maybe even separate documentation dedicated to the +migration should be written. + +After-Release Checklist +~~~~~~~~~~~~~~~~~~~~~~~ + +* Make sure all the new functionality is documented on the wiki +* Mark deprecated features appropriately (see `Deprecations`_) +* Remove all unreleased notes from the wiki (not for patch releases) +* Inform packagers of new release in `#1971 + `_. Mention any dependency + changes and any changes to the build workflow. Also mention any new files are + created by the installation. +* Create a source archive named ``polybar-.tar``. + The repository contains a script that automates this: + +.. code-block:: shell + + ./common/release-archive.sh + +* Update the github release with a download section that contains a link to + ``polybar-.tar`` and its sha256. +* Create a PR that updates the AUR ``PKGBUILD`` files for the ``polybar`` and + ``polybar-git`` packages (push after the ``.tar`` file was created). + + +Deprecations +~~~~~~~~~~~~ + +If any publicly facing part of polybar is being deprecated, it should be marked +as such in the code, through warnings/errors in the log, and by comments in the +wiki. Every deprecated functionality is kept until the next major release and +removed there, unless it has not been deprecated in a minor release before. diff --git a/doc/index.rst b/doc/index.rst index e8678df7..fcd2ce7d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -25,6 +25,12 @@ Welcome to the official polybar documentation. dev/packaging +.. toctree:: + :maxdepth: 1 + :caption: Developer Documentation: + + dev/release-workflow + Getting Help ============