name: Python Dist on: push: tags: - "[0-9]+.[0-9]+.[0-9]+" - "[0-9]+.[0-9]+.[0-9]+.post[0-9]+" - "[0-9]+.[0-9]+.[0-9]+[a-b][0-9]+" - "[0-9]+.[0-9]+.[0-9]+rc[0-9]+" workflow_dispatch: pull_request: workflow_call: inputs: ref: required: true type: string concurrency: group: dist-${{ github.ref }} cancel-in-progress: true defaults: run: shell: bash -eux {0} jobs: build_wheels: name: Build wheels for ${{ matrix.buildplat[1] }} runs-on: ${{ matrix.buildplat[0] }} strategy: # Ensure that a wheel builder finishes even if another fails fail-fast: false matrix: # Github Actions doesn't support pairing matrix values together, let's improvise # https://github.com/github/feedback/discussions/7835#discussioncomment-1769026 buildplat: - [ubuntu-latest, "manylinux_x86_64", "cp3*-manylinux_x86_64"] - [ubuntu-latest, "manylinux_aarch64", "cp3*-manylinux_aarch64"] - [ubuntu-latest, "manylinux_ppc64le", "cp3*-manylinux_ppc64le"] - [ubuntu-latest, "manylinux_s390x", "cp3*-manylinux_s390x"] - [ubuntu-latest, "manylinux_i686", "cp3*-manylinux_i686"] - [windows-2022, "win_amd6", "cp3*-win_amd64"] - [windows-2022, "win32", "cp3*-win32"] - [windows-11-arm, "win_arm64", "cp3*-win_arm64"] - [macos-14, "macos", "cp*-macosx_*"] steps: - name: Checkout pymongo uses: actions/checkout@v6 with: fetch-depth: 0 persist-credentials: false ref: ${{ inputs.ref }} - uses: actions/setup-python@v6 with: cache: 'pip' python-version: 3.11 cache-dependency-path: 'pyproject.toml' allow-prereleases: true - name: Set up QEMU if: runner.os == 'Linux' uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0 with: # setup-qemu-action by default uses `tonistiigi/binfmt:latest` image, # which is out of date. This causes seg faults during build. # Here we manually fix the version. image: tonistiigi/binfmt:qemu-v8.1.5 platforms: all - name: Install cibuildwheel # Note: the default manylinux is manylinux_2_28 run: | python -m pip install -U pip python -m pip install "cibuildwheel>=3.2.0,<4" - name: Build wheels env: CIBW_BUILD: ${{ matrix.buildplat[2] }} run: python -m cibuildwheel --output-dir wheelhouse - name: Assert all versions in wheelhouse if: ${{ ! startsWith(matrix.buildplat[1], 'macos') }} run: | ls wheelhouse/*cp39*.whl ls wheelhouse/*cp310*.whl ls wheelhouse/*cp311*.whl ls wheelhouse/*cp312*.whl ls wheelhouse/*cp313*.whl ls wheelhouse/*cp314*.whl # Free-threading builds: ls wheelhouse/*cp314t*.whl - uses: actions/upload-artifact@v7 with: name: wheel-${{ matrix.buildplat[1] }} path: ./wheelhouse/*.whl if-no-files-found: error make_sdist: name: Make SDist runs-on: macos-latest steps: - uses: actions/checkout@v6 with: fetch-depth: 0 persist-credentials: false ref: ${{ inputs.ref }} - uses: actions/setup-python@v6 with: # Build sdist on lowest supported Python python-version: "3.9" - name: Build SDist run: | set -ex python -m pip install -U pip build python -m build --sdist . - name: Test SDist run: | python -m pip install dist/*.gz cd .. python -c "from pymongo import has_c; assert has_c()" - uses: actions/upload-artifact@v7 with: name: "sdist" path: ./dist/*.tar.gz collect_dist: runs-on: ubuntu-latest needs: [build_wheels, make_sdist] name: Download Wheels steps: - name: Download all workflow run artifacts uses: actions/download-artifact@v8 - name: Flatten directory working-directory: . run: | find . -mindepth 2 -type f -exec mv {} . \; find . -type d -empty -delete - uses: actions/upload-artifact@v7 with: name: all-dist-${{ github.run_id }} path: "./*"