Build and release #36
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: Build and release | |
#on: | |
# push: | |
# release: | |
# types: [created] | |
on: | |
workflow_dispatch: | |
inputs: | |
target: | |
description: 'Release target' | |
required: true | |
default: 'test' | |
jobs: | |
build_wheels: | |
name: Build ${{ matrix.python }} wheels on ${{ matrix.os }}-${{ matrix.platform_id }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
# Ensure the wheels build even if one fails. | |
fail-fast: false | |
matrix: | |
os: [windows-latest, ubuntu-latest, macos-latest] | |
python: [38, 39, 310, 311, 312] | |
platform_id: | |
- win_amd64 | |
- win32 | |
- manylinux_x86_64 | |
- manylinux_i686 | |
- manylinux_aarch64 | |
- macosx_universal2 | |
exclude: | |
# Skip Linux and Mac builds on Windows | |
- os: windows-latest | |
platform_id: manylinux_aarch64 | |
- os: windows-latest | |
platform_id: manylinux_i686 | |
- os: windows-latest | |
platform_id: manylinux_x86_64 | |
- os: windows-latest | |
platform_id: macosx_universal2 | |
# Skip Mac and Windows builds on Linux | |
- os: ubuntu-latest | |
platform_id: macosx_universal2 | |
- os: ubuntu-latest | |
platform_id: win_amd64 | |
- os: ubuntu-latest | |
platform_id: win32 | |
# Skip Linux and Windows builds on Mac | |
- os: macos-latest | |
platform_id: win_amd64 | |
- os: macos-latest | |
platform_id: win32 | |
- os: macos-latest | |
platform_id: manylinux_x86_64 | |
- os: macos-latest | |
platform_id: manylinux_i686 | |
- os: macos-latest | |
platform_id: manylinux_aarch64 | |
env: | |
CIBW_ARCHS_LINUX: auto aarch64 | |
CIBW_ARCHS_MACOS: universal2 | |
CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.platform_id }} | |
CIBW_TEST_REQUIRES: pytest==6.* hypothesis==6.* | |
CIBW_TEST_COMMAND: "bash {project}/tools/test_wheels.sh {project}" | |
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 | |
CIBW_MANYLINUX_I686_IMAGE: manylinux2014 | |
CIBW_MANYLINUX_AARCH64_IMAGE: manylinux2014 | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Set up QEMU | |
if: | | |
runner.os == 'Linux' && (matrix.platform_id == 'manylinux_aarch64' || matrix.platform_id == 'manylinux_i686') | |
uses: docker/setup-qemu-action@v2 | |
with: | |
platforms: all | |
- name: Build wheels | |
uses: pypa/cibuildwheel@v2.16.2 | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_dist: | |
name: Build source distribution and pure python wheel | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
name: Install Python | |
with: | |
python-version: '3.10' | |
- name: Install dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install build | |
- name: Build sdist | |
run: python -m build --sdist | |
- name: Build pure wheel | |
run: python -m build --wheel | |
env: | |
PYRSISTENT_SKIP_EXTENSION: yes | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: dist/* | |
publish_pypi: | |
needs: [ build_wheels, build_dist ] | |
runs-on: ubuntu-latest | |
# TODO: Migrate to automated release once verified? | |
# upload to PyPI on every tag starting with 'v' | |
# if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') | |
# alternatively, to publish when a GitHub Release is created, use the following rule: | |
# if: github.event_name == 'release' && github.event.action == 'published' | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: artifact | |
path: dist | |
- name: Publish test release | |
if: github.event.inputs.target == 'test' | |
uses: pypa/gh-action-pypi-publish@v1.5.1 | |
with: | |
user: __token__ | |
password: ${{ secrets.TEST_PYPI_API_TOKEN }} | |
repository_url: https://test.pypi.org/legacy/ | |
verbose: true | |
- name: Publish release | |
if: github.event.inputs.target != 'test' | |
uses: pypa/gh-action-pypi-publish@v1.5.1 | |
with: | |
user: __token__ | |
password: ${{ secrets.PYPI_API_TOKEN }} |