diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index c8e81d8c..28e5fc51 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -97,3 +97,58 @@ jobs: with: name: symforce-wheels delete-merged: true + + publish-to-pypi: + name: Publish Python 🐍 distribution 📦 to PyPI + strategy: + matrix: + package: [symforce, symforce-sym, skymarshal] + if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes + needs: + - merge-wheel-artifacts + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://pypi.org/p/${{ matrix.package }} + + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: symforce-wheels + path: dist/ + pattern: ${{ matrix.package }}-* + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + publish-to-testpypi: + name: Publish Python 🐍 distribution 📦 to TestPyPI + strategy: + matrix: + package: [symforce, symforce-sym, skymarshal] + needs: + - merge-wheel-artifacts + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/${{ matrix.package }} + + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + pattern: ${{ matrix.package }}-* + - name: Publish distribution 📦 to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ \ No newline at end of file diff --git a/docs/development.rst b/docs/development.rst index 777c3473..697b1ce1 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -99,6 +99,10 @@ To set the symbolic API, you can either use :func:`symforce.set_symbolic_api()` Building wheels ************************************************* +Wheels are built automatically for pushes to the main branch, by the ``build_wheels`` GitHub +Actions workflow. Previous runs of this workflow will have the built wheels available as an +artifact. The workflow can also be run manually on a branch. + You should be able to build Python wheels of symforce the standard ways. We recommend using ``build``, i.e. running ``python3 -m build --wheel`` from the ``symforce`` directory. By default, this will build a wheel that includes local dependencies on the ``skymarshal`` and ``symforce-sym`` @@ -107,12 +111,6 @@ typically want to set the environment variable ``SYMFORCE_REWRITE_LOCAL_DEPENDEN release version when building, and also run ``python3 -m build --wheel third_party/skymarshal`` and ``python3 -m build --wheel gen/python`` to build wheels for those packages separately. -For SymForce releases, all of this is handled by the ``build_wheels`` GitHub Actions workflow. This -workflow is currently run manually on a commit, and produces a ``symforce-wheels.zip`` artifact with -wheels (and sdists) for distribution (e.g. on PyPI). It doesn't upload them to PyPI - to do that -(after verifying that the built wheels work as expected) you should download and unzip the archive, -and upload to PyPI with ``python -m twine upload [--repository testpypi] --verbose *``. - ************************************************* Adding new types *************************************************