name: Publish to PyPI on: push: tags: - 'v[0-9]+.[0-9]+.[0-9]+*' workflow_dispatch: jobs: build_and_publish: name: Build and Publish All Wheels runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] target: [x86_64] steps: - uses: actions/checkout@v4 # Only setup python for non-linux, or let maturin handle linux via docker - name: Set up Python if: runner.os != 'Linux' uses: actions/setup-python@v5 with: python-version: '3.12' # Note: On Windows/Mac, to build for multiple python versions, # you usually need multiple setup-python steps or a matrix of python versions. # But for now, let's at least get the artifacts downloading correctly. # Ideally, you remove this and let maturin find python, but GitHub runners # might only have one default. - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: stable - name: Build wheel uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} manylinux: auto # This triggers the Docker container on Linux for multi-python builds command: build args: --release --out dist --find-interpreter - name: Upload wheel artifact uses: actions/upload-artifact@v4 with: name: wheel-${{ matrix.os }}-${{ matrix.target }} path: dist/*.whl publish: name: Publish All Wheels needs: [build_and_publish] runs-on: ubuntu-latest steps: - name: Install maturin run: pip install maturin # FIX: Use merge-multiple to flatten everything into 'dist' automatically - name: Download ALL wheels uses: actions/download-artifact@v4 with: path: dist pattern: wheel-* merge-multiple: true - name: List Files (Debug) run: ls -la dist - name: Upload to PyPI env: MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} run: | maturin upload --skip-existing --non-interactive dist/*