Releasing & Distribution
HyperMesh is a proprietary package distributed through a private index, not public PyPI. This page is the end-to-end release runbook.
What gets shipped
Section titled “What gets shipped”| Artifact | Built by | Contents |
|---|---|---|
hypermesh-X.Y.Z-cp3XX-…-manylinux_…_x86_64.whl | CI (cibuildwheel) | engine .so bundled, no toolchain needed |
hypermesh-X.Y.Z-cp3XX-…-manylinux_…_aarch64.whl | CI (cibuildwheel) | ARM64 build |
hypermesh-X.Y.Z.tar.gz (sdist) | CI / python -m build | source; builds the engine via make on install |
Release steps
Section titled “Release steps”- Bump the version in
pyproject.toml([project].version) following SemVer.__version__is sourced from this at runtime. - Update
CHANGELOG.md— move items from Unreleased into the new version section with the date. - Commit + tag:
Terminal window git commit -am "release: vX.Y.Z"git tag vX.Y.Zgit push origin main --tags - CI publishes automatically. The tag triggers the
publishjob in.github/workflows/ci.yml, which runs lint → type → test → build wheels (cibuildwheel) →twine uploadto the private index.
Manual / local publish
Section titled “Manual / local publish”When you need to publish outside CI (or for a one-off):
# Build + validate only (no upload)./tools/publish.sh --check # or: nox -s publish -- --check
# Upload to your private indexexport TWINE_REPOSITORY_URL="https://pypi.acme.internal/"export TWINE_USERNAME="__token__"export TWINE_PASSWORD="<token>"./tools/publish.sh # or: nox -s publishCredentials can live in ~/.pypirc instead — copy
.pypirc.example and use twine upload -r hypermesh-private dist/*.
Index-specific notes
Section titled “Index-specific notes”Private PyPI / devpi
Section titled “Private PyPI / devpi”export TWINE_REPOSITORY_URL="https://pypi.acme.internal/"export TWINE_USERNAME="__token__"; export TWINE_PASSWORD="<token>"JFrog Artifactory
Section titled “JFrog Artifactory”export TWINE_REPOSITORY_URL="https://acme.jfrog.io/artifactory/api/pypi/hypermesh-pypi"export TWINE_USERNAME="<user>"; export TWINE_PASSWORD="<api-key>"AWS CodeArtifact
Section titled “AWS CodeArtifact”aws codeartifact login --tool twine --domain acme --repository hypermesh# or set TWINE_* manually from: aws codeartifact get-authorization-token ...git+ssh (no index)
Section titled “git+ssh (no index)”Consumers install straight from the repo:
pip install "hypermesh @ git+ssh://git@github.com/acme/hypermesh.git@vX.Y.Z"Installing from the private index
Section titled “Installing from the private index”Point pip at the index and install with the extras you need:
pip install \ --index-url https://pypi.acme.internal/simple/ \ "hypermesh[engine,analytics]"Pin it for a project in pip.conf / requirements.txt:
--index-url https://pypi.acme.internal/simple/hypermesh[engine]==X.Y.ZAir-gapped / offline delivery
Section titled “Air-gapped / offline delivery”For machines with no network, build a self-contained bundle of the wheel/sdist plus every dependency wheel:
./tools/build_offline_bundle.sh "[engine,analytics]"# → hypermesh-offline/ and hypermesh-offline.tar.gzOn the target:
pip install --no-index --find-links ./hypermesh-offline "hypermesh[engine,analytics]"Verifying a release
Section titled “Verifying a release”python -c "import hypermesh as hm; print(hm.__version__)"python tools/wheel_smoke.py # golden query through the bundled engine