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 snippet include in the documentation so notes appear once.In
bskKnownIssues.rst, change the completed release heading to its literal version and create a newVersion |release|section above it for the new beta cycle.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. Maintainers gather, review,
and place the finalized notes in the appropriate version-series RST file;
the snippet compiler does not assign notes to releases. At release time:
Compile the current snippets:
make -C docs release-notes-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 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.0,2.11.0, and2.10.0notes. 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.Add the release date to the corresponding heading in
bskKnownIssues.rst.Review the notes for duplicate, internal-only, or unclear entries and verify that every RST reference resolves.
Delete only the consumed snippet files. Preserve
README.md, the compiler script, the sample, 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.rst, without disturbing newer develop release content.
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
Move the current-release 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 the 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.
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.