name: Python env: WORKING_DIRECTORY: bindings/python on: pull_request: paths: - 'bindings/python/**' - 'core/**' - 'test-data/**' - '.github/workflows/python.yaml' push: tags: - 'python-v*' permissions: contents: read id-token: write jobs: test: name: Test - ${{ matrix.os }} - py${{ matrix.python }} runs-on: ${{ matrix.os }} defaults: run: working-directory: ${{ env.WORKING_DIRECTORY }} strategy: fail-fast: false matrix: os: [ ubuntu-latest, macos-latest ] python: [ '3.9', '3.13' ] steps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python }} - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Rust cache + sccache uses: ./.github/actions/setup-rust with: shared-key: python-test sccache-bucket: ${{ secrets.SCCACHE_S3_BUCKET }} sccache-region: ${{ secrets.SCCACHE_AWS_REGION }} sccache-role-arn: ${{ secrets.SCCACHE_AWS_ROLE_ARN }} - name: Build and install wheel run: | python -m pip install --upgrade pip maturin maturin build --release --out dist -m Cargo.toml pip install --force-reinstall dist/*.whl shell: bash - name: Run tests run: python -m unittest test_sync test_async shell: bash # The build jobs skip on release events for other components (release-please fires # one `release` event per component; only `python-v*` should build/publish here). wheels: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - os: ubuntu-latest platform: linux target: x86_64 args: --release --out dist --find-interpreter --locked -m bindings/python/Cargo.toml --zig --compatibility manylinux_2_28 manylinux: auto - os: ubuntu-latest platform: linux target: aarch64 args: --release --out dist --find-interpreter --locked -m bindings/python/Cargo.toml --zig --compatibility manylinux_2_28 manylinux: auto - os: windows-latest platform: windows target: x64 architecture: x64 args: --release --out dist --find-interpreter --locked -m bindings/python/Cargo.toml - os: macos-latest platform: macos target: x86_64 args: --release --out dist --find-interpreter --locked -m bindings/python/Cargo.toml - os: macos-latest platform: macos target: aarch64 args: --release --out dist --find-interpreter --locked -m bindings/python/Cargo.toml steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: '3.13' architecture: ${{ matrix.architecture }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} args: ${{ matrix.args }} manylinux: ${{ matrix.manylinux || 'auto' }} sccache: 'true' - name: Upload wheels uses: actions/upload-artifact@v4 with: name: wheels-${{ matrix.platform }}-${{ matrix.target }} path: dist sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: '3.13' - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist -m bindings/python/Cargo.toml - name: Upload sdist uses: actions/upload-artifact@v4 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest environment: release # Publishes only on the release-please GitHub Release for the python component. if: "github.ref_type == 'tag'" needs: [ test, wheels, sdist ] steps: - uses: actions/download-artifact@v4 with: pattern: wheels-* merge-multiple: true - name: Publish to PyPI uses: PyO3/maturin-action@v1 env: MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} with: command: upload args: --skip-existing *