Skip to content

ci: run tests when building macOS arm64 natively #527

ci: run tests when building macOS arm64 natively

ci: run tests when building macOS arm64 natively #527

Workflow file for this run

name: Wheels
on:
pull_request:
push:
env:
REPO_DIR: pillow-avif-plugin
BUILD_DEPENDS: ""
TEST_DEPENDS: "pytest pillow"
MACOSX_DEPLOYMENT_TARGET: "10.10"
WHEEL_SDIR: wheelhouse
CONFIG_PATH: pillow-avif-plugin/wheelbuild/config.sh
LIBAVIF_VERSION: 88d3dccda111f6ccbcccd925179f67e7d6fdf4ff
jobs:
build:
name: ${{ matrix.python }} ${{ matrix.os-name }} ${{ matrix.arch == 'x86' && 'x86_64' || matrix.os-type == 'macos' && 'arm64' || 'aarch64' }}
runs-on: ${{ matrix.os-type == 'ubuntu' && 'ubuntu-latest' || (matrix.os-type == 'macos' && (matrix.arch == 'x86' || matrix.python == '2.7' || matrix.python == '3.7')) && 'macos-13' || 'macos-latest' }}
strategy:
fail-fast: false
matrix:
os-type: [ "ubuntu", "macos" ]
python: [ "2.7", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12" ]
arch: [ "x86", "arm" ]
manylinux-version: [ "2014" ]
mb-ml-libc: [ "manylinux", "musllinux" ]
exclude:
- python: "2.7"
os-type: "ubuntu"
manylinux-version: "2014"
- python: "3.7"
os-type: "ubuntu"
manylinux-version: "2014"
- python: "2.7"
os-type: "ubuntu"
arch: "arm"
- python: "2.7"
mb-ml-libc: "musllinux"
- python: "3.7"
mb-ml-libc: "musllinux"
- arch: "arm"
mb-ml-libc: "musllinux"
- os-type: "macos"
mb-ml-libc: "musllinux"
include:
- os-type: "macos"
os-name: "macOS"
- os-type: "ubuntu"
os: "ubuntu-latest"
python: "2.7"
arch: "x86"
manylinux-version: "2010"
os-name: "manylinux2010"
- os-type: "ubuntu"
os: "ubuntu-latest"
python: "3.7"
arch: "x86"
manylinux-version: "2010"
os-name: "manylinux2010"
- os-type: "ubuntu"
os: "ubuntu-latest"
manylinux-version: "2014"
os-name: "manylinux2014"
- mb-ml-libc: "musllinux"
os-type: "ubuntu"
os-name: "musllinux"
env:
BUILD_COMMIT: HEAD
PLAT: ${{ matrix.arch == 'x86' && 'x86_64' || (matrix.os-type == 'macos' && 'arm64') || 'aarch64' }}
MB_PYTHON_VERSION: ${{ matrix.python }}
TRAVIS_OS_NAME: ${{ matrix.os-name }}
MB_ML_VER: ${{ matrix.mb-ml-libc == 'musllinux' && '_1_1' || matrix.manylinux-version }}
MACOSX_DEPLOYMENT_TARGET: ${{ matrix.arch == 'arm' && '11.0' || '10.10' }}
MB_ML_LIBC: ${{ matrix.mb-ml-libc }}
steps:
- uses: actions/checkout@v3
with:
path: pillow-avif-plugin
- name: Checkout dependencies
uses: actions/checkout@v3
with:
repository: fdintino/pillow-avif-plugin-depends
path: pillow-avif-plugin-depends
- name: Checkout multibuild
uses: actions/checkout@v3
with:
repository: multi-build/multibuild
path: multibuild
ref: ${{ (matrix.python == '3.11' || matrix.python == '3.12' || matrix.os == 'macos-latest' || (env.PLAT == 'arm64' && matrix.python != '2.7')) && '88146e74ebc86baf97b6fec448ef766d64326582' || '34e970c4bc448b73af0127615fc4583b4f247369' }}
- uses: actions/setup-python@v4
with:
python-version: 3.9
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
if: ${{ matrix.os == 'ubuntu-latest' && matrix.arch == 'arm' }}
- name: Setup env_vars
run: |
cat <<'EOF' >> env_vars.sh
export LIBAVIF_VERSION=${{ env.LIBAVIF_VERSION }}"
export GITHUB_ACTIONS=1"
EOF
# - name: Cache build
# id: build-cache
# uses: actions/cache@v3
# with:
# path: pillow-avif-plugin/depends/libavif-${{ env.LIBAVIF_VERSION }}
# key:
# ${{ env.LIBAVIF_VERSION }}-${{ hashFiles('pillow-avif-plugin/wheelbuild/*.sh', 'pillow-avif-plugin/.github/workflows/wheels.yml', 'pillow-avif-plugin/depends/*') }}-${{ matrix.os }}-${{ env.PLAT }}
- name: Cache ccache/sccache
uses: actions/cache@v3
with:
path: |
ccache
sccache
key:
cache-${{ matrix.os }}-${{ matrix.os-name }}-${{ env.PLAT }}-${{ hashFiles('pillow-avif-plugin/wheelbuild/*.sh', 'pillow-avif-plugin/.github/workflows/wheels.yml', 'pillow-avif-plugin/depends/*', 'pillow-avif-plugin/**/*.py', 'pillow-avif-plugin/**/*.c') }}-${{ matrix.python }}
restore-keys: |
cache-${{ matrix.os }}-${{ matrix.os-name }}-${{ env.PLAT }}-${{ hashFiles('pillow-avif-plugin/wheelbuild/*.sh', 'pillow-avif-plugin/.github/workflows/wheels.yml', 'pillow-avif-plugin/depends/*', 'pillow-avif-plugin/**/*.py', 'pillow-avif-plugin/**/*.c') }}-${{ matrix.python }}
cache-${{ matrix.os }}-${{ matrix.os-name }}-${{ env.PLAT }}-${{ hashFiles('pillow-avif-plugin/wheelbuild/*.sh', 'pillow-avif-plugin/.github/workflows/wheels.yml', 'pillow-avif-plugin/depends/*', 'pillow-avif-plugin/**/*.py', 'pillow-avif-plugin/**/*.c') }}
cache-${{ matrix.os }}-${{ matrix.os-name }}-${{ env.PLAT }}-
- name: Build Wheel
run: pillow-avif-plugin/wheelbuild/build.sh
- name: Fix Directory Permissions
run: |
sudo chown -R $(whoami):$(id -ng) ccache ||:
sudo chown -R $(whoami):$(id -ng) sccache ||:
- uses: actions/upload-artifact@v3
with:
name: wheels
path: wheelhouse/*.whl
windows:
runs-on: windows-2019
strategy:
fail-fast: false
matrix:
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
architecture: ["x64"]
include:
- architecture: "x64"
platform-vcvars: "x86_amd64"
platform-msbuild: "x64"
timeout-minutes: 300
name: ${{ matrix.python-version }} windows ${{ matrix.architecture }}
steps:
- name: Checkout pillow-avif-plugin
uses: actions/checkout@v3
- name: Checkout cached dependencies
uses: actions/checkout@v3
with:
repository: python-pillow/pillow-depends
path: winbuild\depends
- name: Cache pip
uses: actions/cache@v3
with:
path: ~\AppData\Local\pip\Cache
key:
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-${{ hashFiles('**/.github/workflows/test-windows.yml') }}
restore-keys: |
${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-
${{ runner.os }}-${{ matrix.python-version }}-
# sets env: pythonLocation
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
architecture: ${{ matrix.architecture }}
- name: python -m pip install wheel pytest pytest-cov mock
run: python -m pip install wheel pytest pytest-cov mock
- name: Install dependencies
id: install
run: |
7z x winbuild\depends\nasm-2.16.01-win64.zip "-o$env:RUNNER_WORKSPACE\"
echo "$env:RUNNER_WORKSPACE\nasm-2.16.01" >> $env:GITHUB_PATH
python -m pip install meson
# make cache key depend on VS version
& "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" `
| find """catalog_buildVersion""" `
| ForEach-Object { $a = $_.split(" ")[1]; echo "vs=$a" >> $env:GITHUB_OUTPUT }
shell: pwsh
- name: Cache build
id: build-cache
uses: actions/cache@v3
with:
path: winbuild\build
key:
${{ hashFiles('winbuild\build_prepare.py') }}-${{ hashFiles('.github\workflows\test-windows.yml') }}-${{ env.pythonLocation }}-${{ steps.install.outputs.vs }}
- name: Prepare build
if: steps.build-cache.outputs.cache-hit != 'true'
run: |
& python.exe winbuild\build_prepare.py -v
shell: pwsh
- name: Build dependencies / libjpeg-turbo
if: steps.build-cache.outputs.cache-hit != 'true'
run: "& winbuild\\build\\build_dep_libjpeg.cmd"
- name: Build dependencies / zlib
if: steps.build-cache.outputs.cache-hit != 'true'
run: "& winbuild\\build\\build_dep_zlib.cmd"
- name: Build dependencies / libpng
if: steps.build-cache.outputs.cache-hit != 'true'
run: "& winbuild\\build\\build_dep_libpng.cmd"
- name: Build dependencies / meson (python 2.7)
if: steps.build-cache.outputs.cache-hit != 'true' && matrix.python-version == '2.7'
run: "& winbuild\\build\\install_meson.cmd"
- name: Build dependencies / meson (python 3.x)
if: steps.build-cache.outputs.cache-hit != 'true' && matrix.python-version != '2.7'
run: python -m pip install meson
shell: cmd
- name: Build dependencies / rav1e
if: steps.build-cache.outputs.cache-hit != 'true'
run: "& winbuild\\build\\build_dep_rav1e.cmd"
- name: Build dependencies / libavif
if: steps.build-cache.outputs.cache-hit != 'true'
run: "& winbuild\\build\\build_dep_libavif.cmd"
# trim ~150MB x 9
- name: Optimize build cache
if: steps.build-cache.outputs.cache-hit != 'true'
run: rmdir /S /Q winbuild\build\src
shell: cmd
- name: Install dependencies / Pillow
run: |
cmd /c "winbuild\build\build_env.cmd && $env:pythonLocation\python.exe -m pip install -v Pillow"
shell: pwsh
- name: Build pillow-avif-plugin
run: |
cmd /c "winbuild\build\build_env.cmd && $env:pythonLocation\python.exe -m pip install -v ."
shell: pwsh
# failing with PyPy3
- name: Enable heap verification
if: "!contains(matrix.python-version, 'pypy')"
run: "& 'C:\\Program Files (x86)\\Windows Kits\\10\\Debuggers\\x86\\gflags.exe' /p /enable $env:pythonLocation\\python.exe"
- name: Test pillow-avif-plugin
run: |
path %GITHUB_WORKSPACE%\\winbuild\\build\\bin;%PATH%
python.exe -m pytest -v -W always --cov pillow_avif --cov tests --cov-report term --cov-report xml tests
shell: cmd
- name: Prepare to upload errors
if: failure()
run: |
mkdir -p tests/errors
shell: pwsh
- name: Upload errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: errors
path: tests/errors
- name: After success
run: |
coverage xml
shell: pwsh
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
file: ./coverage.xml
flags: GHA_Windows
name: ${{ runner.os }} Python ${{ matrix.python-version }} ${{ matrix.architecture }}
- name: Build wheel
id: wheel
if: "github.event_name == 'push'"
run: |
cmd /c "winbuild\build\build_env.cmd && $env:pythonLocation\python.exe -m pip wheel -v ."
shell: pwsh
- uses: actions/upload-artifact@v3
if: "github.event_name == 'push'"
with:
name: wheels
path: "*.whl"
success:
needs: [build, windows]
runs-on: ubuntu-latest
name: Build Successful
steps:
- name: Success
run: echo Build Successful
release:
name: Create Release
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [build, windows]
steps:
- uses: actions/download-artifact@v3
with:
name: wheels
- name: Upload Release
uses: fnkr/[email protected]
env:
GHR_PATH: .
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}