Wheel creation #144
Workflow file for this run
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: Wheel creation | |
# Change this to whatever you want | |
on: | |
push: | |
tags: | |
- 'v*' | |
workflow_dispatch: | |
inputs: | |
release: | |
description: 'Release the wheels?' | |
type: boolean | |
required: false | |
default: false | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
jobs: | |
# cibuildwheels already manages multiple python versions automatically | |
# by just detecting the os. However, it does everything in the same job | |
# and therefore in a serial manner. We build a matrix of operating systems | |
# and python versions so that builds are ran in parallel. | |
# The job matrix is basically copied from https://github.com/scikit-learn/scikit-learn/blob/main/.github/workflows/wheels.yml | |
wheels: | |
name: ${{ matrix.os }} for ${{ matrix.cibw_archs }} | |
runs-on: ${{ matrix.os }} | |
needs: sdist | |
env: | |
CIBW_BUILD_VERBOSITY: 1 | |
CIBW_BEFORE_BUILD: >- | |
rm -rf {package}/build | |
# Instead of running pytest directly, we use a bash script that will set up | |
# the appropiate value for the SISL_FILES_TEST variable, a path pointing to | |
# the sisl-files directory, which contains files for testing. | |
CIBW_TEST_COMMAND: >- | |
bash {project}/tools/build_tools/test_wheels.sh | |
CIBW_TEST_REQUIRES: "joblib" | |
CIBW_TEST_EXTRAS: "test" | |
CIBW_SKIP: "*-musllinux_aarch64 pp*" | |
# For now we use manylinux 2014, which supports ubuntu 20. | |
# We should in principle bump to 2_28, but that only supports ubuntu 21 | |
# Perhaps in some later release | |
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 | |
# Deployment of the SDK in MacOS | |
MACOSX_DEPLOYMENT_TARGET: "${{ matrix.deployment_target }}" | |
strategy: | |
# Ensure that a wheel builder finishes even if another fails | |
fail-fast: false | |
matrix: | |
include: | |
# Linux 64 bit manylinux2014 | |
- os: ubuntu-20.04 | |
cibw_archs: "x86_64" | |
- os: ubuntu-20.04 | |
cibw_archs: "aarch64" | |
# MacOS x86_64 | |
- os: macos-13 | |
cibw_archs: "x86_64" | |
deployment_target: "13.0" | |
- os: macos-14 | |
cibw_archs: "arm64" | |
deployment_target: "14.0" | |
steps: | |
- name: Set up QEMU | |
if: matrix.cibw_archs == 'aarch64' | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: arm64 | |
- uses: actions/checkout@v4 | |
- name: Ensure fortran | |
uses: fortran-lang/setup-fortran@v1 | |
with: | |
compiler: gcc | |
version: 11 | |
- name: Build wheels for CPython 3.12 | |
uses: pypa/[email protected] | |
env: | |
CIBW_BUILD: "cp312-*" | |
CIBW_ARCHS: ${{ matrix.cibw_archs }} | |
# Upload the wheel to the action's artifact. | |
- name: Store artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: cibw-wheels-${{ runner.os }}-${{ matrix.cibw_archs }} | |
path: ./wheelhouse/*.whl | |
if-no-files-found: error | |
# Build the source distribution as well | |
sdist: | |
name: Build source distribution | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Build sdist | |
run: | | |
pipx run build --sdist | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: cibw-sdist | |
path: dist/*.tar.gz | |
if-no-files-found: error | |
# Upload to testpypi | |
upload_testpypi: | |
needs: [sdist, wheels] | |
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') | |
name: Publish package to TestPyPI | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: cibw-* | |
path: dist | |
merge-multiple: True | |
- name: Print packages | |
run: ls dist | |
- uses: pypa/[email protected] | |
with: | |
user: __token__ | |
password: ${{ secrets.TESTPYPI_TOKEN }} | |
repository-url: https://test.pypi.org/legacy/ | |
# Check that the testpypi installation works | |
test_testpypi: | |
needs: [upload_testpypi] | |
name: Test installation from TestPyPi | |
runs-on: ${{ matrix.os }} | |
strategy: | |
# If one of the jobs fails, continue with the others. | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, macos-13, macos-14] | |
steps: | |
- name: Python installation | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.10" | |
- name: Wait for testpypi to catch up | |
run: | | |
sleep 20 | |
version=${GITHUB_REF#refs/*/v} | |
echo "SISL_VERSION=${version#refs/*/}" >> $GITHUB_ENV | |
ls -lh | |
- name: Install sisl + dependencies (oldest numpy, not ARM) | |
if: matrix.os != 'macos-14' | |
run: | | |
python -m pip install -v \ | |
--progress-bar=off \ | |
--index-url https://test.pypi.org/simple/ \ | |
--extra-index-url https://pypi.org/simple/ \ | |
"sisl[test,viz]==${{ env.SISL_VERSION }}" \ | |
"numpy==1.21.*" "scipy==1.6.*" "xarray==0.21.*" | |
- name: Install sisl + dependencies (arm) | |
if: matrix.os == 'macos-14' | |
run: | | |
python -m pip install -v \ | |
--progress-bar=off \ | |
--index-url https://test.pypi.org/simple/ \ | |
--extra-index-url https://pypi.org/simple/ \ | |
"sisl[test,viz]==${{ env.SISL_VERSION }}" | |
- name: sisl debug info | |
run: | | |
python -c 'from sisl._debug_info import * ; print_debug_info()' | |
- name: Test the installation | |
run: | | |
pytest --pyargs sisl | |
# Upload to PyPI on every tag | |
upload_pypi: | |
needs: [test_testpypi] | |
name: Publish package to Pypi | |
runs-on: ubuntu-latest | |
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') | |
# 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@v4 | |
with: | |
pattern: cibw-* | |
path: dist | |
merge-multiple: True | |
- uses: pypa/[email protected] | |
with: | |
user: __token__ | |
password: ${{ secrets.PYPI_TOKEN }} |