Build and publish package to PyPI #31
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: Build and publish package to PyPI | |
on: | |
release: | |
types: [published] | |
schedule: | |
# Run at 10 am UTC on day-of-month 1 and 15. | |
- cron: "0 10 1,15 * *" | |
workflow_dispatch: | |
inputs: | |
target: | |
description: 'Deployment target. Can be "pypi" or "testpypi", or left blank to skip deployment.' | |
default: "testpypi" | |
debug_enabled: | |
type: boolean | |
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' | |
required: false | |
default: false | |
# Set options available for all jobs that use cibuildwheel | |
env: | |
# Increase pip debugging output, equivalent to `pip -vv` | |
CIBW_BUILD_VERBOSITY: 2 | |
# Disable build isolation to allow pre-installing build-time dependencies | |
CIBW_BUILD_FRONTEND: "pip; args: --no-build-isolation" | |
CIBW_SKIP: "pp* *musllinux*" | |
FORCE_COLOR: 3 | |
jobs: | |
build_windows_wheels: | |
name: Build wheels on windows-latest | |
runs-on: windows-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: 3.8 | |
- name: Clone pybind11 repo (no history) | |
run: git clone --depth 1 --branch v2.11.1 https://github.com/pybind/pybind11.git | |
- name: Install vcpkg on Windows | |
run: | | |
cd C:\ | |
rm -r -fo 'C:\vcpkg' | |
git clone https://github.com/microsoft/vcpkg | |
cd vcpkg | |
.\bootstrap-vcpkg.bat | |
- name: Cache packages installed through vcpkg on Windows | |
uses: actions/cache@v3 | |
env: | |
cache-name: vckpg_binary_cache | |
with: | |
path: C:\Users\runneradmin\AppData\Local\vcpkg\archives | |
key: ${{ runner.os }}-build-VS2022-${{ env.cache-name }}-${{ hashFiles('vcpkg*.json') }} | |
# Enable tmate debugging of manually-triggered workflows if the input option was provided | |
- name: Setup tmate session | |
uses: mxschmitt/action-tmate@v3 | |
if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} | |
- name: Build 64-bit wheels on Windows | |
run: pipx run cibuildwheel --output-dir wheelhouse | |
env: | |
CIBW_ENVIRONMENT: 'PYBAMM_USE_VCPKG=ON VCPKG_ROOT_DIR=C:\vcpkg VCPKG_DEFAULT_TRIPLET=x64-windows-static-md VCPKG_FEATURE_FLAGS=manifests,registries CMAKE_GENERATOR="Visual Studio 17 2022" CMAKE_GENERATOR_PLATFORM=x64' | |
CIBW_ARCHS: "AMD64" | |
CIBW_BEFORE_BUILD: python -m pip install setuptools wheel | |
- name: Upload Windows wheels | |
uses: actions/upload-artifact@v3 | |
with: | |
name: windows_wheels | |
path: ./wheelhouse/*.whl | |
if-no-files-found: error | |
build_macos_and_linux_wheels: | |
name: Wheels (${{ matrix.os }} / ${{ matrix.arch }}) | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, macos-latest] | |
arch: [x86_64, aarch64] | |
# build just amd64/x86_64 on macOS until we can get cross-compilation to arm64 working. | |
exclude: | |
- os: macos-latest | |
arch: aarch64 | |
steps: | |
- uses: actions/checkout@v4 | |
name: Check out PyBaMM repository | |
- name: Set up QEMU | |
if: matrix.os == 'ubuntu-latest' && matrix.arch == 'aarch64' | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: arm64 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: 3.8 | |
- name: Clone pybind11 repo (no history) | |
run: git clone --depth 1 --branch v2.11.1 https://github.com/pybind/pybind11.git | |
# sometimes gfortran cannot be found, so reinstall gcc just to be sure | |
- name: Install SuiteSparse and SUNDIALS on macOS | |
if: matrix.os == 'macos-latest' | |
run: | | |
brew install graphviz openblas libomp | |
brew reinstall gcc | |
python -m pip install cmake wget | |
python scripts/install_KLU_Sundials.py | |
- name: Build Linux aarch64 wheels | |
run: pipx run cibuildwheel --output-dir wheelhouse | |
if: matrix.os == 'ubuntu-latest' && matrix.arch == 'aarch64' | |
env: | |
# on aarch64/arm64, add EPEL to repolist and install openblas-devel from there | |
CIBW_ARCHS_LINUX: aarch64 | |
CIBW_BEFORE_ALL_LINUX: > | |
yum -y install epel-release && | |
yum -y install openblas-devel lapack-devel && | |
bash scripts/install_sundials.sh 6.0.3 6.5.0 | |
CIBW_BEFORE_BUILD_LINUX: python -m pip install cmake casadi setuptools wheel | |
CIBW_REPAIR_WHEEL_COMMAND_LINUX: auditwheel repair -w {dest_dir} {wheel} | |
# Skip test on aarch64/arm64 for now, see https://github.com/casadi/casadi/issues/2887 | |
# CIBW_TEST_COMMAND: python -c "import pybamm; print(pybamm.have_idaklu())" | grep True | |
- name: Build Linux x86_64 wheels | |
run: pipx run cibuildwheel --output-dir wheelhouse | |
if: matrix.os == 'ubuntu-latest' && matrix.arch == 'x86_64' | |
env: | |
CIBW_ARCHS_LINUX: x86_64 | |
CIBW_BEFORE_ALL_LINUX: > | |
yum -y install openblas-devel lapack-devel && | |
bash scripts/install_sundials.sh 6.0.3 6.5.0 | |
CIBW_BEFORE_BUILD_LINUX: python -m pip install cmake casadi setuptools wheel | |
CIBW_REPAIR_WHEEL_COMMAND_LINUX: auditwheel repair -w {dest_dir} {wheel} | |
CIBW_TEST_COMMAND: python -c "import pybamm; print(pybamm.have_idaklu())" | grep True | |
- name: Build macOS wheels for ${{ matrix.arch }} | |
if: matrix.os == 'macos-latest' | |
run: pipx run cibuildwheel --output-dir wheelhouse | |
env: | |
CIBW_BEFORE_BUILD_MACOS: > | |
python -m pip install --upgrade cmake casadi setuptools wheel && | |
scripts/fix_suitesparse_rpath_mac.sh | |
CIBW_REPAIR_WHEEL_COMMAND_MACOS: delocate-listdeps {wheel} && delocate-wheel -v -w {dest_dir} {wheel} | |
CIBW_TEST_COMMAND: python -c "import pybamm; print(pybamm.have_idaklu())" | grep True | |
- name: Upload wheels | |
uses: actions/upload-artifact@v3 | |
with: | |
name: macos_linux_wheels | |
path: ./wheelhouse/*.whl | |
if-no-files-found: error | |
build_sdist: | |
name: Build SDist | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: 3.11 | |
- name: Build SDist | |
run: pipx run build --sdist | |
- name: Upload SDist | |
uses: actions/upload-artifact@v3 | |
with: | |
name: sdist | |
path: ./dist/*.tar.gz | |
if-no-files-found: error | |
publish_pypi: | |
if: github.event_name != 'schedule' && inputs.target != '' | |
name: Upload package to PyPI | |
needs: [build_macos_and_linux_wheels, build_windows_wheels, build_sdist] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download all artifacts | |
uses: actions/download-artifact@v3 | |
- name: Move all package files to files/ | |
run: | | |
mkdir files | |
mv windows_wheels/* macos_linux_wheels/* sdist/* files/ | |
- name: Publish on PyPI | |
if: github.event.inputs.target == 'pypi' || github.event_name == 'release' | |
uses: pypa/gh-action-pypi-publish@release/v1 | |
with: | |
user: __token__ | |
password: ${{ secrets.PYPI_TOKEN }} | |
packages-dir: files/ | |
- name: Publish on TestPyPI | |
if: github.event.inputs.target == 'testpypi' | |
uses: pypa/gh-action-pypi-publish@release/v1 | |
with: | |
user: __token__ | |
password: ${{ secrets.TESTPYPI_TOKEN }} | |
packages-dir: files/ | |
repository-url: https://test.pypi.org/legacy/ | |
open_failure_issue: | |
needs: [build_windows_wheels, build_macos_and_linux_wheels, build_sdist] | |
name: Open an issue if build fails | |
if: ${{ always() && contains(needs.*.result, 'failure') }} | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: JasonEtco/create-an-issue@v2 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
LOGS: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
with: | |
filename: .github/wheel_failure.md |