Release management is the process of preparing, packaging, and distributing your software to users. Good release practices ensure that users can easily install and use your software, and that you can track which version they’re running.
Before creating a release, ensure you’ve completed these steps:
CHANGELOG.md is updated with changes since last releaseGitHub Releases is our recommended platform for distributing releases, as most of our projects are already on GitHub.
v1.2.0, see Versioning for guidance on setting version numbers)Release notes should help users understand what has changed and whether they should upgrade. It is good practice to link
to Pull Requests (PRs) for more details, where applicable. Note that noting the #<PR-number> is enough, GitHub will
automatically generate a link to the PR.
Below is an example of a well-written release note:
## What's Changed
### Breaking Changes
- Renamed `process_data()` to `process_dataset()` for clarity (#123)
- Removed deprecated `old_api()` function (deprecated since v1.0.0)
### New Features
- Added support for HDF5 file format (#145)
- New `validate()` method for data verification (#156)
### Bug Fixes
- Fixed memory leak in long-running processes (#134)
- Corrected calculation error in edge cases (#142)
### Documentation
- Added tutorial for new HDF5 functionality
- Improved installation instructions for Windows
### Dependencies
- Updated numpy requirement to >=1.24.0
- Dropped support for Python 3.8 (end of life)
**Full Changelog**: https://github.com/owner/repo/compare/v1.1.0...v1.2.0
GitHub can automatically generate release notes from pull requests:
See the coding standards for more language-specific information:
Automate your release process with GitHub Actions to ensure consistency and reduce manual work.
The following workflow will create a new release on GitHub when a tag is pushed.
## Example with Python package
name: Release
on:
push:
tags:
- "v*"
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create Release
uses: softprops/action-gh-release@v1
with:
generate_release_notes: true
- name: Build and publish to PyPI
if: startsWith(github.ref, 'refs/tags/')
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: $
run: |
pip install build twine
python -m build
twine upload dist/*
Choose a release schedule that balances stability with timely updates:
Combine multiple strategies:
Use pre-releases to get feedback before official releases:
Mark these clearly in your version number (1.0.0-beta.1) and on GitHub (“Set as a pre-release”).
For widely-used research software, consider maintaining LTS versions:
In the version control system, maintain release branches for publicly released versions of the code, so that bug fixes can be efficiently backported to earlier releases.
Example support policy:
When removing features or dropping support for versions:
An appropriate CITATION.cff file should be included in repositories, so that users know how to cite the software.
Also consider publishing the software in an appropriate software meta-journal, such as JOSS, in addition to research publications arising from the project.
Prepare for problems after release: