Wheel creation #35
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: | |
branch: | |
description: 'Which branch to build wheels for' | |
required: false | |
default: 'main' | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
jobs: | |
# Build all the wheels with pypa/cibuildwheels | |
build_wheels_linux: | |
name: Linux wheel cp${{ matrix.python }}-${{ matrix.platform_id }}-${{ matrix.manylinux_image }} | |
runs-on: ${{ matrix.os }} | |
# 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 | |
strategy: | |
# If one of the jobs fails, continue with the others. | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest] | |
platform_id: [manylinux_x86_64] | |
manylinux_image: [manylinux2010, manylinux2014] | |
python: [38, 39, 310, 311] | |
exclude: | |
- python: 310 | |
manylinux_image: manylinux2010 | |
- python: 311 | |
manylinux_image: manylinux2010 | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
submodules: false | |
# Setup the fortran compiler. This is aware of the operating system. | |
- uses: awvwgk/setup-fortran@main | |
id: setup-fortran | |
with: | |
compiler: gcc | |
version: 11 | |
# We use the cibuildwheel action to take care of everything | |
- name: Build wheels | |
uses: pypa/[email protected] | |
env: | |
CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.platform_id }} | |
# The rest of options are specified at pyproject.toml | |
# Upload the wheel to the action's articfact. | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_wheels_macos: | |
name: MacOS wheel cp${{ matrix.python }}-${{ matrix.platform_id }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
# If one of the jobs fails, continue with the others. | |
fail-fast: false | |
matrix: | |
os: [macos-latest] | |
platform_id: [macosx_x86_64, macosx_arm64] | |
python: [38, 39, 310, 311] | |
include: | |
- platform_id: macosx_arm64 | |
env: | |
PYTHON_CROSSENV: 1 | |
MACOSX_DEPLOYMENT_TARGET: 12.0 | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
submodules: false | |
# Setup the fortran compiler. This is aware of the operating system. | |
- uses: awvwgk/setup-fortran@main | |
id: setup-fortran | |
with: | |
compiler: gcc | |
version: 11 | |
# We use the cibuildwheel action to take care of everything | |
- name: Build wheels | |
uses: pypa/[email protected] | |
env: | |
CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.platform_id }} | |
CIBW_TEST_SKIP: "*-macosx_arm64 *-macosx_universal2:arm64" | |
# The rest of options are specified at pyproject.toml | |
# Upload the wheel to the action's articfact. | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
# Build the source distribution as well | |
build_sdist: | |
name: Build source distribution | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
submodules: false | |
- name: Build sdist | |
run: pipx run build --sdist | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: dist/*.tar.gz | |
# Upload to testpypi | |
upload_testpypi: | |
needs: [build_sdist, build_wheels_linux, build_wheels_macos] | |
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') | |
name: Publish package to TestPyPI | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: artifact | |
path: 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-latest] | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: artifact | |
path: dist | |
- name: Python installation | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.8" | |
# We should also wait for index to update on remote server | |
- name: Install sisl + dependencies | |
run: | | |
sleep 10 | |
version=${GITHUB_REF#refs/*/v} | |
version=${version#refs/*/} | |
python -m pip install --progress-bar=off --find-links dist --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ sisl[test]==${version} | |
- 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@v3 | |
with: | |
name: artifact | |
path: dist | |
- uses: pypa/[email protected] | |
with: | |
user: __token__ | |
password: ${{ secrets.PYPI_TOKEN }} |