Wheels #409
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: Wheels | |
on: | |
workflow_dispatch: | |
schedule: | |
- cron: "0 4 * * *" # every day at 4am UTC | |
release: | |
types: | |
- published | |
env: | |
GEANT4_VERSION: 11.2.2 | |
XERCES_VERSION: 3.2.5 | |
CPP_STANDARD: 17 | |
Geant4_DIR: ${{ github.workspace }}/geant4 | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
jobs: | |
sdist: | |
name: Source distribution | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 | |
- name: Build sdist | |
run: | | |
python -m pip install build | |
python -m build --sdist . | |
- name: Upload sdist | |
uses: actions/upload-artifact@v4 | |
with: | |
name: dist | |
path: dist/*.tar.gz | |
wheels: | |
name: | |
Build wheel for cp${{ matrix.python }} ${{ matrix.platform_id }} ${{ | |
matrix.manylinux_image }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-latest | |
python: 38 | |
platform_id: manylinux_x86_64 | |
manylinux_image: manylinux2014 | |
- os: ubuntu-latest | |
python: 39 | |
platform_id: manylinux_x86_64 | |
manylinux_image: manylinux2014 | |
- os: ubuntu-latest | |
python: 310 | |
platform_id: manylinux_x86_64 | |
manylinux_image: manylinux2014 | |
- os: ubuntu-latest | |
python: 311 | |
platform_id: manylinux_x86_64 | |
manylinux_image: manylinux2014 | |
- os: ubuntu-latest | |
python: 312 | |
platform_id: manylinux_x86_64 | |
manylinux_image: manylinux2014 | |
- os: macos-latest | |
python: 38 | |
platform_id: macosx_x86_64 | |
- os: macos-latest | |
python: 39 | |
platform_id: macosx_x86_64 | |
- os: macos-latest | |
python: 310 | |
platform_id: macosx_x86_64 | |
- os: macos-latest | |
python: 311 | |
platform_id: macosx_x86_64 | |
- os: macos-latest | |
python: 312 | |
platform_id: macosx_x86_64 | |
- os: macos-latest | |
python: 38 | |
platform_id: macosx_arm64 | |
- os: macos-latest | |
python: 39 | |
platform_id: macosx_arm64 | |
- os: macos-latest | |
python: 310 | |
platform_id: macosx_arm64 | |
- os: macos-latest | |
python: 311 | |
platform_id: macosx_arm64 | |
- os: macos-latest | |
python: 312 | |
platform_id: macosx_arm64 | |
- os: windows-latest | |
python: 38 | |
platform_id: win_amd64 | |
- os: windows-latest | |
python: 39 | |
platform_id: win_amd64 | |
- os: windows-latest | |
python: 310 | |
platform_id: win_amd64 | |
- os: windows-latest | |
python: 311 | |
platform_id: win_amd64 | |
- os: windows-latest | |
python: 312 | |
platform_id: win_amd64 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Setup CMake | |
uses: lukka/get-cmake@v3.30.3 | |
- name: Setup Windows environment variables | |
if: matrix.os == 'windows-latest' | |
shell: bash | |
run: | | |
echo "CMAKE_ARGS=-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded" >> $GITHUB_ENV | |
- name: Setup MacOS environment variables | |
if: matrix.os == 'macos-latest' | |
run: | | |
echo "CMAKE_ARGS=-DCMAKE_OSX_ARCHITECTURES=${{ matrix.platform_id == 'macosx_x86_64' && 'x86_64' || 'arm64' }}" >> $GITHUB_ENV | |
- name: Cache Xerces-C Installation | |
if: matrix.os != 'ubuntu-latest' | |
id: cache-xerces | |
uses: actions/cache@v4 | |
with: | |
path: ${{ github.workspace }}/xerces | |
key: | |
xerces-v${{ env.XERCES_VERSION }}-cpp${{ env.CPP_STANDARD }}-${{ | |
matrix.platform_id }} | |
- name: Build and Install Xerces-C | |
if: | |
steps.cache-xerces.outputs.cache-hit != 'true' && matrix.os != | |
'ubuntu-latest' | |
run: | | |
git clone https://github.com/apache/xerces-c.git xerces-source | |
git -C xerces-source checkout tags/v${{ env.XERCES_VERSION }} | |
cmake -B xerces-build -S xerces-source ${{ env.CMAKE_ARGS }} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/xerces -DCMAKE_CXX_STANDARD=${{ env.CPP_STANDARD }} -DBUILD_SHARED_LIBS=OFF ${{ matrix.os == 'windows-latest' && '-DCMAKE_CXX_FLAGS_RELEASE="/MT"' || '-G Ninja -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -Dnetwork-accessor=socket -Dtranscoder=iconv' }} | |
cmake --build xerces-build --parallel $(nproc) --config Release --target install | |
- name: Cache Geant4 Installation | |
if: matrix.os != 'ubuntu-latest' | |
id: cache-geant4 | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.Geant4_DIR }} | |
key: | |
geant4-v${{ env.GEANT4_VERSION }}-cpp${{ env.CPP_STANDARD }}-${{ | |
matrix.platform_id }} | |
- name: Build and Install Geant4 (without datasets) | |
if: | |
steps.cache-geant4.outputs.cache-hit != 'true' && matrix.os != | |
'ubuntu-latest' | |
run: | | |
git clone https://github.com/Geant4/geant4.git ${{ github.workspace }}/geant4-source --depth 1 --branch v${{ env.GEANT4_VERSION }} | |
cmake -B geant4-build -S geant4-source ${{ env.CMAKE_ARGS }} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${{ env.Geant4_DIR }} -DXERCESC_ROOT_DIR=${{ github.workspace }}/xerces -DCMAKE_CXX_STANDARD=${{ env.CPP_STANDARD }} -DGEANT4_USE_GDML=ON -DGEANT4_INSTALL_EXAMPLES=OFF -DGEANT4_INSTALL_DATA=OFF -DGEANT4_BUILD_TLS_MODEL=global-dynamic -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF ${{ matrix.os == 'windows-latest' && '-DCMAKE_CXX_FLAGS_RELEASE="/MT"' || '-G Ninja -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -DGEANT4_USE_SYSTEM_EXPAT=OFF' }} | |
cmake --build geant4-build --parallel $(nproc) --config Release --target install | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 | |
- name: Build wheel | |
uses: pypa/cibuildwheel@v2.21.2 | |
env: | |
CIBW_TEST_COMMAND: | |
python -m pytest {project}/tests -vv --reruns 10 --reruns-delay 30 | |
--only-rerun "(?i)http|timeout|connection|socket|resolve" | |
CIBW_ENVIRONMENT: > | |
SKLEARN_SKIP_NETWORK_TESTS=1 SKLEARN_BUILD_PARALLEL=3 | |
CIBW_BUILD: cp${{ matrix.python }}-${{ matrix.platform_id }} | |
CIBW_ARCHS: all | |
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux_image }} | |
CIBW_MANYLINUX_I686_IMAGE: ${{ matrix.manylinux_image }} | |
CIBW_TEST_SKIP: "*-macosx_arm64" # test on arm64 is not supported yet | |
CIBW_BEFORE_ALL_LINUX: | | |
python3 -m pip install cmake ninja | |
git clone https://github.com/apache/xerces-c.git /tmp/xerces | |
git -C /tmp/xerces checkout tags/v${{ env.XERCES_VERSION }} | |
cmake -G Ninja -B /tmp/xerces/build -S /tmp/xerces -DCMAKE_CXX_STANDARD=${{ env.CPP_STANDARD }} -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -Dnetwork-accessor=socket -Dtranscoder=iconv -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC | |
cmake --build /tmp/xerces/build --parallel $(nproc) --target install > /dev/null 2>&1 | |
rm -rf /tmp/xerces | |
git clone https://github.com/Geant4/geant4.git /tmp/geant4 --branch=v${{ env.GEANT4_VERSION }} --depth=1 | |
cmake -G Ninja -B /tmp/geant4/build -S /tmp/geant4 -DCMAKE_CXX_STANDARD=${{ env.CPP_STANDARD }} -DCMAKE_BUILD_TYPE=Release -DGEANT4_USE_GDML=ON -DGEANT4_INSTALL_EXAMPLES=OFF -DGEANT4_INSTALL_DATA=OFF -DGEANT4_BUILD_TLS_MODEL=global-dynamic -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_C_FLAGS=-fPIC -DGEANT4_USE_SYSTEM_EXPAT=OFF -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF | |
cmake --build /tmp/geant4/build --parallel $(nproc) --target install > /dev/null 2>&1 | |
rm -rf /tmp/geant4 | |
CIBW_ENVIRONMENT_MACOS: > | |
MACOSX_DEPLOYMENT_TARGET=11.0 ${{ matrix.platform_id == | |
'macosx_arm64' && 'SKIP_PYBIND11_STUBGEN=1' || '' }} | |
- name: Upload wheel | |
uses: actions/upload-artifact@v4 | |
with: | |
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }} | |
path: wheelhouse/*.whl | |
check-wheels-size: | |
name: Check wheels size | |
needs: wheels | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download wheels | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
merge-multiple: true | |
- name: Check wheel size | |
shell: bash | |
run: | | |
ls -lh dist | |
for file in dist/*.whl | |
do | |
size=$(du -m "$file" | cut -f1) | |
if [ "$size" -le 2 ]; then | |
echo "Error: $file is smaller than 2MB" | |
exit 1 | |
else | |
echo "$file is larger than 2MB" | |
fi | |
done | |
upload-pypi: | |
name: Upload wheels to PyPI | |
needs: [sdist, wheels, check-wheels-size] | |
runs-on: ubuntu-latest | |
if: github.event_name == 'release' && github.event.action == 'published' | |
steps: | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.12 | |
- name: Download wheels | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
merge-multiple: true | |
- name: Publish to PyPI | |
uses: pypa/gh-action-pypi-publish@v1.10.2 | |
with: | |
password: ${{ secrets.PYPI_API_TOKEN }} | |
publish-docker: | |
name: Publish Docker image | |
needs: [upload-pypi] | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
packages: write | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Log in to the GitHub Container registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.CONTAINER_REGISTRY_GITHUB_TOKEN }} | |
- name: Build Docker image | |
uses: docker/build-push-action@v6 | |
with: | |
context: . | |
push: false | |
tags: | | |
ghcr.io/lobis/geant4-python-application:latest | |
ghcr.io/lobis/geant4-python-application:${{ github.event.release.tag_name }} | |
labels: | | |
maintainer.name=Luis Antonio Obis Aparicio | |
maintainer.email=luis.antonio.obis@gmail.com | |
org.opencontainers.image.source=${{ github.repository }} | |
- name: Test image | |
run: | | |
docker run --rm ghcr.io/lobis/geant4-python-application:latest -c 'import geant4_python_application; app = geant4_python_application.Application()' | |
- name: Publish | |
run: | | |
docker push ghcr.io/lobis/geant4-python-application:latest |