Skip to content

Build & Publish Python Package #7

Build & Publish Python Package

Build & Publish Python Package #7

Workflow file for this run

name: Build & Publish Python Package
on:
release:
types: [created]
# Only trigger for regular releases, not pre-releases
# See https://docs.github.com/en/actions/reference/events-that-trigger-workflows#release
# for more information on the release event
prerelease: false
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
# 1.a Buidl the wheels on a matrix of Windows, MacOS, and Linux platforms using cibuildwheel
build_wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@v3
############################# LINUX WHEELS #############################
# In case of Linux we need to install compiler and build tools before building the wheels
# We further only build the manylinux wheels, but not the musllinux wheels
- name: Build wheels (Linux)
uses: pypa/[email protected]
env:
CIBW_BEFORE_BUILD: yum makecache && yum install -y gcc-c++ cmake && pip install ninja
CIBW_BUILD: "*manylinux*"
CIBW_ARCHS_LINUX: "x86_64 aarch64"
CIBW_TEST_COMMAND: 'python -c "import polyhedral_gravity"'
with:
package-dir: .
output-dir: dist
if: matrix.os == 'ubuntu-latest'
############################# MACOS WHEELS #############################
# Building on macOS requires an installation of gcc since the default clang compiler
# lacks certain features required for building the package
- name: Build wheels (macOS)
uses: pypa/[email protected]
env:
CIBW_BEFORE_BUILD: brew install ninja gcc@12
CIBW_ENVIRONMENT: "CC=gcc-12 CXX=g++-12"
CIBW_ARCHS_MACOS: "x86_64 arm64"
CIBW_TEST_COMMAND: 'python -c "import polyhedral_gravity"'
with:
package-dir: .
output-dir: dist
if: matrix.os == 'macos-latest'
############################# WINDOWS WHEELS #############################
# Set up the Visual Studio environment on Windows (required, so that CMake finds the compiler)
- uses: ilammy/msvc-dev-cmd@v1
if: matrix.os == 'windows-latest'
- name: Build wheels (Windows)
uses: pypa/[email protected]
env:
CIBW_BEFORE_BUILD: choco install -y ninja cmake
CIBW_ARCHS_WINDOWS: "auto64"
CIBW_TEST_COMMAND: 'python -c "import polyhedral_gravity"'
with:
package-dir: .
output-dir: dist
if: matrix.os == 'windows-latest'
- uses: actions/upload-artifact@v3
with:
path: dist/*.whl
# 1.b Build the source distribution by simply running the build command
make_sdist:
name: Make SDist
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build SDist
run: pipx run build --sdist
- uses: actions/upload-artifact@v3
with:
path: dist/*.tar.gz
# 2. Upload the wheels and the source distribution to testpypi
# using trusted publishing
upload_testpypi:
needs: [build_wheels, make_sdist]
environment:
name: testpypi
url: https://test.pypi.org/p/polyhedral-gravity
permissions:
id-token: write
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v3
with:
name: artifact
path: dist
- uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/
# 3. Check if the package can be installed from testpypi
# Notice, that this is more of an installation test since the
# import check has already been done in the build_wheels job
check_testpypi:
needs: [upload_testpypi]
name: Test import on ${{ matrix.os }} with ${{ matrix.py }}
runs-on: ${{ matrix.os }}
if: always()
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
py:
[
3.7.x,
3.8.x,
3.9.x,
3.10.x,
3.11.x,
3.12.x,
pypy3.7,
pypy3.8,
pypy3.9,
pypy3.10,
]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.py }}
- name: Install package from testpypi
run: pip install --index-url https://test.pypi.org/simple/ polyhedral-gravity
- name: Check import
run: python -c "import polyhedral_gravity"
# 4. Upload the wheels to the actually Python Package Index
# using trusted publishing
upload_pypi:
needs: [build_wheels, make_sdist, check_testpypi]
environment:
name: pypi
url: https://pypi.org/p/polyhedral-gravity
permissions:
id-token: write
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v3
with:
name: artifact
path: dist
- uses: pypa/gh-action-pypi-publish@release/v1