Skip to content

BLD: test the Python 3.13 wheels #697

BLD: test the Python 3.13 wheels

BLD: test the Python 3.13 wheels #697

Workflow file for this run

name: Release
on:
push:
branches:
- main # just build the sdist & wheel, skip release
tags:
- "v*"
pull_request: # also build on PRs touching files that affect building sdist / wheels
paths:
- ".github/workflows/release.yml"
- "ci/**"
- "MANIFEST.in"
- "pyproject.toml"
- "setup.py"
workflow_dispatch:
# cancel running jobs on new commit to PR
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
build-sdist:
name: Build pyogrio sdist
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Build a source tarball
run: |
python -m pip install --upgrade pip
python -m pip install build setuptools
python -m build --sdist
- uses: actions/upload-artifact@v4
with:
name: pyogrio-sdist
path: ./dist/*.tar.gz
retention-days: 5
compression-level: 0
test-sdist:
name: Test sdist
needs: [build-sdist]
runs-on: ubuntu-latest
container:
image: "ghcr.io/osgeo/gdal:ubuntu-small-3.9.2"
steps:
- name: Install packages
run: |
apt-get update && apt-get install -y build-essential python3-dev
- name: Create virtual environment
# install uv and use it to create a virtual environment, then add it to
# environment variables so that it is automatically activated and can be
# used for tests below
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
. $HOME/.cargo/env
uv venv .venv
echo "VIRTUAL_ENV=.venv" >> $GITHUB_ENV
echo "$PWD/.venv/bin" >> $GITHUB_PATH
- name: Download sdist from artifacts
uses: actions/download-artifact@v4
with:
name: pyogrio-sdist
path: wheelhouse
- name: Build from sdist and install test dependencies
shell: bash
run: |
uv pip install --no-cache wheelhouse/*.tar.gz
uv pip install pytest pandas pyproj shapely>=2
uv pip install --no-deps geopandas
uv pip list
- name: Run tests
shell: bash
# virtual environment is automatically activated
run: |
cd ..
uv run python -c "import pyogrio; print(f'GDAL version: {pyogrio.__gdal_version__}\nGEOS version: {pyogrio.__gdal_geos_version__}')"
uv run python -m pytest --pyargs pyogrio.tests -v
build-wheels-linux:
name: Build wheels on Linux
runs-on: "ubuntu-latest"
strategy:
fail-fast: false
matrix:
include:
# use manylinux2014 for older glibc platforms until discontinued
- wheel_name: "pyogrio-wheel-linux-manylinux2014_x86_64"
container: "ci/manylinux2014_x86_64-vcpkg-gdal.Dockerfile"
# use manylinux_2_28 for any platforms with glibc>=2.28
- wheel_name: "pyogrio-wheel-linux-manylinux_2_28_x86_64"
container: "ci/manylinux_2_28_x86_64-vcpkg-gdal.Dockerfile"
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
with:
install: true
buildkitd-flags: --debug
- name: Build Docker image with vcpkg and gdal
# using build-push-action (without push) to make use of cache arguments
uses: docker/build-push-action@v6
with:
context: .
file: ${{ matrix.container }}
tags: manylinux-vcpkg-gdal:latest
push: false
load: true
cache-from: type=gha
cache-to: type=gha,mode=max
env:
BUILDKIT_PROGRESS: plain
- name: Build wheels
uses: pypa/cibuildwheel@v2.21.0
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.wheel_name }}
path: ./wheelhouse/*.whl
compression-level: 0
build-wheels-mac-win:
name: Build wheels on ${{ matrix.os }} (${{ matrix.arch }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: "macos-12"
triplet: "x64-osx-dynamic-release"
arch: x86_64
vcpkg_cache: "/Users/runner/.cache/vcpkg/archives"
vcpkg_logs: "/usr/local/share/vcpkg/buildtrees/**/*.log"
- os: "macos-12"
triplet: "arm64-osx-dynamic-release"
arch: arm64
vcpkg_cache: "/Users/runner/.cache/vcpkg/archives"
vcpkg_logs: "/usr/local/share/vcpkg/buildtrees/**/*.log"
- os: "windows-2019"
triplet: "x64-windows-dynamic-release"
arch: AMD64
# windows requires windows-specific paths
vcpkg_cache: "c:\\vcpkg\\installed"
vcpkg_logs: "c:\\vcpkg\\buildtrees\\**\\*.log"
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache vcpkg
uses: actions/cache@v4
id: vcpkgcache
with:
path: |
${{ matrix.vcpkg_cache }}
# bump the last digit to avoid using previous build cache
key: ${{ matrix.os }}-${{ matrix.arch }}-vcpkg-gdal3.9.2-cache0
# MacOS build requires aclocal, which is part of automake, but appears
# to be missing in default image
- name: Reinstall automake
if: runner.os == 'macOS'
run: |
brew reinstall automake
echo $(which aclocal)
- name: Checkout specific version of vcpkg
shell: bash
run: |
cd $VCPKG_INSTALLATION_ROOT
# on mac the clone is not clean, otherwise git pull fails
git reset --hard
# pull specific commit with desired GDAL version
git pull
git checkout 73794ce5f63fd138fab999a22959ca7c6305d93c
- name: Install GDAL
env:
VCPKG_DEFAULT_TRIPLET: ${{ matrix.triplet }}
shell: bash
run: |
vcpkg install --overlay-triplets=./ci/custom-triplets --feature-flags="versions,manifests" --x-manifest-root=./ci --x-install-root=$VCPKG_INSTALLATION_ROOT/installed
vcpkg list
- name: Upload vcpkg build logs
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: pyogrio-vcpkg-logs-${{ matrix.triplet }}
path: ${{ matrix.vcpkg_logs }}
- name: Build wheels
uses: pypa/cibuildwheel@v2.21.0
env:
# CIBW needs to know triplet for the correct install path
VCPKG_DEFAULT_TRIPLET: ${{ matrix.triplet }}
CIBW_ARCHS: ${{ matrix.arch }}
- uses: actions/upload-artifact@v4
with:
name: pyogrio-wheel-${{ matrix.triplet }}
path: ./wheelhouse/*.whl
compression-level: 0
test-wheels:
name: Test wheels on ${{ matrix.os }} (Python ${{ matrix.python-version }})
needs: [build-wheels-linux, build-wheels-mac-win]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
[
"ubuntu-latest",
"ubuntu-20.04",
"windows-latest",
"macos-12",
"macos-latest",
]
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
include:
- os: "ubuntu-latest"
artifact: pyogrio-wheel-linux-manylinux2014_x86_64
- os: "ubuntu-latest"
artifact: pyogrio-wheel-linux-manylinux_2_28_x86_64
- os: "ubuntu-20.04"
artifact: pyogrio-wheel-linux-manylinux_2_28_x86_64
- os: "windows-latest"
artifact: pyogrio-wheel-x64-windows-dynamic-release
- os: "macos-12"
artifact: pyogrio-wheel-x64-osx-dynamic-release
- os: "macos-latest"
artifact: pyogrio-wheel-arm64-osx-dynamic-release
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Create virtual environment (Linux / MacOS)
# install uv and use it to create a virtual environment, then add it to
# environment variables so that it is automatically activated and can be
# used for tests below
if: ${{ runner.os != 'Windows' }}
shell: bash
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
. $HOME/.cargo/env
uv venv .venv
echo "VIRTUAL_ENV=.venv" >> $GITHUB_ENV
echo "$PWD/.venv/bin" >> $GITHUB_PATH
- name: Create virtual environment (Windows)
if: ${{ runner.os == 'Windows' }}
run: |
irm https://astral.sh/uv/install.ps1 | iex
uv venv .venv
"VIRTUAL_ENV=.venv" | Out-File -FilePath $env:GITHUB_ENV -Append
"$PWD/.venv/Scripts" | Out-File -FilePath $env:GITHUB_PATH -Append
- name: Download wheels from artifacts
uses: actions/download-artifact@v4
with:
name: ${{ matrix.artifact }}
path: wheelhouse
- name: Install dependencies and pyogrio wheel
shell: bash
run: |
if [ ${{ matrix.python-version }} != "3.13" ]; then
uv pip install -r ci/requirements-wheel-test.txt
else
uv pip install numpy pytest
fi
uv pip install --no-cache --pre --no-index --find-links wheelhouse pyogrio
if [ ${{ matrix.python-version }} != "3.13" ]; then
uv pip install --no-deps geopandas
fi
uv pip list
- name: Run tests
shell: bash
# virtual environment is automatically activated
run: |
cd ..
uv run python -c "import pyogrio; print(f'GDAL version: {pyogrio.__gdal_version__}\nGEOS version: {pyogrio.__gdal_geos_version__}')"
uv run python -m pytest --pyargs pyogrio.tests -v
publish:
name: Publish pyogrio to GitHub / PyPI
needs: [test-sdist, test-wheels]
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/pyogrio
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing to PyPI
contents: write # this permission is required for the Github release action
# release on every tag
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/')
steps:
- uses: actions/download-artifact@v4
with:
pattern: pyogrio-*
path: dist
merge-multiple: true
- name: Publish distribution to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
- name: Create GitHub Release
id: create_release
uses: softprops/action-gh-release@v2
with:
name: Version ${{ github.ref_name }}
tag_name: ${{ github.ref }}
draft: false
prerelease: false
files: dist/*.tar.gz
token: ${{ secrets.GITHUB_TOKEN }}