CFFI CI #127
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: CFFI CI | |
on: | |
push: | |
pull_request: | |
types: [ opened, synchronize, reopened ] | |
schedule: | |
- cron: '0 12 * * 1' | |
workflow_dispatch: | |
inputs: | |
skip_artifact_upload: | |
type: boolean | |
default: true | |
skip_ci_redundant_jobs: | |
type: boolean | |
default: true | |
skip_slow_jobs: | |
type: boolean | |
default: true | |
env: | |
is_release_job: false | |
skip_ci_redundant_jobs: ${{ inputs.skip_ci_redundant_jobs || github.event_name == 'pull_request' || github.event_name == 'push' }} | |
skip_slow_jobs: ${{ inputs.skip_slow_jobs || github.event_name == 'pull_request' || github.event_name == 'push' }} | |
skip_artifact_upload: ${{ (github.event_name == 'workflow_dispatch' && inputs.skip_artifact_upload) || github.event_name != 'workflow_dispatch' }} | |
jobs: | |
# FIXME: update wheel jobs to build from this sdist artifact | |
# FIXME: update to upload-artifact v4 and add an artifact merge job | |
sdist: | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: clone repo | |
uses: actions/checkout@v4 | |
- name: build sdist | |
run: | | |
rm -rf dist/ | |
python -m pip install build | |
python -m build --sdist | |
- name: upload sdist artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
path: dist | |
if-no-files-found: error | |
if: ${{ ! env.skip_artifact_upload }} | |
make_linux_matrix: | |
runs-on: ubuntu-22.04 | |
outputs: | |
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: make a matrix | |
id: make_matrix | |
uses: ./.github/actions/dynamatrix | |
with: | |
matrix_yaml: | | |
include: | |
- spec: cp38-manylinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp39-manylinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-manylinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-manylinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-manylinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-manylinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp38-manylinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp39-manylinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-manylinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-manylinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-manylinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-manylinux_i686 | |
- spec: cp39-musllinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-musllinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-musllinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-musllinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-musllinux_x86_64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp39-musllinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-musllinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-musllinux_i686 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
#- spec: cp312-musllinux_i686 # busted as of 2024-05-17 | |
# omit: ${{ env.skip_ci_redundant_jobs }} | |
#- spec: cp313-musllinux_i686 # busted as of 2024-05-17 | |
- spec: cp39-musllinux_aarch64 | |
omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} | |
- spec: cp310-musllinux_aarch64 | |
omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} | |
- spec: cp311-musllinux_aarch64 | |
omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} | |
- spec: cp312-musllinux_aarch64 | |
omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} | |
- spec: cp313-musllinux_aarch64 | |
omit: ${{ env.skip_slow_jobs}} | |
- spec: cp38-manylinux_aarch64 | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs }} | |
- spec: cp39-manylinux_aarch64 | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp310-manylinux_aarch64 | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp311-manylinux_aarch64 | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp312-manylinux_aarch64 | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp313-manylinux_aarch64 | |
foreign_arch: true | |
# test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs }} | |
- spec: cp38-manylinux_ppc64le | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs }} | |
- spec: cp39-manylinux_ppc64le | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp310-manylinux_ppc64le | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp311-manylinux_ppc64le | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp312-manylinux_ppc64le | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp313-manylinux_ppc64le | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs }} | |
- spec: cp38-manylinux_s390x | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs }} | |
- spec: cp39-manylinux_s390x | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp310-manylinux_s390x | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp311-manylinux_s390x | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp312-manylinux_s390x | |
foreign_arch: true | |
test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs || env.skip_ci_redundant_jobs }} | |
- spec: cp313-manylinux_s390x | |
foreign_arch: true | |
# test_args: '{project}/src/c' | |
omit: ${{ env.skip_slow_jobs }} | |
linux: | |
needs: make_linux_matrix | |
runs-on: ubuntu-22.04 | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.make_linux_matrix.outputs.matrix_json) }} | |
steps: | |
- name: clone repo | |
uses: actions/checkout@v4 | |
- name: configure docker foreign arch support | |
uses: docker/setup-qemu-action@v3 | |
if: ${{ matrix.foreign_arch || false }} | |
- name: build/test wheels | |
env: | |
CFLAGS: -Dffi_call=cffistatic_ffi_call # override name for ffi_call to break hard if we linked against someone else's libffi | |
CIBW_ARCHS_LINUX: all | |
CIBW_BUILD: ${{ matrix.spec }} | |
CIBW_BEFORE_BUILD: | | |
set -eux && \ | |
curl -L -O https://github.com/libffi/libffi/archive/v3.4.2.tar.gz && \ | |
tar zxf v3.4.2.tar.gz && cd libffi-3.4.2 && \ | |
./autogen.sh && \ | |
./configure --without-gcc-arch --disable-docs --with-pic --enable-shared=no && \ | |
make && \ | |
make install && \ | |
ldconfig || true | |
CIBW_ENVIRONMENT_PASS_LINUX: CFLAGS # ensure that the build container can see our overridden build config | |
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux_img || '' }} | |
CIBW_MANYLINUX_I686_IMAGE: ${{ matrix.manylinux_img || '' }} | |
CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.manylinux_img || '' }} | |
CIBW_MANYLINUX_PPC64LE_IMAGE: ${{ matrix.manylinux_img || '' }} | |
CIBW_MANYLINUX_S390X_IMAGE: ${{ matrix.manylinux_img || '' }} | |
CIBW_MUSLLINUX_X86_64_IMAGE: ${{ matrix.musllinux_img || '' }} | |
CIBW_MUSLLINUX_I686_IMAGE: ${{ matrix.musllinux_img || '' }} | |
CIBW_MUSLLINUX_AARCH64_IMAGE: ${{ matrix.musllinux_img || '' }} | |
CIBW_PRERELEASE_PYTHONS: 'True' | |
CIBW_TEST_REQUIRES: pytest setuptools # 3.12+ no longer includes distutils, just always ensure setuptools is present | |
CIBW_TEST_COMMAND: PYTHONUNBUFFERED=1 python -m pytest ${{ matrix.test_args || '{project}' }} # default to test all | |
run: | | |
python -m pip install --upgrade "${{ matrix.cibw_version || 'cibuildwheel' }}" | |
# actually build libffi + wheel (using env tweaks above) | |
python -m cibuildwheel --output-dir dist . | |
- name: upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: dist | |
if-no-files-found: error | |
if: ${{ ! env.skip_artifact_upload }} | |
make_macos_matrix: | |
runs-on: ubuntu-22.04 | |
outputs: | |
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: make a matrix | |
id: make_matrix | |
uses: ./.github/actions/dynamatrix | |
with: | |
matrix_yaml: | | |
include: | |
# build for x86_64 under the default hosted macOS 10.x x86_64 runner | |
- spec: cp38-macosx_x86_64 | |
runs_on: [macos-13] | |
- spec: cp39-macosx_x86_64 | |
runs_on: [macos-13] | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-macosx_x86_64 | |
runs_on: [macos-13] | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-macosx_x86_64 | |
runs_on: [macos-13] | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-macosx_x86_64 | |
runs_on: [macos-13] | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-macosx_x86_64 | |
runs_on: [macos-13] | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
# FIXME: ? cp38-macosx_arm64 requires special handling and fails some test_zdist tests under cibw 2.1.2, skip it (so Apple's XCode python3 won't have a wheel) | |
- spec: cp39-macosx_arm64 | |
deployment_target: '11.0' | |
run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-macosx_arm64 | |
deployment_target: '11.0' | |
run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} | |
omit: ${{ env.skip_ci_redundant_jobs}} | |
- spec: cp311-macosx_arm64 | |
deployment_target: '11.0' | |
run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-macosx_arm64 | |
deployment_target: '11.0' | |
run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-macosx_arm64 | |
deployment_target: '11.0' | |
run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} | |
macos: | |
needs: make_macos_matrix | |
defaults: | |
run: | |
shell: ${{ matrix.run_wrapper || 'bash --noprofile --norc -eo pipefail {0}' }} | |
runs-on: ${{ matrix.runs_on || 'macos-14' }} | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.make_macos_matrix.outputs.matrix_json) }} | |
steps: | |
- name: clone repo | |
uses: actions/checkout@v4 | |
- name: install python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' # as of 2024-05, this has to be < 3.12 since the macos-13 runner image's | |
# built-in virtualenv/pip are pinned to busted versions that fail on newer Pythons | |
- name: build wheel prereqs | |
run: | | |
python3 -m pip install --user --upgrade "${{ matrix.cibw_version || 'cibuildwheel' }}" | |
brew uninstall --ignore-dependencies libffi || true | |
- name: build/test wheels | |
env: | |
CIBW_BUILD: ${{ matrix.spec }} | |
CIBW_PRERELEASE_PYTHONS: 'True' | |
CIBW_TEST_REQUIRES: pytest setuptools | |
CIBW_TEST_COMMAND: pip install pip --upgrade; cd {project}; PYTHONUNBUFFERED=1 pytest | |
run: | | |
if [[ -n "${{ matrix.deployment_target || '' }}" ]] | |
then | |
export MACOSX_DEPLOYMENT_TARGET="${{ matrix.deployment_target || '' }}" | |
fi | |
if [[ -n "${{ matrix.sdkroot || '' }}" ]] | |
then | |
export SDKROOT="${{ matrix.sdkroot || '' }}" | |
fi | |
python3 -m cibuildwheel --output-dir dist | |
- name: upload artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
path: dist | |
if-no-files-found: error | |
if: ${{ ! env.skip_artifact_upload }} | |
make_windows_matrix: | |
runs-on: ubuntu-22.04 | |
outputs: | |
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: make a matrix | |
id: make_matrix | |
uses: ./.github/actions/dynamatrix | |
with: | |
matrix_yaml: | | |
include: | |
- spec: cp38-win_amd64 | |
# omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp39-win_amd64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-win_amd64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-win_amd64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-win_amd64 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-win_amd64 | |
# omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp38-win32 | |
# omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp39-win32 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp310-win32 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp311-win32 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp312-win32 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
- spec: cp313-win32 | |
omit: ${{ env.skip_ci_redundant_jobs }} | |
windows: | |
needs: make_windows_matrix | |
runs-on: windows-2022 | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.make_windows_matrix.outputs.matrix_json) }} | |
steps: | |
- name: clone repo | |
uses: actions/checkout@v4 | |
- name: build/test wheels | |
env: | |
CIBW_BUILD: ${{ matrix.spec }} | |
CIBW_PRERELEASE_PYTHONS: 'True' | |
CIBW_TEST_REQUIRES: pytest setuptools | |
CIBW_TEST_COMMAND: 'python -m pytest {project}/src/c' | |
# FIXME: /testing takes ~45min on Windows and has some failures... | |
# CIBW_TEST_COMMAND='python -m pytest {project}/src/c {project}/testing' | |
run: | | |
python -m pip install --upgrade pip | |
pip install "${{ matrix.cibw_version || 'cibuildwheel'}}" | |
python -m cibuildwheel --output-dir dist . | |
shell: bash | |
- name: upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: dist | |
if-no-files-found: error | |
if: ${{ ! env.skip_artifact_upload }} | |
check: | |
if: always() | |
needs: | |
- sdist | |
- linux | |
- macos | |
- windows | |
runs-on: ubuntu-latest | |
steps: | |
- name: Verify all previous jobs succeeded (provides a single check to sample for gating purposes) | |
uses: re-actors/alls-green@release/v1 | |
with: | |
jobs: ${{ toJSON(needs) }} |