Wheel Builder #55
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
# Workflow to build wheels for upload to PyPI. | |
# | |
# In an attempt to save CI resources, wheel builds do | |
# not run on each push but only weekly and for releases. | |
# Wheel builds can be triggered from the Actions page | |
# (if you have the perms) on a commit to master. | |
# | |
# Alternatively, if you would like to trigger wheel builds | |
# on a pull request, the labels that trigger builds are: | |
# - Build System | |
name: Wheel Builder | |
on: | |
release: | |
types: [created] | |
schedule: | |
# ┌───────────── minute (0 - 59) | |
# │ ┌───────────── hour (0 - 23) | |
# │ │ ┌───────────── day of the month (1 - 31) | |
# │ │ │ ┌───────────── month (1 - 12 or JAN-DEC) | |
# │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT) | |
# │ │ │ │ │ | |
- cron: "42 1 * * 4" | |
pull_request: | |
types: [labeled, opened, synchronize, reopened] | |
paths: | |
#- Cython/Build/** | |
- .github/workflows/wheels.yml | |
- MANIFEST.in | |
- setup.* | |
workflow_dispatch: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
permissions: | |
contents: write # to create GitHub release (softprops/action-gh-release) | |
jobs: | |
build_wheels: | |
name: Build wheel for ${{ matrix.python }}-${{ matrix.buildplat[1] }} | |
if: >- | |
github.event_name == 'release' || | |
github.event_name == 'schedule' || | |
github.event_name == 'workflow_dispatch' || | |
(github.event_name == 'pull_request' && | |
contains(github.event.pull_request.labels.*.name, 'Build System')) | |
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-20.04, manylinux_x86_64] | |
- [ubuntu-20.04, manylinux_aarch64] | |
- [ubuntu-20.04, manylinux_i686] | |
- [ubuntu-20.04, musllinux_x86_64] | |
- [ubuntu-20.04, musllinux_aarch64] | |
- [macos-11, macosx_*] | |
- [windows-2019, win_amd64] | |
- [windows-2019, win32] | |
python: ["cp36", "cp37", "cp38", "cp39", "cp310", "cp311", "cp312"] # Note: Wheels not needed for PyPy | |
steps: | |
- name: Checkout Cython | |
uses: actions/checkout@v3 | |
- name: Set up QEMU | |
if: contains(matrix.buildplat[1], '_aarch64') | |
uses: docker/setup-qemu-action@v1 | |
with: | |
platforms: all | |
- name: Build wheels | |
uses: pypa/cibuildwheel@v2.13.0 | |
env: | |
# TODO: Build Cython with the compile-all flag? | |
CIBW_BUILD: ${{ matrix.python }}-${{ matrix.buildplat[1] }} | |
CIBW_PRERELEASE_PYTHONS: True | |
CIBW_ARCHS_LINUX: auto aarch64 | |
CIBW_ENVIRONMENT: CFLAGS='-O3 -g0 -mtune=generic -pipe -fPIC' LDFLAGS='-fPIC' | |
# TODO: Cython tests take a long time to complete | |
# consider running a subset in the future? | |
#CIBW_TEST_COMMAND: python {project}/runtests.py -vv --no-refnanny | |
- name: Release | |
uses: softprops/action-gh-release@v1 | |
if: startsWith(github.ref, 'refs/tags/') | |
with: | |
files: wheelhouse/*.whl | |
prerelease: >- | |
${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') | |
|| contains(github.ref_name, 'rc') || contains(github.ref_name, 'dev') }} | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.python }}-${{ startsWith(matrix.buildplat[1], 'macosx') && 'macosx' || matrix.buildplat[1] }} | |
path: ./wheelhouse/*.whl | |
build_sdist_pure_wheel: | |
name: Build sdist and pure wheel | |
if: >- | |
github.event_name == 'release' || | |
github.event_name == 'schedule' || | |
github.event_name == 'workflow_dispatch' || | |
(github.event_name == 'pull_request' && | |
contains(github.event.pull_request.labels.*.name, 'Build System')) | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout Cython | |
uses: actions/checkout@v3 | |
# Used to push the built wheels | |
- uses: actions/setup-python@v3 | |
with: | |
# Build sdist on lowest supported Python | |
python-version: '3.8' | |
- name: Build sdist | |
run: | | |
pip install --upgrade wheel setuptools | |
python setup.py sdist | |
python setup.py bdist_wheel --no-cython-compile --universal | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: sdist | |
path: ./dist/*.tar.gz | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: pure-wheel | |
path: ./dist/*.whl | |
- name: Release | |
uses: softprops/action-gh-release@v1 | |
if: startsWith(github.ref, 'refs/tags/') | |
with: | |
files: | | |
dist/*.tar.gz | |
dist/*-none-any.whl | |
prerelease: >- | |
${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') | |
|| contains(github.ref_name, 'rc') || contains(github.ref_name, 'dev') }} |