This directory contains helper scripts to automate the Apache release workflow.
The release process has two phases:
All packaging configuration lives in pyproject.toml:
[build-system] uses flit_core as the build backend[tool.flit.sdist] controls what goes in the source tarballburr/ when flit build --format wheel runsFrom the repo root:
python scripts/release_helper.py <version> <rc-num> <apache-id> [--dry-run] [--build-wheel]
Example:
# Dry run (no git tag or SVN upload) python scripts/release_helper.py 0.41.0 0 myid --dry-run # Real release python scripts/release_helper.py 0.41.0 0 myid # With optional wheel python scripts/release_helper.py 0.41.0 0 myid --build-wheel
What it does:
pyproject.tomldist/ directoryburr/tracking/server/build/ to ensure no pre-built UI in source tarballflit build --format sdist[tool.flit.sdist] include[tool.flit.sdist] excludev{version}-incubating-RC{num} (unless --dry-run)--dry-run)Output:
dist/apache-burr-<version>-incubating.tar.gz — ASF-branded source tarballdist/apache-burr-<version>-incubating.tar.gz.asc — GPG signaturedist/apache-burr-<version>-incubating.tar.gz.sha512 — SHA512 checksumThis simulates what Apache voters and release managers will do when validating the release.
Automated testing:
bash scripts/simulate_release.sh
This script:
/tmp/burr-release-test/Manual testing:
cd /tmp tar -xzf /path/to/dist/apache-burr-<version>-incubating.tar.gz cd apache-burr-<version>-incubating # Verify source contents ls scripts/ # Build scripts should be present ls telemetry/ui/ # UI source should be present ls examples/ # Example directories should be present ls burr/tracking/server/build/ # Should NOT exist (no pre-built UI) # Create clean environment python -m venv venv && source venv/bin/activate pip install -e ".[cli]" pip install flit # Build artifacts and wheel (see step 3) python scripts/build_artifacts.py all --clean ls dist/*.whl deactivate
Alternatively, instead of manually creating the venv and installing burr with pip install, you can use uv and use simplified development workflow of uv you can run the command directly:
uv run scripts/build_artifacts.py all --clean ls dist/*.whl
This will automatically:
.venv directoryburr in editable mode with dev dependency group (that contains cli extra, developer extra and flit package.Next time when you run uv run it will also automatically sync the environment with latest pyproject.toml
The build_artifacts.py script has three subcommands:
python scripts/build_artifacts.py all --clean
This runs both artifacts and wheel subcommands in sequence.
python scripts/build_artifacts.py artifacts [--skip-install]
What it does:
burr/tracking/server/build/ to ensure fresh UI buildpip install -e . (unless --skip-install)burr-admin-build-ui:npm install --prefix telemetry/uinpm run build --prefix telemetry/uiburr/tracking/server/build/ and copies built UI into itburr/tracking/server/build/python scripts/build_artifacts.py wheel [--clean]
What it does:
flitburr/tracking/server/build/ contains UI assetsdist/ (with --clean)flit build --format wheelburr/ directory, including burr/tracking/server/build/burr/ (e.g., telemetry/ui/, scripts/, examples/).whl file was createdOutput: dist/apache_burr-<version>-py3-none-any.whl (includes bundled UI)
Note: Flit normalizes the package name apache-burr to apache_burr (underscore) in the filename.
After building the wheel:
twine upload dist/apache_burr-<version>-py3-none-any.whl
Note: For PyPI, you may want to publish as burr instead of apache-burr. See the dual distribution strategy documentation.
Understanding what goes in each package type:
apache-burr-{version}-incubating.tar.gz)Controlled by: [tool.flit.sdist] in pyproject.toml + release_helper.py cleanup
Includes:
burr/ — Full package source codescripts/ — Build helper scripts (this directory!)telemetry/ui/ — UI source code (package.json, src/, public/, etc.)examples/email-assistant/, examples/multi-modal-chatbot/, etc. — Selected example directoriesLICENSE, NOTICE, DISCLAIMER — Apache license filesExcludes:
burr/tracking/server/build/ — Deleted by release_helper.py before buildtelemetry/ui/node_modules/ — Excluded by [tool.flit.sdist]telemetry/ui/build/, telemetry/ui/dist/ — Excluded by [tool.flit.sdist]docs/, .git/, .github/ — Excluded by [tool.flit.sdist]How it's built:
rm -rf burr/tracking/server/build # Ensure no pre-built UI flit build --format sdist # Build from [tool.flit.sdist] config
apache_burr-{version}-py3-none-any.whl)Controlled by: What exists in burr/ directory when flit build --format wheel runs
Includes:
burr/ — Complete package (all .py files, py.typed, etc.)burr/tracking/server/build/ — Pre-built UI assets (created by build_artifacts.py)burr/tracking/server/demo_data/ — Demo data filesExcludes:
telemetry/ui/ — Not in burr/ packageexamples/ — Not in burr/ package (sdist-only)scripts/ — Not in burr/ package (sdist-only)LICENSE, NOTICE, DISCLAIMER — Not needed in wheel (sdist-only)How it's built:
burr-admin-build-ui # Creates burr/tracking/server/build/ flit build --format wheel # Packages everything in burr/
The same burr/ source directory produces different outputs based on when you build and what format:
sdist (source tarball): Includes external files (scripts/, telemetry/ui/, examples/) via [tool.flit.sdist] config, but excludes burr/tracking/server/build/ because we delete it first.
wheel (binary distribution): Only packages burr/ directory contents, but includes burr/tracking/server/build/ because we create it before building the wheel.