Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add workflow config file for building native binary wheels #3121

Merged
merged 2 commits into from
May 24, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
135 changes: 135 additions & 0 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
name: Build + Deploy

on:
push:
tags: ["*.*.*"]
release:
types:
- published
# enables workflow to be run manually
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch
workflow_dispatch:

env:
PROJECT_NAME: fonttools
# skip binary wheels for pypy (preferable to use pure-python) and 32-bit Linux
CIBW_SKIP: pp* cp*linux_i686
CIBW_ENVIRONMENT: FONTTOOLS_WITH_CYTHON=1
CIBW_TEST_REQUIRES: tox

jobs:

build_wheels:
name: ${{ matrix.type }} ${{ matrix.arch }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-latest]
arch: [auto64]
build: ["*"]
test_command: ["tox -e py-cy-nolxml -c {package}/tox.ini --installpkg {wheel}"]
include:
# # the manylinux1 docker images contain up to python 3.9
# - os: ubuntu-latest
# type: manylinux1
# arch: auto
# build: "cp{38,39}-*"
# CIBW_MANYLINUX_X86_64_IMAGE: manylinux1
# CIBW_MANYLINUX_I686_IMAGE: manylinux1
# # the manylinux2010 image contains python 3.10
# - os: ubuntu-latest
# arch: auto
# type: manylinux2010
# build: "cp310-*"
# CIBW_MANYLINUX_X86_64_IMAGE: manylinux2010
# CIBW_MANYLINUX_I686_IMAGE: manylinux2010
# # the manylinux2014 image contains python 3.11
#
# the manylinux2014 image contains ALL the python versions we support
# use that for simplicity, and only if needed build for older manylinuxes
- os: ubuntu-latest
arch: auto
type: manylinux2014
# build: "cp311-*"
build: "cp{38,39,310,311}-*"
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
CIBW_MANYLINUX_I686_IMAGE: manylinux2014

- os: macos-latest
arch: universal2
build: "*"

- os: windows-latest
arch: auto32
build: "*"
# skip running test on 32-bit windows
test_command: "python -c \"import fontTools; print(fontTools.__file__, fontTools.__version__)\""
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: "3.x"
- name: Install dependencies
run: pip install git+https://github.com/anthrotype/cibuildwheel.git@test_command_wheel#egg=cibuildwheel

- name: Build Wheels
run: python -m cibuildwheel --output-dir wheelhouse .
env:
CIBW_BUILD: ${{ matrix.build }}
CIBW_MANYLINUX_I686_IMAGE: ${{ matrix.CIBW_MANYLINUX_I686_IMAGE }}
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.CIBW_MANYLINUX_X86_64_IMAGE }}
CIBW_ARCHS: ${{ matrix.arch }}
CIBW_TEST_COMMAND: ${{ matrix.test_command }}
- uses: actions/upload-artifact@v2
with:
path: wheelhouse/*.whl

build_arch_wheels:
name: py${{ matrix.python }} on ${{ matrix.arch }}
runs-on: ubuntu-latest
strategy:
matrix:
# aarch64 uses qemu so it's slow, build each py version in parallel jobs
python: [38, 39, 310, 311]
arch: [aarch64]
steps:
- uses: actions/checkout@v2
with:
submodules: true
- uses: docker/setup-qemu-action@v1.2.0
with:
platforms: all
- name: Install dependencies
run: pip install git+https://github.com/anthrotype/cibuildwheel.git@test_command_wheel#egg=cibuildwheel
- name: Build Wheels
run: python -m cibuildwheel --output-dir wheelhouse .
env:
CIBW_BUILD: cp${{ matrix.python }}-*
CIBW_ARCHS: ${{ matrix.arch }}
- uses: actions/upload-artifact@v2
with:
path: wheelhouse/*.whl

deploy:
name: Upload if release
needs: [build_wheels, build_arch_wheels]
runs-on: ubuntu-latest
if: github.event_name == 'release' && github.event.action == 'published'

steps:
- uses: actions/download-artifact@v2
with:
name: artifact
path: dist

- uses: pypa/gh-action-pypi-publish@v1.4.2
with:
user: __token__
password: ${{ secrets.PYPI_PASSWORD }}