Build CPython wheels #196
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
# Controls when the workflow will run | |
on: | |
# Run this workflow after the TREXIO CI completed | |
workflow_run: | |
workflows: [ "TREXIO CI" ] | |
branches: [ master ] | |
types: | |
- completed | |
# Workflow to build and publish wheels. | |
# in the get_commit_message job: Include [wheel build] in your commit message to trigger this build. | |
name: Build CPython wheels | |
jobs: | |
get_commit_message: | |
if: ${{ github.event.workflow_run.conclusion == 'success' }} | |
name: Get commit message | |
runs-on: ubuntu-22.04 | |
outputs: | |
message: ${{ steps.commit_message.outputs.message }} | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 | |
# Gets the correct commit message for pull request | |
with: | |
ref: ${{ github.event.pull_request.head.sha }} | |
- name: Get commit message | |
id: commit_message | |
run: | | |
set -xe | |
COMMIT_MSG=$(git log --no-merges -1 --oneline) | |
echo "message=$COMMIT_MSG" >> $GITHUB_OUTPUT | |
echo github.ref ${{ github.ref }} | |
build_macos_wheels: | |
name: build wheels for different versions of cpython on macos | |
needs: get_commit_message | |
if: >- | |
contains(needs.get_commit_message.outputs.message, '[wheel build]') || | |
(github.repository == 'trex-coe/trexio' && startswith(github.ref, 'refs/tags/v')) | |
runs-on: ${{ matrix.buildplat[0] }} | |
env: | |
HDF5_INSTALLDIR: "/Users/runner/work/trexio/trexio/hdf5" | |
strategy: | |
# Ensure that a wheel builder finishes even if another fails | |
fail-fast: false | |
matrix: | |
# Github Actions doesn't support pairing matrix values together, let's improvise | |
# https://github.com/github/feedback/discussions/7835#discussioncomment-1769026 | |
buildplat: | |
- [macos-13, macosx_x86_64] | |
- [macos-14, macosx_arm64] | |
# test config | |
python: ["cp38", "cp39", "cp310", "cp311", "cp312"] | |
exclude: | |
- buildplat: [macos-14, macosx_arm64] | |
python: "cp38" | |
steps: | |
- uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791 | |
- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 | |
with: | |
python-version: "3.x" | |
- name: install dependencies | |
run: | | |
brew install emacs | |
brew install automake | |
brew install libtool | |
brew install swig | |
- uses: actions/cache@v3 | |
id: cache-hdf5 | |
with: | |
path: $HDF5_INSTALLDIR | |
key: ${{ matrix.buildplat[0] }}-hdf5 | |
- name: install hdf5 | |
if: ${{ steps.cache-hdf5.outputs.cache-hit != 'true' }} | |
run: | | |
wget https://github.com/HDFGroup/hdf5/archive/refs/tags/hdf5-1_12_3.tar.gz | |
tar -xzf hdf5-1_12_3.tar.gz | |
cd hdf5-hdf5-1_12_3 | |
if [[ "$ARCH" == "arm64" ]]; then | |
export MACOSX_DEPLOYMENT_TARGET="11.0" | |
else | |
export MACOSX_DEPLOYMENT_TARGET="10.9" | |
fi | |
./autogen.sh | |
./configure CC=gcc-12 --prefix $HDF5_INSTALLDIR --enable-build-mode=production --with-szlib | |
make -j3 | |
make install | |
- name: configure with autotools | |
run: | | |
./autogen.sh | |
export PATH=${PATH}:${HDF5_INSTALLDIR}/bin | |
./configure FC=gfortran-12 --enable-silent-rules | |
make -j3 | |
- name: prepare python | |
run: | | |
make python-install | |
- name: cleanup python | |
run: | | |
rm -rf src/ tools/ | |
mv python/* . | |
- name: Build wheels | |
uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad # v2.20.0 | |
env: | |
CIBW_PRERELEASE_PYTHONS: False | |
CIBW_FREE_THREADED_SUPPORT: False | |
CIBW_BUILD: ${{ matrix.python }}-${{ matrix.buildplat[1] }} | |
CIBW_BUILD_VERBOSITY: 1 | |
CIBW_BUILD_FRONTEND: "build" | |
CIBW_ENVIRONMENT: H5_CFLAGS="-I/Users/runner/work/trexio/trexio/hdf5/include" H5_LDFLAGS="-L/Users/runner/work/trexio/trexio/hdf5/lib" | |
# disable pytest-ing for now - does not work as expected via CIBW on MacOS --> Ask Anthony to test locally | |
#CIBW_TEST_REQUIRES: pytest | |
#CIBW_TEST_COMMAND: "python3 -m pytest -v test/test_api.py" | |
- uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 | |
with: | |
name: pytrexio-${{ matrix.python }}-${{ matrix.buildplat[1] }}-wheels | |
path: ./wheelhouse/*.whl | |
build_linux_wheels: | |
name: build wheels for different versions of cpython on manylinux_x86_64 | |
needs: get_commit_message | |
if: >- | |
contains(needs.get_commit_message.outputs.message, '[wheel build]') || | |
(github.repository == 'trex-coe/trexio' && startswith(github.ref, 'refs/tags/v')) | |
runs-on: ubuntu-22.04 | |
strategy: | |
matrix: | |
manylinux_tag: [2014_x86_64, 2_28_x86_64] | |
steps: | |
- name: Checkout the branch | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 | |
- name: Set up Python | |
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f | |
with: | |
python-version: '3.10' | |
- name: Install build dependencies | |
run: python -m pip install -U setuptools | |
- name: Compute the PYTREXIO_VERSION environment variable | |
run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\ -f3 | tr -d '"')" >> $GITHUB_ENV | |
- name: Print the PYTREXIO_VERSION | |
run: echo ${{ env.PYTREXIO_VERSION }} | |
# Conventional download-artifact action does not work for artifact produced in a different workflow, | |
# which is the case here (TREXIO CI produced the Python API distribution tarball) | |
- name: Download the Python API distribution tarball | |
uses: dawidd6/action-download-artifact@v2 | |
with: | |
# Specify the name of the workflow file which uploaded the tarball | |
workflow: actions.yml | |
workflow_conclusion: success | |
name: pytrexio-source | |
path: python | |
# at the moment we have to pull the custom container with pre-installed HDF5 | |
# the containers are built and stored in GitHub container registry ghcr.io/q-posev | |
- name: Pull the manylinux Docker container with HDF5 | |
run: docker pull ghcr.io/q-posev/hdf5_1_12_on_${{ matrix.manylinux_tag }}:latest | |
- name: Build wheels for different versions of CPython inside the Docker container | |
run: > | |
docker run --rm | |
--env PLAT=manylinux${{ matrix.manylinux_tag }} | |
--volume `pwd`:/tmp | |
--workdir /tmp | |
ghcr.io/q-posev/hdf5_1_12_on_${{ matrix.manylinux_tag }} | |
/bin/bash build_manylinux_wheels.sh trexio-${{ env.PYTREXIO_VERSION }}.tar.gz | |
working-directory: python | |
- name: Upload produced wheels as artifacts | |
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 | |
with: | |
name: pytrexio-manylinux-${{ matrix.manylinux_tag }}-wheels | |
path: ./python/wheelhouse/*.whl | |
publish_wheels: | |
name: Publish all wheels on PyPI | |
needs: [build_linux_wheels, build_macos_wheels] | |
runs-on: ubuntu-22.04 | |
permissions: | |
# IMPORTANT: this permission is mandatory for trusted publishing | |
id-token: write | |
steps: | |
- name: Checkout the branch | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 | |
- name: Set up Python | |
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f | |
with: | |
python-version: '3.10' | |
- name: Install build dependencies | |
run: python -m pip install -U setuptools twine | |
- name: Download the build artifacts (wheels) of this workflow | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: Download the Python API distribution tarball | |
uses: dawidd6/action-download-artifact@v2 | |
with: | |
workflow: actions.yml | |
workflow_conclusion: success | |
name: pytrexio-source | |
path: dist | |
# The artifacts have to be in dist/ directory so that | |
# pypa/gh-action-pypi-publish action can discover them | |
- name: Display and rearrange the downloaded artifacts | |
run: | | |
ls -R | |
mv pytrexio-*-wheels/trexio-*.whl ./ | |
rm -rf -- pytrexio-*-wheels/ | |
ls -sh -w 1 | |
working-directory: dist | |
#- name: Publish distribution 📦 to Test PyPI | |
# uses: pypa/gh-action-pypi-publish@release/v1 | |
# with: | |
# repository_url: https://test.pypi.org/legacy/ | |
# verbose: true | |
# ##verify-metadata: false | |
- name: Publish distribution 📦 to PyPI | |
uses: pypa/gh-action-pypi-publish@release/v1 | |
##if: startsWith(github.ref, 'refs/tags') |