BSK Release Guide
This guide describes how Basilisk maintainers prepare, validate, and publish
major and patch releases. In this guide, a major Basilisk release means a
scheduled 2.X.0 feature release, while a patch release means 2.X.Y for
Y > 0.
The release workflows contain the ordering and branch decisions. Detailed commands and procedures are collected under Common Release Tasks so the same instructions can be used for both major and patch releases.
Release Model
The version in docs/source/bskVersion.txt, the release tag, and the commit
being published must agree. Package versions use PEP 440 syntax without a
leading v; Git tags add the leading v.
Release type |
Source branch |
Package version |
Tag location |
Destination |
|---|---|---|---|---|
Major |
|
|
|
PyPI |
Patch |
|
|
Patch branch |
PyPI |
Release candidate |
Branch being validated |
|
Tested commit |
TestPyPI |
Pushing a version tag starts the Publish Wheels GitHub Actions workflow.
Final tags publish to PyPI, while release-candidate and test* tags publish
to TestPyPI.
Release Workflows
Major Release
Use this workflow for a scheduled 2.X.0 release. After publication, finish
the workflow by starting the next beta cycle on develop.
Prepare
Create
feature/v2_X_0fromdevelopafter all intended release content has been merged.Finalize the release notes and known issues for
2.X.0.If a release candidate is required, follow Validate a Release Candidate on the release branch.
Set and verify the final version as
2.X.0.
Validate
Push the release branch and open a PR to
develop.Wait for the
Pull Requestworkflow to pass before merging.
Publish
Merge the release PR into
develop.Merge
developintomaster.Create and push the final tag
v2.X.0frommaster.Wait for the
Publish Wheelsworkflow to finish and verify the published artifacts.
Start the Next Beta Cycle
After the major release is published, prepare develop for the next major
release:
Create a
beta_X_Ybranch fromdevelopfor the next planned release.Set
docs/source/bskVersion.txtto the next beta version, such as2.X.0b0. Do not include a leadingv.Keep the completed release notes under their literal version and date in
docs/source/Support/bskReleaseNotes/2.X.rst. Create the next series page if needed and add it at the top of thebskReleaseNotes.rstindex. At the top of the next series page, add aVersion |release|section containing the active.. include:: ../bskReleaseNotesSnippets/_compiled_latest.rstdirective. Move thebsk-release-currentlabel to this section. Keep only one active release-note snippet include in the documentation so notes appear once.Keep completed known issues in
docs/source/Support/bskKnownIssues/2.X.rstunder their literal version and date. Create the next series page if needed and add it at the top of thebskKnownIssues.rstindex. Add a newVersion |release|section containing.. include:: ../bskKnownIssuesSnippets/_compiled_latest.rst. Move thebsk-known-issues-currentlabel to this section, keeping exactly one active known-issue include.Open a PR from the beta branch to
developand wait for CI to pass before merging.After merging, manually run the
Nightly Wheelsworkflow ondevelopusingworkflow_dispatch. Verify that the nightly package index on GitHub Pages contains the new beta version.
Patch Release
Use this workflow for 2.X.Y after v2.X.0 has been published. Only the
latest 2.X.Y line is maintained on patch/v2_X_x; current development
continues independently on develop.
Prepare
For the first patch in the release line, create
patch/v2_X_xfrom thev2.X.0tag. For later patches, use the existing patch branch based on the latestv2.X.Yrelease.Cherry-pick the approved fixes from
develop. Keep each cherry-pick focused and retain the original commit reference.Finalize the release notes and known issues for
2.X.Y.If a release candidate is required, follow Validate a Release Candidate on the patch branch.
Set and verify the final version as
2.X.Y.
Validate
Push
patch/v2_X_xtoorigin.Manually run the
Pull Requestworkflow onpatch/v2_X_xand wait for all jobs to pass.
Publish
Create and push the final tag
v2.X.Yfrompatch/v2_X_x.Wait for the
Publish Wheelsworkflow to finish and verify the published artifacts.
Close Out
Confirm that every patch fix also exists on
develop. If a fix originated on the patch branch, forward-port it.Keep
patch/v2_X_xavailable for subsequent patches in the same release line.
Common Release Tasks
Set and Verify the Version
The package version is stored in docs/source/bskVersion.txt and read by
pyproject.toml during packaging. Update it manually and use PEP 440 syntax:
Build type |
Package version |
Git tag |
|---|---|---|
Beta |
|
No release tag |
Release candidate |
|
|
Final |
|
|
Before tagging, confirm that the version file, intended tag, and checked-out commit all describe the same release. Commit every version change before creating its tag.
Finalize the Release Notes and Known Issues
Normal PRs contribute release-note snippets under
docs/source/Support/bskReleaseNotesSnippets and known-issue snippets under
docs/source/Support/bskKnownIssuesSnippets. Follow each folder’s README
for when entries are required and how to format them. Maintainers gather,
review, and place finalized content in the appropriate version-series RST files
under bskReleaseNotes/ and bskKnownIssues/. Both collections use the same
compiler; it does not assign entries to releases or delete snippets.
Known issues cover issues affecting tagged releases. An issue introduced and fixed by a commit within the same beta cycle does not need a known-issue entry if it never affected a tagged release. An issue discovered during beta development that also affects a tagged release still needs an entry. Document unresolved issues that will ship in the upcoming tagged release before tagging. Release-note requirements apply separately.
At release time:
Compile the current snippets:
make -C docs snippets
Collect and edit the notes for the release. Put them in
docs/source/Support/bskReleaseNotes/2.X.rstunder a literal version and release date, newest first. For example,2.12.1belongs above2.12.0in2.12.rst;2.13.0belongs in2.13.rst. Create a series page and add it to the index when preparing the first release in that series.Before tagging, sort longer release-note and known-issue lists into topic subsections within the dated release section. Use the topics below in the same order, omitting empty categories. Small patch releases can remain simple bullet lists.
Compatibility and migration
Build, installation, and CI
Simulation framework and module development
Spacecraft dynamics and effectors
Environment, gravity, and ephemerides
Sensors and flight software
MuJoCo and stochastic integration
Visualization and data handling
Documentation, examples, and validation
Use RST subsection headings underlined with
~characters, as in the2.12.0and2.11.0release notes and known issues. If a topic is still long, add more specific subheadings underlined with^, as in the2.12.0known issues for spacecraft dynamics. Place each entry once under its primary topic, keeping feature-specific examples, documentation, and tests with the feature. Put changes requiring users to adapt their code or setup under Compatibility and migration. Edit for clarity and combine related entries where appropriate, preserving migration instructions, RST references, issue numbers, and beta markers. Sorting and editing are maintainer tasks; PR snippets remain individual bullet entries.When finalizing the active development version, replace its
_compiled_latest.rstinclude with the finalized bullet content. Leave the include present but commented if useful for the next development cycle. Retain existing section labels and anchors when finalizing a heading so bookmarks continue to work.In
bskKnownIssues/2.X.rst, replace the active known-issue include with its reviewed content under a literal version and release date, newest first. Create a series page and add it to thebskKnownIssues.rstindex if needed. Add a permanent label such asbsk-known-issues-2-13-0to the finalized section. Retain existing version labels and heading anchors so bookmarks continue to work. Keep unresolved limitations and workarounds documented; archiving an entry does not imply it was resolved.Review the notes for duplicate, internal-only, unclear, or contradictory entries and verify that every RST reference resolves. Reconcile multiple pending descriptions of the same issue or workaround before archiving. Remove provisional entries for issues introduced and fixed entirely within the beta cycle if no tagged release was affected.
After saving the reviewed content, delete only the consumed snippet files from each collection. Preserve each
README.md, the compiler wrapper, samples, and other underscore-prefixed support files.
For a patch release, create dated 2.X.Y sections for the selected patch
notes in bskReleaseNotes/2.X.rst and for the known issues in
bskKnownIssues/2.X.rst, without disturbing newer develop release content.
On the maintenance branch, move bsk-known-issues-current to the newly
finalized known-issue section and bsk-release-current to the new release-note
section. Keep each current label in exactly one location and preserve permanent
version labels on the older sections. This makes the legacy #version-release
bookmarks open the latest patch. When forwarding patch history to develop,
leave its current labels on the active beta sections.
Consume only snippets for the selected patch fixes; do not clear either collection wholesale when it also contains entries for newer work.
Full documentation builds reject nonempty snippet collections with no active include. After finalization, empty collections may have no include. Restore the active includes when starting the next development cycle, before publishing new snippets. Standalone compilation remains available while preparing a release, and single-page previews are exempt from this full-build check.
Each series page starts with a title followed by its release sections. Use this
structure when adding a new series, replacing 2.X with its version series:
Version 2.X Release Notes
========================
.. _bsk-release-current:
Version |release|
-----------------
.. include:: ../bskReleaseNotesSnippets/_compiled_latest.rst
Use the matching structure for a known-issue series page:
Version 2.X Known Issues
=======================
.. _bsk-known-issues-current:
Version |release|
-----------------
.. include:: ../bskKnownIssuesSnippets/_compiled_latest.rst
Move each collection’s current-version label and active include when advancing
to a new series. For another development patch in the same series, add the
active section above the finalized releases in the same file. Keep
Version 1.x and earlier as the last archive link in each index.
Run Clean Local Validation
Run the validation from the release branch or patch branch being tagged:
python conanfile.py --clean --opNav True --mujoco True
python run_all_test.py
make -C docs clean
make -C docs html SPHINXOPTS="-W --keep-going"
The build, test suite, and documentation build must complete without errors or
warnings. See docs/source/Support/User/FAQ.rst for clean-build details and
docs/source/Support/Developer/createHtmlDocumentation.rst for documentation
prerequisites.
Validate a Release Candidate
Use a release candidate when the wheel pipeline or release payload should be tested through TestPyPI before production publication:
Set
bskVersion.txtto2.X.YrcNand commit the change on the branch being validated.Run clean local validation and the appropriate GitHub Actions validation workflow.
Tag the tested commit
v2.X.YrcNand push the tag.Publish Wheelsroutes the artifacts to TestPyPI.Install and validate the TestPyPI artifacts. If changes are required, increment
Nand repeat with a new commit and tag.After the candidate passes, set
bskVersion.txtto2.X.Y, commit the final-version change, and repeat local and CI validation before creating the final tag.
Do not move or reuse a release-candidate tag after it has been pushed.
Create and Push a Release Tag
Create the tag on the exact validated commit: master for a major release
or patch/v2_X_x for a patch release. Push only after confirming the final
version and commit.
git status --short
git tag v2.X.Y
git push origin v2.X.Y
Tag pushes are publication triggers. Treat pushed tags as immutable; if a published version is wrong, correct the problem with a new version rather than moving or reusing the tag.
The Publish Wheels workflow builds all supported wheels and the source
distribution. Do not continue until every job succeeds and the expected
version is available from PyPI or TestPyPI.
Deploy Patch Documentation
Patch tags do not automatically deploy documentation because the patch branch
is neither master nor develop. After publishing a patch:
On the Basilisk Actions page, manually run
Merge to master or developusingpatch/v2_X_x. This deploys the patch documentation at the site root.The root deployment replaces the GitHub Pages contents. Run
Merge to master or developagain usingdevelopto restore the developer documentation under/develop.Verify both the root release documentation and the
/developdocumentation after the workflows finish.
Recover Failed Source-Distribution Validation
If all wheel build and packaging jobs succeeded but Test SDist failed because
of an external dependency download, fix the validation environment on the release
branch and keep the published tag unchanged. The Publish Wheels workflow has
an optional recovery_run_id input for this case:
gh workflow run publish-wheels.yml --ref patch/v2_X_x \
-f destination=pypi -f recovery_run_id=ORIGINAL_RUN_ID
Run this only after reviewing the original failure and the environment fix. The workflow verifies that the original run used the same final tag and commit, that all wheel checks succeeded, and that publication was skipped. It downloads the original, unexpired artifacts, verifies their package versions and platform pairs, and installs and imports the original source distribution with Conan retries and source backups configured. Publication runs only after these checks pass.
This recovery uses the original distributions without rebuilding or modifying them. It cannot repair a source-code defect in the tagged archive or recover a partially published release. A rerun of the original workflow still uses its old workflow definition; dispatch recovery from the branch containing the fix.
Create the GitHub Release
After package publication succeeds:
Open the repository’s Releases page and select Draft a new release.
Select the published
v2.X.Ytag, regardless of which branch contains it.Set the title to
Basilisk v2.X.Y.Add the release notes manually or use GitHub’s generated notes as a starting point. Remove unresolved RST-only markup such as
:ref:roles.Publish the GitHub Release.
Forward-Port Patch Fixes
Never implement the same fix independently on both the patch branch and
develop. Develop it once, then cherry-pick that commit to the other branch.
Do not merge develop wholesale into patch/v2_X_x; maintenance branches
must remain limited to approved fixes for their release line.
Release Safety Rules
Do not create a tag from an uncommitted or unvalidated version change.
Do not move or reuse a pushed release tag.
Do not merge
developwholesale into a maintenance branch.Keep patch cherry-picks small, focused, and traceable to their original commits.
Verify package and documentation publication before announcing a release.