Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 56 additions & 1 deletion docs/source/index.rst
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This information is really only for developers doing a release, so doesn't really need to be dumped right on the landing page. I'm just working fast because quite busy. Feel free to help relocate this sensibly.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved to a separate location.

Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,59 @@ Quick example
:hidden:
:maxdepth: 2

api/index
api/index

Process for Making a Release
Copy link
Collaborator Author

@tylerjereddy tylerjereddy Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this is only for a PyPI + GitHub release, which is what I have experience with. conda-forge is a different beast, and I don't currently see a champion for the conda-forge release process in gh-1. As it stands, that probably means it won't happen in the coming week, but feel free to step up and handle (and document) that part of the process.

============================

#. Start preparing the PR that drafts the release notes. This involves manually
scanning all of the merged and appropriately milestoned PRs with an
"enhancement" label, so that we don't miss mentioning new features. For other
merged PRs and closed issues (i.e., bug fixes), the ``tools/gh_lists.py`` script
will capture them in a raw list. The list of authors in the release notes
may be populated by running ``tools/authors.py`` script over the appropriate
commit range. If there are new authors in this release, you may also need
to adjust ``.mailmap`` accordingly to avoid duplication, other issues. Try
to add 2-3 new summary "highlights" at the top of the release notes for
each release. Do not merge the release notes PR into ``main`` branch until
you are ready to proceed with the release process proper.
#. Start preparing the PR to bump the ``main`` branch to the next version
number, but DO NOT merge it until: the above release notes PR has been merged,
the new ``maintenance`` branch has been pushed up. ``maintenance`` branches
are named following this convention: ``maintenance/0.1.x`` for the ``0.1.x``
release series, ``maintenance/0.2.x`` for the ``0.2.x`` release series, and
so on. This allows bug fixes to be backported to maintenance branches while
the ``main`` branch continues to gain new features.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let me know if you want to do it differently--I've been doing it this way for SciPy for almost a decade, so used to it...

#. After pushing the new ``maintenance`` branch up, that branch may need
backport PR(s) for dependency version pins (upper bounds to avoid future breaks),
fixups to release notes, etc.
#. As our project is currently small with few consumers, we will not use release
candidates at this time, and will proceed directly with feature releases. As
a precaution, try to work in a Python environment with the minimum version
of each dependency when performing the release process.
#. Adjust the version number to remove the trailing ``.dev0`` in ``pyproject.toml``.
#. Now create a release commit similar to i.e., ``REL: GFDL 0.1.0 release commit``
based on the current release version, but DO NOT push it yet.
#. Tag the release locally with ``git tag -s <v0.x.y>`` (the ``-s`` ensures
the tag is signed--make sure you are properly setup for signing tags).
#. Continue with building release artifacts.
#. Since we are currently a pure Python project, go ahead and build the source
distribution and binary (wheel) locally: ``python -m build``. If that
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we are a pure Python project for now, I'm pretty sure the wheels you build on any platform, will run just fine on any other platform. If we ever add compiled code, that goes completely out the window of course.

Also, building release artifacts on your local machine really isn't ideal for security. Some notes on this:

  1. We should eventually build the release artifacts in CI and upload them from there, which does get recognized when done properly via trusted releases: https://docs.pypi.org/trusted-publishers/. I just don't have the bandwidth for doing that right now. Feel free to open an issue about that and/or help out...
  2. We should provide the "hashes" of our release artifacts for security reasons. I don't have the bandwidth to set that up at the moment, but it is really just a matter of copying how an upstream project does that (could just "borrow" from SciPy again) and dumping the hashes from the hashing script in to the relnotes. Feel free to open an issue about this and/or help me with it.

One thing I did do--turned on immutable releases for our project, which helps with security a little bit: https://docs.github.com/en/code-security/concepts/supply-chain-security/immutable-releases

succeeds, go ahead and push the release commit to the GFDL repo.
#. Now, start uploading release artifacts (you may need to ask for appropriate
permissions if you are a new release manager). For PyPI, upload first the
portable wheel, and then the sdist. ``twine upload /path/to/*.whl`` and
then ``twine upload /path/to/*.tar.gz``. For the GitHub releases, use
the GUI at https://github.com/lanl/GFDL/releases to create a release and
upload all release artifacts. At this stage you can push up the release
tag so that it may be used for the GitHub release: ``git push origin v0.1.0``.
#. Update the deployed documentation following the release.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this process will be setup by Navamita. GitHub pages has a storage limit that is a problem for some large projects, but is maybe "ok" for us for now. readthedocs is maybe slow and has ads. Each option likely has drawbacks.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will be a in a separate PR

#. For now, we will only announce the release within our small team by email
with a short message and a copy of the release notes.
#. After the release is done, forward port relevant changes to release notes, build
scripts, author name mapping, and tools scripts that were only made on the
``maintenance`` branch back to ``main``.
#. Finally, after the release, create a PR against the ``maintenance`` branch
to draft the release notes skeleton for the next bug fix release on that
branch, and bump to the next ``y`` in the version number (``0.x.y.dev0``)
in ``pyproject.toml``.