Releasing ========= This document describes how to make a new release of **planegcs**. Overview -------- Releases are built using `cibuildwheel `_ in GitHub Actions and published to PyPI. The workflow is triggered manually from the GitHub Actions UI. What gets built: * **Platforms:** Linux (manylinux, x86_64) and Windows (x86_64) * **Python versions:** 3.12 and 3.13 * **Artifacts:** platform wheels + source distribution (sdist) Step-by-step release process ---------------------------- The ``release.sh`` script automates the local steps (version bump, commit, tag, push). Run it from the repository root: .. code-block:: bash ./release.sh where ```` is the argument passed to ``uv version``. We roughly follow `Semantic Versioning `_: * **MAJOR** — incompatible API changes * **MINOR** — new functionality, backwards-compatible * **PATCH** — backwards-compatible bug fixes The script will: 1. Check that the working tree is clean and you are on ``main``. 2. Bump the version in ``pyproject.toml``. 3. Commit the change and push to ``origin main``. 4. Create a ``vX.Y.Z`` tag and push it. 5. Open the GitHub Actions workflow page (or print the URL) so you can trigger the build. Triggering the release workflow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ After the script finishes, trigger the build on GitHub Actions: 1. Go to https://github.com/spookylukey/planegcs/actions/workflows/release.yml (the script will try to open this for you). 2. Click **Run workflow**. 3. Choose the ``main`` branch. 4. Click **Run workflow**. The workflow will: * Build wheels for Linux and Windows. * Build a source distribution. * Run the test suite against each wheel. * If ``upload_to_pypi`` was ``true``, publish everything to PyPI. PyPI authentication ------------------- The publish step uses **PyPI trusted publishing** (OpenID Connect). This requires one-time setup on PyPI: 1. Go to https://pypi.org/manage/project/planegcs/settings/publishing/ 2. Add a new **GitHub** trusted publisher: * **Owner:** ```` (or your GitHub org/username) * **Repository:** ``planegcs`` * **Workflow name:** ``release.yml`` * **Environment name:** ``pypi`` Once configured, the workflow can publish without any API tokens or passwords. .. note:: If you prefer to use a PyPI API token instead of trusted publishing, store the token as a GitHub Actions secret named ``PYPI_API_TOKEN`` and replace the publish step in ``.github/workflows/release.yml`` with: .. code-block:: yaml - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} Troubleshooting --------------- **Wheels fail to build on Windows** Check that ``vcpkg`` can install the dependencies. The GitHub Actions ``windows-latest`` runner has ``vcpkg`` pre-installed. The workflow runs ``vcpkg install eigen3:x64-windows boost-graph:x64-windows boost-math:x64-windows`` before building. **Wheels fail to build on Linux** The manylinux container uses ``yum``. The ``before-all`` command tries ``yum`` first, then falls back to ``apt-get``. **Tests fail in cibuildwheel** cibuildwheel installs the built wheel into a fresh virtualenv and runs ``pytest {project}/tests -x``. Check the test output in the workflow logs. **Version mismatch** The version lives in ``pyproject.toml``. The ``release.sh`` script uses ``uv version --bump`` to update it automatically. File reference -------------- * ``release.sh`` — automates version bump, commit, tag, and push * ``.github/workflows/release.yml`` — the release workflow * ``.github/workflows/ci.yml`` — CI workflow (runs tests on push/PR) * ``pyproject.toml`` — build config including ``[tool.cibuildwheel]`` settings * ``CMakeLists.txt`` — CMake build (cross-platform, supports MSVC and GCC/Clang)