docs: document releases and branches in Spack
- [x] Remove references to `master` branch - [x] Document how release branches are structured - [x] Document how to make a major release - [x] Document how to make a point release - [x] Document how to do work in our release projects
This commit is contained in:
parent
11088df402
commit
9ec9327f5a
6 changed files with 405 additions and 11 deletions
26
README.md
26
README.md
|
@ -78,11 +78,27 @@ these guidelines with [Travis CI](https://travis-ci.org/spack/spack). To
|
||||||
run these tests locally, and for helpful tips on git, see our
|
run these tests locally, and for helpful tips on git, see our
|
||||||
[Contribution Guide](http://spack.readthedocs.io/en/latest/contribution_guide.html).
|
[Contribution Guide](http://spack.readthedocs.io/en/latest/contribution_guide.html).
|
||||||
|
|
||||||
Spack uses a rough approximation of the
|
Spack's `develop` branch has the latest contributions. Pull requests
|
||||||
[Git Flow](http://nvie.com/posts/a-successful-git-branching-model/)
|
should target `develop`, and users who want the latest package versions,
|
||||||
branching model. The ``develop`` branch contains the latest
|
features, etc. can use `develop`.
|
||||||
contributions, and ``master`` is always tagged and points to the latest
|
|
||||||
stable release.
|
Releases
|
||||||
|
--------
|
||||||
|
|
||||||
|
For multi-user site deployments or other use cases that need very stable
|
||||||
|
software installations, we recommend using Spack's
|
||||||
|
[stable releases](https://github.com/spack/spack/releases).
|
||||||
|
|
||||||
|
Each Spack release series also has a corresponding branch, e.g.
|
||||||
|
`releases/v0.14` has `0.14.x` versions of Spack, and `releases/v0.13` has
|
||||||
|
`0.13.x` versions. We backport important bug fixes to these branches but
|
||||||
|
we do not advance the package versions or make other changes that would
|
||||||
|
change the way Spack concretizes dependencies within a release branch.
|
||||||
|
So, you can base your Spack deployment on a release branch and `git pull`
|
||||||
|
to get fixes, without the package churn that comes with `develop`.
|
||||||
|
|
||||||
|
See the [docs on releases](https://spack.readthedocs.io/en/latest/developer_guide.html#releases)
|
||||||
|
for more details.
|
||||||
|
|
||||||
Code of Conduct
|
Code of Conduct
|
||||||
------------------------
|
------------------------
|
||||||
|
|
|
@ -27,11 +27,22 @@ correspond to one feature/bugfix/extension/etc. One can create PRs with
|
||||||
changes relevant to different ideas, however reviewing such PRs becomes tedious
|
changes relevant to different ideas, however reviewing such PRs becomes tedious
|
||||||
and error prone. If possible, try to follow the **one-PR-one-package/feature** rule.
|
and error prone. If possible, try to follow the **one-PR-one-package/feature** rule.
|
||||||
|
|
||||||
Spack uses a rough approximation of the `Git Flow <http://nvie.com/posts/a-successful-git-branching-model/>`_
|
--------
|
||||||
branching model. The develop branch contains the latest contributions, and
|
Branches
|
||||||
master is always tagged and points to the latest stable release. Therefore, when
|
--------
|
||||||
you send your request, make ``develop`` the destination branch on the
|
|
||||||
`Spack repository <https://github.com/spack/spack>`_.
|
Spack's ``develop`` branch has the latest contributions. Nearly all pull
|
||||||
|
requests should start from ``develop`` and target ``develop``.
|
||||||
|
|
||||||
|
There is a branch for each major release series. Release branches
|
||||||
|
originate from ``develop`` and have tags for each point release in the
|
||||||
|
series. For example, ``releases/v0.14`` has tags for ``0.14.0``,
|
||||||
|
``0.14.1``, ``0.14.2``, etc. versions of Spack. We backport important bug
|
||||||
|
fixes to these branches, but we do not advance the package versions or
|
||||||
|
make other changes that would change the way Spack concretizes
|
||||||
|
dependencies. Currently, the maintainers manage these branches by
|
||||||
|
cherry-picking from ``develop``. See :ref:`releases` for more
|
||||||
|
information.
|
||||||
|
|
||||||
----------------------
|
----------------------
|
||||||
Continuous Integration
|
Continuous Integration
|
||||||
|
|
|
@ -495,3 +495,370 @@ The bottom of the output shows the top most time consuming functions,
|
||||||
slowest on top. The profiling support is from Python's built-in tool,
|
slowest on top. The profiling support is from Python's built-in tool,
|
||||||
`cProfile
|
`cProfile
|
||||||
<https://docs.python.org/2/library/profile.html#module-cProfile>`_.
|
<https://docs.python.org/2/library/profile.html#module-cProfile>`_.
|
||||||
|
|
||||||
|
.. _releases:
|
||||||
|
|
||||||
|
--------
|
||||||
|
Releases
|
||||||
|
--------
|
||||||
|
|
||||||
|
This section documents Spack's release process. It is intended for
|
||||||
|
project maintainers, as the tasks described here require maintainer
|
||||||
|
privileges on the Spack repository. For others, we hope this section at
|
||||||
|
least provides some insight into how the Spack project works.
|
||||||
|
|
||||||
|
.. _release-branches:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
Release branches
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
There are currently two types of Spack releases: :ref:`major releases
|
||||||
|
<major-releases>` (``0.13.0``, ``0.14.0``, etc.) and :ref:`point releases
|
||||||
|
<point-releases>` (``0.13.1``, ``0.13.2``, ``0.13.3``, etc.). Here is a
|
||||||
|
diagram of how Spack release branches work::
|
||||||
|
|
||||||
|
o branch: develop (latest version)
|
||||||
|
|
|
||||||
|
o merge v0.14.1 into develop
|
||||||
|
|\
|
||||||
|
| o branch: releases/v0.14, tag: v0.14.1
|
||||||
|
o | merge v0.14.0 into develop
|
||||||
|
|\|
|
||||||
|
| o tag: v0.14.0
|
||||||
|
|/
|
||||||
|
o merge v0.13.2 into develop
|
||||||
|
|\
|
||||||
|
| o branch: releases/v0.13, tag: v0.13.2
|
||||||
|
o | merge v0.13.1 into develop
|
||||||
|
|\|
|
||||||
|
| o tag: v0.13.1
|
||||||
|
o | merge v0.13.0 into develop
|
||||||
|
|\|
|
||||||
|
| o tag: v0.13.0
|
||||||
|
o |
|
||||||
|
| o
|
||||||
|
|/
|
||||||
|
o
|
||||||
|
|
||||||
|
The ``develop`` branch has the latest contributions, and nearly all pull
|
||||||
|
requests target ``develop``.
|
||||||
|
|
||||||
|
Each Spack release series also has a corresponding branch, e.g.
|
||||||
|
``releases/v0.14`` has ``0.14.x`` versions of Spack, and
|
||||||
|
``releases/v0.13`` has ``0.13.x`` versions. A major release is the first
|
||||||
|
tagged version on a release branch. Minor releases are back-ported from
|
||||||
|
develop onto release branches. This is typically done by cherry-picking
|
||||||
|
bugfix commits off of ``develop``.
|
||||||
|
|
||||||
|
To avoid version churn for users of a release series, minor releases
|
||||||
|
should **not** make changes that would change the concretization of
|
||||||
|
packages. They should generally only contain fixes to the Spack core.
|
||||||
|
|
||||||
|
Both major and minor releases are tagged. After each release, we merge
|
||||||
|
the release branch back into ``develop`` so that the version bump and any
|
||||||
|
other release-specific changes are visible in the mainline (see
|
||||||
|
:ref:`merging-releases-to-develop`).
|
||||||
|
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Scheduling work for releases
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
We schedule work for releases by creating `GitHub projects
|
||||||
|
<https://github.com/spack/spack/projects>`_. At any time, there may be
|
||||||
|
several open release projects. For example, here are two releases (from
|
||||||
|
some past version of the page linked above):
|
||||||
|
|
||||||
|
.. image:: images/projects.png
|
||||||
|
|
||||||
|
Here, there's one release in progress for ``0.15.1`` and another for
|
||||||
|
``0.16.0``. Each of these releases has a project board containing issues
|
||||||
|
and pull requests. GitHub shows a status bar with completed work in
|
||||||
|
green, work in progress in purple, and work not started yet in gray, so
|
||||||
|
it's fairly easy to see progress.
|
||||||
|
|
||||||
|
Spack's project boards are not firm commitments, and we move work between
|
||||||
|
releases frequently. If we need to make a release and some tasks are not
|
||||||
|
yet done, we will simply move them to next minor or major release, rather
|
||||||
|
than delaying the release to complete them.
|
||||||
|
|
||||||
|
For more on using GitHub project boards, see `GitHub's documentation
|
||||||
|
<https://docs.github.com/en/github/managing-your-work-on-github/about-project-boards>`_.
|
||||||
|
|
||||||
|
.. _major-releases:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Making Major Releases
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Assuming you've already created a project board and completed the work
|
||||||
|
for a major release, the steps to make the release are as follows:
|
||||||
|
|
||||||
|
#. Create two new project boards:
|
||||||
|
|
||||||
|
* One for the next major release
|
||||||
|
* One for the next point release
|
||||||
|
|
||||||
|
#. Move any tasks that aren't done yet to one of the new project boards.
|
||||||
|
Small bugfixes should go to the next point release. Major features,
|
||||||
|
refactors, and changes that could affect concretization should go in
|
||||||
|
the next major release.
|
||||||
|
|
||||||
|
#. Create a branch for the release, based on ``develop``:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git checkout -b releases/v0.15 develop
|
||||||
|
|
||||||
|
For a version ``vX.Y.Z``, the branch's name should be
|
||||||
|
``releases/vX.Y``. That is, you should create a ``releases/vX.Y``
|
||||||
|
branch if you are preparing the ``X.Y.0`` release.
|
||||||
|
|
||||||
|
#. Bump the version in ``lib/spack/spack/__init__.py``. See `this example from 0.13.0
|
||||||
|
<https://github.com/spack/spack/commit/8eeb64096c98b8a43d1c587f13ece743c864fba9>`_
|
||||||
|
|
||||||
|
#. Updaate the release version lists in these files to include the new version:
|
||||||
|
|
||||||
|
* ``lib/spack/spack/schema/container.py``
|
||||||
|
* ``lib/spack/spack/container/images.json``
|
||||||
|
|
||||||
|
**TODO**: We should get rid of this step in some future release.
|
||||||
|
|
||||||
|
#. Update ``CHANGELOG.md`` with major highlights in bullet form. Use
|
||||||
|
proper markdown formatting, like `this example from 0.15.0
|
||||||
|
<https://github.com/spack/spack/commit/d4bf70d9882fcfe88507e9cb444331d7dd7ba71c>`_.
|
||||||
|
|
||||||
|
#. Push the release branch to GitHub.
|
||||||
|
|
||||||
|
#. Make sure CI passes on the release branch, including:
|
||||||
|
* Regular unit tests
|
||||||
|
* Build tests
|
||||||
|
* The E4S pipeline at `gitlab.spack.io <https://gitlab.spack.io>`_
|
||||||
|
|
||||||
|
If CI is not passing, submit pull requests to ``develop`` as normal
|
||||||
|
and keep rebasing the release branch on ``develop`` until CI passes.
|
||||||
|
|
||||||
|
#. Follow the steps in :ref:`publishing-releases`.
|
||||||
|
|
||||||
|
#. Follow the steps in :ref:`merging-releases-to-develop`.
|
||||||
|
|
||||||
|
#. Follow the steps in :ref:`announcing-releases`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _point-releases:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Making Point Releases
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This assumes you've already created a project board for a point release
|
||||||
|
and completed the work to be done for the release. To make a point
|
||||||
|
release:
|
||||||
|
|
||||||
|
#. Create one new project board for the next point release.
|
||||||
|
|
||||||
|
#. Move any cards that aren't done yet to the next project board.
|
||||||
|
|
||||||
|
#. Check out the release branch (it should already exist). For the
|
||||||
|
``X.Y.Z`` release, the release branch is called ``releases/vX.Y``. For
|
||||||
|
``v0.15.1``, you would check out ``releases/v0.15``:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git checkout releases/v0.15
|
||||||
|
|
||||||
|
#. Cherry-pick each pull request in the ``Done`` column of the release
|
||||||
|
project onto the release branch.
|
||||||
|
|
||||||
|
This is **usually** fairly simple since we squash the commits from the
|
||||||
|
vast majority of pull requests, which means there is only one commit
|
||||||
|
per pull request to cherry-pick. For example, `this pull request
|
||||||
|
<https://github.com/spack/spack/pull/15777>`_ has three commits, but
|
||||||
|
the were squashed into a single commit on merge. You can see the
|
||||||
|
commit that was created here:
|
||||||
|
|
||||||
|
.. image:: images/pr-commit.png
|
||||||
|
|
||||||
|
You can easily cherry pick it like this (assuming you already have the
|
||||||
|
release branch checked out):
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git cherry-pick 7e46da7
|
||||||
|
|
||||||
|
For pull requests that were rebased, you'll need to cherry-pick each
|
||||||
|
rebased commit individually. There have not been any rebased PRs like
|
||||||
|
this in recent point releases.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
It is important to cherry-pick commits in the order they happened,
|
||||||
|
otherwise you can get conflicts while cherry-picking. When
|
||||||
|
cherry-picking onto a point release, look at the merge date,
|
||||||
|
**not** the number of the pull request or the date it was opened.
|
||||||
|
|
||||||
|
Sometimes you may **still** get merge conflicts even if you have
|
||||||
|
cherry-picked all the commits in order. This generally means there
|
||||||
|
is some other intervening pull request that the one you're trying
|
||||||
|
to pick depends on. In these cases, you'll need to make a judgment
|
||||||
|
call:
|
||||||
|
|
||||||
|
1. If the dependency is small, you might just cherry-pick it, too.
|
||||||
|
If you do this, add it to the release board.
|
||||||
|
|
||||||
|
2. If it is large, then you may decide that this fix is not worth
|
||||||
|
including in a point release, in which case you should remove it
|
||||||
|
from the release project.
|
||||||
|
|
||||||
|
3. You can always decide to manually back-port the fix to the release
|
||||||
|
branch if neither of the above options makes sense, but this can
|
||||||
|
require a lot of work. It's seldom the right choice.
|
||||||
|
|
||||||
|
#. Bump the version in ``lib/spack/spack/__init__.py``. See `this example from 0.14.1
|
||||||
|
<https://github.com/spack/spack/commit/ff0abb9838121522321df2a054d18e54b566b44a>`_.
|
||||||
|
|
||||||
|
#. Updaate the release version lists in these files to include the new version:
|
||||||
|
|
||||||
|
* ``lib/spack/spack/schema/container.py``
|
||||||
|
* ``lib/spack/spack/container/images.json``
|
||||||
|
|
||||||
|
**TODO**: We should get rid of this step in some future release.
|
||||||
|
|
||||||
|
#. Update ``CHANGELOG.md`` with a list of bugfixes. This is typically just a
|
||||||
|
summary of the commits you cherry-picked onto the release branch. See
|
||||||
|
`the changelog from 0.14.1
|
||||||
|
<https://github.com/spack/spack/commit/ff0abb9838121522321df2a054d18e54b566b44a>`_.
|
||||||
|
|
||||||
|
#. Push the release branch to GitHub.
|
||||||
|
|
||||||
|
#. Make sure CI passes on the release branch, including:
|
||||||
|
* Regular unit tests
|
||||||
|
* Build tests
|
||||||
|
* The E4S pipeline at `gitlab.spack.io <https://gitlab.spack.io>`_
|
||||||
|
|
||||||
|
If CI does not pass, you'll need to figure out why, and make changes
|
||||||
|
to the release branch until it does. You can make more commits, modify
|
||||||
|
or remove cherry-picked commits, or cherry-pick **more** from
|
||||||
|
``develop`` to make this happen.
|
||||||
|
|
||||||
|
#. Follow the steps in :ref:`publishing-releases`.
|
||||||
|
|
||||||
|
#. Follow the steps in :ref:`merging-releases-to-develop`.
|
||||||
|
|
||||||
|
#. Follow the steps in :ref:`announcing-releases`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _publishing-releases:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Publishing a release on GitHub
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
#. Go to `github.com/spack/spack/releases
|
||||||
|
<https://github.com/spack/spack/releases>`_ and click ``Draft a new
|
||||||
|
release``. Set the following:
|
||||||
|
|
||||||
|
* ``Tag version`` should start with ``v`` and contain *all three*
|
||||||
|
parts of the version, .g. ``v0.15.1``. This is the name of the tag
|
||||||
|
that will be created.
|
||||||
|
|
||||||
|
* ``Target`` should be the ``releases/vX.Y`` branch (e.g., ``releases/v0.15``).
|
||||||
|
|
||||||
|
* ``Release title`` should be ``vX.Y.Z`` (To match the tag, e.g., ``v0.15.1``).
|
||||||
|
|
||||||
|
* For the text, paste the latest release markdown from your ``CHANGELOG.md``.
|
||||||
|
|
||||||
|
You can save the draft and keep coming back to this as you prepare the release.
|
||||||
|
|
||||||
|
#. When you are done, click ``Publish release``.
|
||||||
|
|
||||||
|
#. Immediately after publishing, go back to
|
||||||
|
`github.com/spack/spack/releases
|
||||||
|
<https://github.com/spack/spack/releases>`_ and download the
|
||||||
|
auto-generated ``.tar.gz`` file for the release. It's the ``Source
|
||||||
|
code (tar.gz)`` link.
|
||||||
|
|
||||||
|
#. Click ``Edit`` on the release you just did and attach the downloaded
|
||||||
|
release tarball as a binary. This does two things:
|
||||||
|
|
||||||
|
#. Makes sure that the hash of our releases doesn't change over time.
|
||||||
|
GitHub sometimes annoyingly changes they way they generate
|
||||||
|
tarballs, and then hashes can change if you rely on the
|
||||||
|
auto-generated tarball links.
|
||||||
|
|
||||||
|
#. Gets us download counts on releases visible through the GitHub
|
||||||
|
API. GitHub tracks downloads of artifacts, but *not* the source
|
||||||
|
links. See the `releases
|
||||||
|
page <https://api.github.com/repos/spack/spack/releases>`_ and search
|
||||||
|
for ``download_count`` to see this.
|
||||||
|
|
||||||
|
|
||||||
|
.. _merging-releases-to-develop:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Merging back into ``develop``
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Once each release is complete, make sure that it is merged back into
|
||||||
|
``develop`` with a merge commit:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ git checkout develop
|
||||||
|
$ git merge --no-ff releases/v0.15
|
||||||
|
$ git push
|
||||||
|
|
||||||
|
We merge back to ``develop`` because it:
|
||||||
|
|
||||||
|
* updates the version and ``CHANGELOG.md`` on ``develop``.
|
||||||
|
* ensures that your release tag is reachable from the head of
|
||||||
|
``develop``
|
||||||
|
|
||||||
|
We *must* use a real merge commit (via the ``--no-ff`` option) because it
|
||||||
|
ensures that the release tag is reachable from the tip of ``develop``.
|
||||||
|
This is necessary for ``spack -V`` to work properly -- it uses ``git
|
||||||
|
describe --tags`` to find the last reachable tag in the repository and
|
||||||
|
reports how far we are from it. For example:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ spack -V
|
||||||
|
0.14.2-1486-b80d5e74e5
|
||||||
|
|
||||||
|
This says that we are at commit ``b80d5e74e5``, which is 1,486 commits
|
||||||
|
ahead of the ``0.14.2`` release.
|
||||||
|
|
||||||
|
We put this step last in the process because it's best to do it only once
|
||||||
|
the release is complete and tagged. If you do it before you've tagged the
|
||||||
|
release and later decide you want to tag some later commit, you'll need
|
||||||
|
to merge again.
|
||||||
|
|
||||||
|
|
||||||
|
.. _announcing-releases:
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Announcing a release
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
We announce releases in all of the major Spack communication channels.
|
||||||
|
Publishing the release takes care of GitHub. The remaining channels are
|
||||||
|
Twitter, Slack, and the mailing list. Here are the steps:
|
||||||
|
|
||||||
|
#. Make a tweet to announce the release. It should link to the release's
|
||||||
|
page on GitHub. You can base it on `this example tweet
|
||||||
|
<https://twitter.com/spackpm/status/1231761858182307840>`_.
|
||||||
|
|
||||||
|
#. Ping ``@channel`` in ``#general`` on Slack (`spackpm.slack.com
|
||||||
|
<https://spackpm.slack.com>`_) with a link to the tweet. The tweet
|
||||||
|
will be shown inline so that you do not have to retype your release
|
||||||
|
announcement.
|
||||||
|
|
||||||
|
#. Email the Spack mailing list to let them know about the release. As
|
||||||
|
with the tweet, you likely want to link to the release's page on
|
||||||
|
GitHub. It's also helpful to include some information directly in the
|
||||||
|
email. You can base yours on this `example email
|
||||||
|
<https://groups.google.com/forum/#!topic/spack/WT4CT9i_X4s>`_.
|
||||||
|
|
||||||
|
Once you've announced the release, congratulations, you're done! You've
|
||||||
|
finished making the release!
|
||||||
|
|
|
@ -818,7 +818,7 @@ Git
|
||||||
|
|
||||||
Some Spack packages use ``git`` to download, which might not work on
|
Some Spack packages use ``git`` to download, which might not work on
|
||||||
some computers. For example, the following error was
|
some computers. For example, the following error was
|
||||||
encountered on a Macintosh during ``spack install julia-master``:
|
encountered on a Macintosh during ``spack install julia@master``:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
|
|
BIN
lib/spack/docs/images/pr-commit.png
Normal file
BIN
lib/spack/docs/images/pr-commit.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
BIN
lib/spack/docs/images/projects.png
Normal file
BIN
lib/spack/docs/images/projects.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 68 KiB |
Loading…
Reference in a new issue