RELEASING.rst (6381B)
1 Release Procedure 2 ----------------- 3 4 Our current policy for releasing is to aim for a bug-fix release every few weeks and a minor release every 2-3 months. The idea 5 is to get fixes and new features out instead of trying to cram a ton of features into a release and by consequence 6 taking a lot of time to make a new one. 7 8 The git commands assume the following remotes are setup: 9 10 * ``origin``: your own fork of the repository. 11 * ``upstream``: the ``pytest-dev/pytest`` official repository. 12 13 Preparing: Automatic Method 14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 15 16 We have developed an automated workflow for releases, that uses GitHub workflows and is triggered 17 by `manually running <https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow>`__ 18 the `prepare-release-pr workflow <https://github.com/pytest-dev/pytest/actions/workflows/prepare-release-pr.yml>`__ 19 on GitHub Actions. 20 21 The automation will decide the new version number based on the following criteria: 22 23 - If the "major release" input is set to "yes", release a new major release 24 (e.g. 7.0.0 -> 8.0.0) 25 - If there are any ``.feature.rst`` or ``.breaking.rst`` files in the 26 ``changelog`` directory, release a new minor release (e.g. 7.0.0 -> 7.1.0) 27 - Otherwise, release a bugfix release (e.g. 7.0.0 -> 7.0.1) 28 - If the "prerelease" input is set, append the string to the version number 29 (e.g. 7.0.0 -> 8.0.0rc1), if "major" is set, and "prerelease" is set to `rc1`) 30 31 Bug-fix and minor releases 32 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 33 34 Bug-fix and minor releases are always done from a maintenance branch. First, 35 consider double-checking the ``changelog`` directory to see if there are any 36 breaking changes or new features. 37 38 For a new minor release, first create a new maintenance branch from ``main``:: 39 40 git fetch upstream 41 git branch 7.1.x upstream/main 42 git push upstream 7.1.x 43 44 Then, trigger the workflow with the following inputs: 45 46 - branch: **7.1.x** 47 - major release: **no** 48 - prerelease: empty 49 50 Or via the commandline using `GitHub's cli <https://github.com/cli/cli>`__:: 51 52 gh workflow run prepare-release-pr.yml -f branch=7.1.x -f major=no -f prerelease= 53 54 Where ``7.1.x`` is the maintenance branch for the ``7.1`` series. The automated 55 workflow will publish a PR for a branch ``release-7.1.0``. 56 57 Similarly, for a bug-fix release, use the existing maintenance branch and 58 trigger the workflow with e.g. ``branch: 7.0.x`` to get a new ``release-7.0.1`` 59 PR. 60 61 Major releases 62 ^^^^^^^^^^^^^^ 63 64 1. Create a new maintenance branch from ``main``:: 65 66 git fetch upstream 67 git branch 8.0.x upstream/main 68 git push upstream 8.0.x 69 70 2. Trigger the workflow with the following inputs: 71 72 - branch: **8.0.x** 73 - major release: **yes** 74 - prerelease: empty 75 76 Or via the commandline:: 77 78 gh workflow run prepare-release-pr.yml -f branch=8.0.x -f major=yes -f prerelease= 79 80 The automated workflow will publish a PR for a branch ``release-8.0.0``. 81 82 At this point on, this follows the same workflow as other maintenance branches: bug-fixes are merged 83 into ``main`` and ported back to the maintenance branch, even for release candidates. 84 85 Release candidates 86 ^^^^^^^^^^^^^^^^^^ 87 88 To release a release candidate, set the "prerelease" input to the version number 89 suffix to use. To release a ``8.0.0rc1``, proceed like under "major releases", but set: 90 91 - branch: 8.0.x 92 - major release: yes 93 - prerelease: **rc1** 94 95 Or via the commandline:: 96 97 gh workflow run prepare-release-pr.yml -f branch=8.0.x -f major=yes -f prerelease=rc1 98 99 The automated workflow will publish a PR for a branch ``release-8.0.0rc1``. 100 101 **A note about release candidates** 102 103 During release candidates we can merge small improvements into 104 the maintenance branch before releasing the final major version, however we must take care 105 to avoid introducing big changes at this stage. 106 107 Preparing: Manual Method 108 ~~~~~~~~~~~~~~~~~~~~~~~~ 109 110 **Important**: pytest releases must be prepared on **Linux** because the docs and examples expect 111 to be executed on that platform. 112 113 To release a version ``MAJOR.MINOR.PATCH``, follow these steps: 114 115 #. For major and minor releases, create a new branch ``MAJOR.MINOR.x`` from 116 ``upstream/main`` and push it to ``upstream``. 117 118 #. Create a branch ``release-MAJOR.MINOR.PATCH`` from the ``MAJOR.MINOR.x`` branch. 119 120 Ensure your are updated and in a clean working tree. 121 122 #. Using ``tox``, generate docs, changelog, announcements:: 123 124 $ tox -e release -- MAJOR.MINOR.PATCH 125 126 This will generate a commit with all the changes ready for pushing. 127 128 #. Open a PR for the ``release-MAJOR.MINOR.PATCH`` branch targeting ``MAJOR.MINOR.x``. 129 130 131 Releasing 132 ~~~~~~~~~ 133 134 Both automatic and manual processes described above follow the same steps from this point onward. 135 136 #. After all tests pass and the PR has been approved, trigger the ``deploy`` job 137 in https://github.com/pytest-dev/pytest/actions/workflows/deploy.yml, using the ``release-MAJOR.MINOR.PATCH`` branch 138 as source. 139 140 This job will require approval from ``pytest-dev/core``, after which it will publish to PyPI 141 and tag the repository. 142 143 #. Merge the PR. **Make sure it's not squash-merged**, so that the tagged commit ends up in the main branch. 144 145 #. Cherry-pick the CHANGELOG / announce files to the ``main`` branch:: 146 147 git fetch upstream 148 git checkout upstream/main -b cherry-pick-release 149 git cherry-pick -x -m1 upstream/MAJOR.MINOR.x 150 151 #. Open a PR for ``cherry-pick-release`` and merge it once CI passes. No need to wait for approvals if there were no conflicts on the previous step. 152 153 #. For major and minor releases (or the first prerelease of it), tag the release cherry-pick merge commit in main with 154 a dev tag for the next feature release:: 155 156 git checkout main 157 git pull 158 git tag MAJOR.{MINOR+1}.0.dev0 159 git push upstream MAJOR.{MINOR+1}.0.dev0 160 161 #. For major and minor releases, change the default version in the `Read the Docs Settings <https://readthedocs.org/dashboard/pytest/advanced/>`_ to the new branch. 162 163 #. Send an email announcement with the contents from:: 164 165 doc/en/announce/release-<VERSION>.rst 166 167 To the following mailing lists: 168 169 * pytest-dev@python.org (all releases) 170 * python-announce-list@python.org (all releases) 171 * testing-in-python@lists.idyll.org (only major/minor releases) 172 173 And announce it on `Twitter <https://twitter.com/>`_ with the ``#pytest`` hashtag.