Skip to main content

Package publishing (eai-supmig)

The eai-supmig Python package is built and published from this repository (ai-workflows/superbuild-workflow).

NameValue
PyPI distributioneai-supmig
Import packageeai_supmig
Console scripteai-supmig
Module runpython -m eai_supmig

Release runbook (changelog, bump script, CI jobs): release-pipeline.md

Package layout

  • Build: PEP 517 setuptools via pyproject.toml
  • Layout: src/eai_supmig/
  • Entry point: eai-supmig = eai_supmig.cli:app
  • Version: eai_supmig.__version__ in src/eai_supmig/__init__.py

Local build and test

python -m venv .venv
# Windows: .venv\Scripts\activate
# Linux/macOS: source .venv/bin/activate
pip install -e ".[dev]"
pytest -q
python -m build
python -m twine check dist/*
eai-supmig doctor --help
python -m eai_supmig --help
python scripts/smoke_install_package.py --dist dist --expected-version 0.1.0 --venv .smoke-venv

Artifacts: dist/*.whl, dist/*.tar.gz

CI pipeline (GitLab)

StageJobWhen
lintruffdevelop / MR
testunitdevelop / MR
buildbuild:packagedevelop / master / MR
buildpackage:buildtags v*.*.*
releasepackage:smoketags
publishpublish:gitlabtags (automatic)
publishpublish:testpypi:branchmanual on develop / master (allow_failure)
publishpublish:testpypitags (automatic)
publishpackage:smoke-testpypiafter TestPyPI on tags
publishpublish:pypimanual on release tag
publishpackage:smoke-pypiafter production PyPI

GitLab PyPI registry

Project registry URL pattern:

https://gitlab.com/api/v4/projects/<PROJECT_ID>/packages/pypi

CI variables:

VariablePurpose
CI_JOB_TOKENBuilt-in; upload to GitLab package registry
TWINE_USERNAMEgitlab-ci-token for GitLab registry
TWINE_PASSWORD$CI_JOB_TOKEN

Upload example (CI job publish:gitlab):

pip install twine
python -m build
python -m twine upload \
--repository-url "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi" \
--username gitlab-ci-token \
--password "${CI_JOB_TOKEN}" \
dist/*

TestPyPI

VariablePurpose
TWINE_PASSWORD_TESTPYPITestPyPI API token (masked; leave unprotected for develop branch jobs)

Branch preview (manual):

python -m twine upload \
--repository-url https://test.pypi.org/legacy/ \
--username __token__ \
--password "${TWINE_PASSWORD_TESTPYPI}" \
dist/*

Tag pipeline uploads automatically, then package:smoke-testpypi installs from TestPyPI before production PyPI is offered.

PyPI (production)

VariablePurpose
TWINE_PASSWORD_PYPIPyPI API token (masked, protected; manual tag job only)
pip install eai-supmig

Release flow (summary)

  1. Curate CHANGELOG.md [Unreleased] on develop.
  2. Green CI on develop.
  3. python scripts/bump_release.py — bumps __version__, finalizes changelog, commits.
  4. Push develop, ff-merge master.
  5. git push origin vX.Y.Z — CI verifies version, smokes wheels, publishes to GitLab + TestPyPI.
  6. Trigger manual publish:pypi when ready for production.

Details, changelog rules, and job table: release-pipeline.md.

Versioning

Use semver. Update version only via scripts/bump_release.py (or match tag to __version__ manually before pushing vX.Y.Z). CI verify_release_version.py rejects mismatched tags.