Skip to content

Build and Release dlib Wheels Parallel #1

Build and Release dlib Wheels Parallel

Build and Release dlib Wheels Parallel #1

name: Build and Release dlib Wheels Parallel
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
create_release:
description: 'Create a release'
required: false
type: boolean
default: false
jobs:
build-x86_64:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12']
timeout-minutes: 60
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install system dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends \
build-essential cmake libboost-dev libopenblas-dev liblapack-dev \
libx11-dev libgtk-3-dev libjpeg-dev libpng-dev libtiff-dev \
libatlas-base-dev pkg-config
- name: Install Python build tools
run: |
python -m pip install --upgrade pip
pip install build wheel setuptools auditwheel
- name: Clone dlib
run: |
git clone --depth 1 https://github.com/davisking/dlib.git dlib_src
- name: Build wheel
run: |
cd dlib_src
python setup.py bdist_wheel
if [ ! -f dist/*.whl ]; then
echo "Wheel build failed - no wheel found in dist/"
ls -la dist/ || echo "dist/ directory not found"
exit 1
fi
- name: Repair wheel (manylinux)
run: |
cd dlib_src
mkdir -p dist_repaired/
auditwheel repair dist/*.whl -w dist_repaired/ || cp dist/*.whl dist_repaired/
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: dlib-py${{ matrix.python-version }}-linux-x86_64
path: dlib_src/dist_repaired/*.whl
retention-days: 30
build-aarch64:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12']
timeout-minutes: 180
continue-on-error: true
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Build wheel in Docker
run: |
docker run --rm --platform linux/arm64 \
-v ${{ github.workspace }}:/workspace \
-w /workspace \
quay.io/pypa/manylinux2014_aarch64 \
bash -c '
export PYTHON_VERSION=${{ matrix.python-version }}
# Install system dependencies
yum install -y \
cmake3 boost-devel openblas-devel lapack-devel \
libX11-devel \
libpng-devel libjpeg-devel libtiff-devel git \
gcc gcc-c++ make atlas-devel
# Set up Python based on version
if [ "$PYTHON_VERSION" = "3.10" ]; then
PYBIN=/opt/python/cp310-cp310/bin
elif [ "$PYTHON_VERSION" = "3.11" ]; then
PYBIN=/opt/python/cp311-cp311/bin
elif [ "$PYTHON_VERSION" = "3.12" ]; then
PYBIN=/opt/python/cp312-cp312/bin
else
echo "Unsupported Python version: $PYTHON_VERSION"
exit 1
fi
$PYBIN/pip install --upgrade pip wheel setuptools auditwheel
# Clone dlib master
git clone --depth 1 https://github.com/davisking/dlib.git dlib_src
cd dlib_src
# Reduce optimization for faster builds
export CXXFLAGS="-O2 -g0"
# Build wheel
$PYBIN/python setup.py bdist_wheel
# Create output directory and repair wheel
mkdir -p /workspace/dist_final/
if [ -f dist/*.whl ]; then
$PYBIN/auditwheel repair dist/*.whl -w /workspace/dist_final/
else
echo "No wheel found to repair"
ls -la dist/
exit 1
fi
'
- name: Upload build artifact
uses: actions/upload-artifact@v4
if: success()
with:
name: dlib-py${{ matrix.python-version }}-linux-aarch64
path: dist_final/*.whl
retention-days: 30
release:
runs-on: ubuntu-latest
needs: [build-x86_64, build-aarch64]
if: always() && (startsWith(github.ref, 'refs/tags/') || github.event.inputs.create_release == 'true') && needs.build-x86_64.result == 'success'
permissions:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts/
- name: Prepare wheels
run: |
mkdir -p wheels
find artifacts -name "*.whl" -exec cp {} wheels/ \;
echo "Built wheels:"
ls -lh wheels/
# Count wheels by architecture
x86_count=$(find wheels -name "*x86_64*.whl" | wc -l)
aarch64_count=$(find wheels -name "*aarch64*.whl" | wc -l)
echo "x86_64 wheels: $x86_count"
echo "aarch64 wheels: $aarch64_count"
- name: Create Release
uses: softprops/action-gh-release@v2
with:
name: Release ${{ github.event.inputs.create_release == 'true' && format('Manual Release {0}', github.run_number) || github.ref_name }}
tag_name: ${{ github.event.inputs.create_release == 'true' && format('manual-{0}', github.run_number) || github.ref_name }}
body: |
Prebuilt dlib wheels for Linux (x86_64 and aarch64) on Python 3.10, 3.11, and 3.12
**Installation:**
```pip install dlib-*.whl```
Choose the wheel that matches your:
- Python version (cp310, cp311, or cp312)
- Architecture (x86_64 or aarch64)
Note: aarch64 wheels may not be available if builds timed out.
files: wheels/*.whl
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}