How to cut a new buildozer release. Maintainer-facing.
__version__ in buildozer/__init__.py is the
single source of truth. setup.py reads it via a regex
(find_version()); GitHub Actions reads it from the pushed
tag. There is no MANIFEST.in, no PEP 621 metadata in pyproject.toml,
and no version-bump tooling, edit the string directly.
The post-release convention is to bump to a .devN suffix on master
(e.g. after releasing 1.5.0, master moved to 1.5.1.dev0 in commit
0689513).
On master, before tagging:
-
Verify CI is green. Latest run of every workflow on
master:gh run list --branch master --limit 8
Tests(the Python 3.8–3.14 matrix),iOS,Android Integration,Docker, andPyPI release(build +twine check, no upload on non-tag pushes) should all showsuccess. -
Update
__version__inbuildozer/__init__.pyto the target version (e.g.1.5.1), drop the.devNsuffix. -
Regenerate
CHANGELOG.mdwith github-changelog-generator:github_changelog_generator --user kivy --project buildozer --future-release 1.5.1
Review the diff, prune noise as needed, and commit.
-
Refresh Trove classifiers in
setup.py(classifiers=[...]) so theProgramming Language :: Python :: 3.xentries match the CI matrix in.github/workflows/test_python.yml. -
Land steps 2–4 as a PR titled e.g.
Release 1.5.1.
After the release PR is merged:
git fetch origin
git checkout master
git pull --ff-only
git tag 1.5.1
git push origin 1.5.1The tag push triggers .github/workflows/pypi-release.yml, which:
- runs
python -m build(sdist + wheel), - runs
twine check dist/*, - uploads to PyPI via
pypa/gh-action-pypi-publishusing thepypi_passwordrepository secret. The publish step is gated onstartsWith(github.event.ref, 'refs/tags').
The same push also re-runs .github/workflows/docker.yml, which
publishes kivy/buildozer:latest to DockerHub and
ghcr.io/kivy/buildozer:latest to GHCR (the publish gate is
refs/heads/master OR refs/tags/*).
Tag naming convention: bare 1.5.1 (no v prefix), matching every
release tag from 1.0 onward.
-
Verify the PyPI page: https://pypi.org/project/buildozer/ should show the new version. Confirm with
pip install buildozer==1.5.1in a clean venv. -
Create a GitHub Release via the web UI: https://github.com/kivy/buildozer/releases/new. Select the pushed tag, click Generate release notes to auto-fill the title and body from merged PRs, then Publish release.
-
Announce the release in the Kivy Discord
#announcementschannel: https://discord.com/channels/423249981340778496/490505571271704577. -
Bump master back to dev: open a follow-up PR setting
__version__ = '1.5.2.dev0'(or1.6.0.dev0if the next release will be a minor bump).
| Secret | Used by | Purpose |
|---|---|---|
pypi_password |
pypi-release.yml |
PyPI API token for the upload step |
DOCKERHUB_USERNAME, DOCKERHUB_TOKEN |
docker.yml |
DockerHub login + image push, README sync |
GITHUB_TOKEN |
docker.yml |
GHCR push (provided implicitly by Actions) |
- Versioned Docker tags:
docker.ymlonly publishes:latest. Nokivy/buildozer:1.5.1image is produced. - CHANGELOG generation: semi-automated via
github-changelog-generator(run locally, commit the result). - GitHub Release object: manual (step 2 above).
- Discord announcement: manual (step 3 above).
- Post-release dev bump: manual (step 4 above).