workflows: build wheels on Linux and macOS #126
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Python | |
on: | |
push: | |
branches: [main] | |
tags: ["*"] | |
pull_request: | |
branches: [main] | |
permissions: | |
contents: read | |
env: | |
PYTHONUNBUFFERED: 1 | |
jobs: | |
pre-commit: | |
name: Rerun pre-commit checks | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: '3.12' | |
- uses: pre-commit/[email protected] | |
tests: | |
name: Tests | |
needs: pre-commit | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: [ubuntu-latest, macos-latest] | |
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] | |
# setup-python's Python < 3.11 won't build universal binaries | |
# https://github.com/actions/setup-python/issues/439#issuecomment-1247646682 | |
include: | |
- os: macos-latest | |
python-version: "3.8" | |
brew-python: true | |
- os: macos-latest | |
python-version: "3.9" | |
brew-python: true | |
- os: macos-latest | |
python-version: "3.10" | |
brew-python: true | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v4 | |
- name: Set up Python ${{ matrix.python-version }} | |
if: "! matrix.brew-python" | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Set up Python ${{ matrix.python-version }} (macOS fallback) | |
if: matrix.brew-python | |
run: | | |
brew install python@${{matrix.python-version}} | |
python3 -V | |
pip3 -V | |
- name: Install Python tools | |
run: | | |
python3 -m pip install --upgrade pip | |
pip3 install auditwheel build jinja2 pytest setuptools | |
- name: Install OpenSlide | |
run: | | |
case "${{ matrix.os }}" in | |
ubuntu-latest) | |
sudo apt-get install libopenslide0 | |
;; | |
macos-latest) | |
brew install openslide | |
;; | |
esac | |
- name: Build wheel | |
run: | | |
python3 -m build -w | |
case "${{ matrix.os }}" in | |
ubuntu-*) | |
mv dist old | |
auditwheel repair --only-plat -w dist old/*whl | |
;; | |
macos-*) | |
if [ ! -e dist/*universal2* ]; then | |
echo "Wheel is not universal:" | |
ls dist | |
exit 1 | |
fi | |
;; | |
esac | |
basename=openslide-python-wheels-$GITHUB_RUN_NUMBER-$(echo $GITHUB_SHA | cut -c-10) | |
mkdir -p "artifacts/${basename}" | |
mv dist/*.whl "artifacts/${basename}" | |
echo "basename=${basename}" >> $GITHUB_ENV | |
- name: Install | |
run: pip3 install artifacts/${basename}/*.whl | |
- name: Run tests | |
run: pytest -v | |
- name: Tile slide | |
run: python3 examples/deepzoom/deepzoom_tile.py --viewer -o tiled tests/fixtures/small.svs | |
- name: Archive wheel | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.basename }} | |
path: artifacts | |
windows: | |
name: Windows | |
needs: pre-commit | |
runs-on: windows-latest | |
env: | |
BIN_RELEASE: 20231011 | |
defaults: | |
run: | |
shell: bash | |
strategy: | |
matrix: | |
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v4 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Install Python tools | |
run: | | |
python -m pip install --upgrade pip | |
pip install build flask pytest | |
- name: Install OpenSlide | |
run: | | |
mkdir -p c:\\openslide | |
cd c:\\openslide | |
zipname=openslide-win64-${BIN_RELEASE} | |
curl -LO "https://github.com/openslide/openslide-bin/releases/download/v${BIN_RELEASE}/${zipname}.zip" | |
7z x ${zipname}.zip | |
echo "OPENSLIDE_PATH=c:\\openslide\\${zipname}\\bin" >> $GITHUB_ENV | |
- name: Build wheel | |
run: | | |
python -m build -w | |
basename=openslide-python-wheels-$GITHUB_RUN_NUMBER-$(echo $GITHUB_SHA | cut -c-10) | |
mkdir -p "artifacts/${basename}" | |
mv dist/*.whl "artifacts/${basename}" | |
echo "basename=${basename}" >> $GITHUB_ENV | |
- name: Install | |
run: pip install artifacts/${basename}/*.whl | |
- name: Run tests | |
# Reads OPENSLIDE_PATH | |
run: pytest -v | |
- name: Test library loading in examples | |
# Reads OPENSLIDE_PATH | |
run: | | |
python examples/deepzoom/deepzoom_multiserver.py -h >/dev/null | |
python examples/deepzoom/deepzoom_server.py -h >/dev/null | |
python examples/deepzoom/deepzoom_tile.py -h >/dev/null | |
- name: Tile slide | |
# Reads OPENSLIDE_PATH | |
run: python examples/deepzoom/deepzoom_tile.py --viewer -o tiled tests/fixtures/small.svs | |
- name: Archive wheel | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.basename }} | |
path: artifacts | |
docs: | |
name: Docs | |
needs: pre-commit | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: '3.12' | |
- name: Install Python tools | |
run: | | |
python -m pip install --upgrade pip | |
pip install sphinx | |
- name: Build | |
run: | | |
basename=openslide-python-docs-$GITHUB_RUN_NUMBER-$(echo $GITHUB_SHA | cut -c-10) | |
sphinx-build -d doctrees doc artifact/${basename} | |
echo "basename=${basename}" >> $GITHUB_ENV | |
- name: Archive | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.basename }} | |
path: artifact |